From a283c0e03ef3f5822e451a5a7b079cec00d372e3 Mon Sep 17 00:00:00 2001 From: Xuyuan Pang Date: Mon, 1 Sep 2014 16:25:27 +0800 Subject: [PATCH 01/48] fix #363 --- lib/nerdtree/creator.vim | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/nerdtree/creator.vim b/lib/nerdtree/creator.vim index 86f951a..ee3a199 100644 --- a/lib/nerdtree/creator.vim +++ b/lib/nerdtree/creator.vim @@ -43,6 +43,10 @@ endfunction function! s:Creator.createPrimary(name) let path = self._pathForString(a:name) + if path == 0 + return + endif + "if instructed to, then change the vim CWD to the dir the NERDTree is "inited in if g:NERDTreeChDirMode != 0 From 8e06723c04ac2bf2d4b28a7ccffb0798dea0659e Mon Sep 17 00:00:00 2001 From: Xuyuan Pang Date: Mon, 1 Sep 2014 16:25:27 +0800 Subject: [PATCH 02/48] fix #363 --- lib/nerdtree/creator.vim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/nerdtree/creator.vim b/lib/nerdtree/creator.vim index 86f951a..2c56b11 100644 --- a/lib/nerdtree/creator.vim +++ b/lib/nerdtree/creator.vim @@ -43,6 +43,10 @@ endfunction function! s:Creator.createPrimary(name) let path = self._pathForString(a:name) + if path == {} + return + endif + "if instructed to, then change the vim CWD to the dir the NERDTree is "inited in if g:NERDTreeChDirMode != 0 @@ -240,7 +244,7 @@ function! s:Creator._pathForString(str) let path = g:NERDTreePath.New(dir) catch /^NERDTree.InvalidArgumentsError/ call nerdtree#echo("No bookmark or directory found for: " . a:str) - return + return {} endtry endif if !path.isDirectory From 2fd0aa3ec79556cef1507abca259ecf76fb570f3 Mon Sep 17 00:00:00 2001 From: Artem Baguinski Date: Thu, 25 Sep 2014 11:08:53 +0200 Subject: [PATCH 03/48] Fix reloading renamed file --- nerdtree_plugin/fs_menu.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nerdtree_plugin/fs_menu.vim b/nerdtree_plugin/fs_menu.vim index 4e03f35..7e12c04 100644 --- a/nerdtree_plugin/fs_menu.vim +++ b/nerdtree_plugin/fs_menu.vim @@ -24,7 +24,7 @@ call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callbac call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'}) call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'}) -if has("gui_mac") || has("gui_macvim") +if has("gui_mac") || has("gui_macvim") call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'}) call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'}) call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'}) @@ -86,10 +86,10 @@ function! s:promptToRenameBuffer(bufnum, msg, newFileName) " 1. ensure that a new buffer is loaded exec "badd " . quotedFileName " 2. ensure that all windows which display the just deleted filename - " display a buffer for a new filename. + " display a buffer for a new filename. let s:originalTabNumber = tabpagenr() let s:originalWindowNumber = winnr() - exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec \":e! " . quotedFileName . "\" | endif" + exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec \":e! " . a:newFileName . "\" | endif" exec "tabnext " . s:originalTabNumber exec s:originalWindowNumber . "wincmd w" " 3. We don't need a previous buffer anymore From cd8d87fa5734eeaa5d8ac7e33d4c9c33de16db51 Mon Sep 17 00:00:00 2001 From: mixvin Date: Sun, 10 Feb 2013 13:52:23 +0400 Subject: [PATCH 04/48] Fix opening file path, in Windows --- lib/nerdtree/path.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 5de1dfe..4cdf1a3 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -658,6 +658,7 @@ function! s:Path._strForEdit() "return a relative path if we can let isRelative = 0 if nerdtree#runningWindows() + let p = self.str() let isRelative = stridx(tolower(p), tolower(cwd)) == 0 else let isRelative = stridx(p, cwd) == 0 From 1c08146224885004be1009b50ca6da5d4337cc90 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Wed, 29 Oct 2014 11:20:58 +0000 Subject: [PATCH 05/48] apply @mixvin's windows path fix at the top of the method instead --- lib/nerdtree/path.vim | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 4cdf1a3..00fc7ae 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -652,13 +652,12 @@ endfunction "Return: the string for this path that is suitable to be used with the :edit "command function! s:Path._strForEdit() - let p = escape(self.str({'format': 'UI'}), self._escChars()) + let p = escape(self.str(), self._escChars()) let cwd = getcwd() . s:Path.Slash() "return a relative path if we can let isRelative = 0 if nerdtree#runningWindows() - let p = self.str() let isRelative = stridx(tolower(p), tolower(cwd)) == 0 else let isRelative = stridx(p, cwd) == 0 From 3ce33f017ebf8da773b03f1cc9dfd6fb34c7f1d2 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Wed, 29 Oct 2014 18:35:53 +0000 Subject: [PATCH 06/48] fix escaping for `:edit` when renaming files --- nerdtree_plugin/fs_menu.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nerdtree_plugin/fs_menu.vim b/nerdtree_plugin/fs_menu.vim index 7e12c04..e99a85b 100644 --- a/nerdtree_plugin/fs_menu.vim +++ b/nerdtree_plugin/fs_menu.vim @@ -89,7 +89,8 @@ function! s:promptToRenameBuffer(bufnum, msg, newFileName) " display a buffer for a new filename. let s:originalTabNumber = tabpagenr() let s:originalWindowNumber = winnr() - exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec \":e! " . a:newFileName . "\" | endif" + let editStr = g:NERDTreePath.New(a:newFileName).str({'format': 'Edit'}) + exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':e! " . editStr . "' | endif" exec "tabnext " . s:originalTabNumber exec s:originalWindowNumber . "wincmd w" " 3. We don't need a previous buffer anymore From 3d421b8ec5147ab46d708582290f257f0155d797 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Wed, 29 Oct 2014 19:18:28 +0000 Subject: [PATCH 07/48] use the built in fnamemodify() to make a path relative Closes #383 --- lib/nerdtree/path.vim | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 00fc7ae..ea6aa03 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -653,24 +653,14 @@ endfunction "command function! s:Path._strForEdit() let p = escape(self.str(), self._escChars()) - let cwd = getcwd() . s:Path.Slash() - "return a relative path if we can - let isRelative = 0 - if nerdtree#runningWindows() - let isRelative = stridx(tolower(p), tolower(cwd)) == 0 - else - let isRelative = stridx(p, cwd) == 0 - endif + "make it relative + let p = fnamemodify(p, ':.') - if isRelative - let p = strpart(p, strlen(cwd)) - - "handle the edge case where the file begins with a + (vim interprets - "the +foo in `:e +foo` as an option to :edit) - if p[0] == "+" - let p = '\' . p - endif + "handle the edge case where the file begins with a + (vim interprets + "the +foo in `:e +foo` as an option to :edit) + if p[0] == "+" + let p = '\' . p endif if p ==# '' From a895a53f1fa1b6eec4a9600dea639dada1baf31f Mon Sep 17 00:00:00 2001 From: Alex Zhang Date: Wed, 29 Oct 2014 20:00:36 -0400 Subject: [PATCH 08/48] easier to read one of the FAQ answers added space between vimrc insertion & question --- README.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 9dacf68..4234b54 100644 --- a/README.markdown +++ b/README.markdown @@ -87,7 +87,9 @@ A. Stick this in your vimrc __Q. How can I map a specific key or shortcut to open NERDTree?__ -A. Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever key you want): `map :NERDTreeToggle` +A. Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever key you want): + +`map :NERDTreeToggle` __Q. How can I close vim if the only window left open is a NERDTree?__ From ba2604474632ebcbf014baaffb026194556c3476 Mon Sep 17 00:00:00 2001 From: Giacomo Comitti Date: Thu, 20 Nov 2014 07:50:47 +0100 Subject: [PATCH 09/48] Truncate paths at slashes. --- lib/nerdtree/path.vim | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index ea6aa03..dbecb02 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -623,8 +623,13 @@ function! s:Path.str(...) if has_key(options, 'truncateTo') let limit = options['truncateTo'] - if len(toReturn) > limit - let toReturn = "<" . strpart(toReturn, len(toReturn) - limit + 1) + if len(toReturn) > limit-1 + let toReturn = toReturn[(len(toReturn)-limit+1):] + if len(split(toReturn, '/')) > 1 + let toReturn = ' Date: Sun, 21 Dec 2014 17:44:41 +0000 Subject: [PATCH 10/48] Return early if exception was thrown in pathForString --- lib/nerdtree/creator.vim | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/nerdtree/creator.vim b/lib/nerdtree/creator.vim index 86f951a..0697759 100644 --- a/lib/nerdtree/creator.vim +++ b/lib/nerdtree/creator.vim @@ -42,6 +42,11 @@ endfunction "name: the name of a bookmark or a directory function! s:Creator.createPrimary(name) let path = self._pathForString(a:name) + + "abort if exception was thrown (bookmark/dir doesn't exist) + if empty(path) + return + endif "if instructed to, then change the vim CWD to the dir the NERDTree is "inited in From f6cad7e9576bc618187450cd4eb5903ee09d449c Mon Sep 17 00:00:00 2001 From: Curtiss Howard Date: Fri, 17 Apr 2015 17:36:23 -0400 Subject: [PATCH 11/48] Use different arrow characters for compatibility. --- autoload/nerdtree.vim | 2 +- lib/nerdtree/tree_file_node.vim | 4 ++-- lib/nerdtree/ui.vim | 6 +++--- syntax/nerdtree.vim | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index 539e783..07b9744 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -98,7 +98,7 @@ endfunction "FUNCTION: nerdtree#treeMarkupReg(dir) {{{2 function! nerdtree#treeMarkupReg() if g:NERDTreeDirArrows - return '^\([▾▸] \| \+[▾▸] \| \+\)' + return '^\([▼▶] \| \+[▼▶] \| \+\)' endif return '^[ `|]*[\-+~]' diff --git a/lib/nerdtree/tree_file_node.vim b/lib/nerdtree/tree_file_node.vim index b4924d7..d9f956e 100644 --- a/lib/nerdtree/tree_file_node.vim +++ b/lib/nerdtree/tree_file_node.vim @@ -383,13 +383,13 @@ function! s:TreeFileNode._renderToString(depth, drawText, vertMap, isLastChild) if self.path.isDirectory if self.isOpen if g:NERDTreeDirArrows - let treeParts = treeParts . '▾ ' + let treeParts = treeParts . '▼ ' else let treeParts = treeParts . '~' endif else if g:NERDTreeDirArrows - let treeParts = treeParts . '▸ ' + let treeParts = treeParts . '▶ ' else let treeParts = treeParts . '+' endif diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index ed93d80..418fd2d 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -51,7 +51,7 @@ function! s:UI.getPath(ln) if !g:NERDTreeDirArrows " in case called from outside the tree - if line !~# '^ *[|`▸▾ ]' || line =~# '^$' + if line !~# '^ *[|`▶▼ ]' || line =~# '^$' return {} endif endif @@ -159,9 +159,9 @@ endfunction "FUNCTION: s:UI._indentLevelFor(line) {{{2 function! s:UI._indentLevelFor(line) - let level = match(a:line, '[^ \-+~▸▾`|]') / nerdtree#treeWid() + let level = match(a:line, '[^ \-+~▶▼`|]') / nerdtree#treeWid() " check if line includes arrows - if match(a:line, '[▸▾]') > -1 + if match(a:line, '[▶▼]') > -1 " decrement level as arrow uses 3 ascii chars let level = level - 1 endif diff --git a/syntax/nerdtree.vim b/syntax/nerdtree.vim index 5f7b49c..8c32868 100644 --- a/syntax/nerdtree.vim +++ b/syntax/nerdtree.vim @@ -23,12 +23,12 @@ syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir syn match NERDTreeDirSlash #/# containedin=NERDTreeDir if g:NERDTreeDirArrows - syn match NERDTreeClosable #▾# containedin=NERDTreeDir,NERDTreeFile - syn match NERDTreeOpenable #▸# containedin=NERDTreeDir,NERDTreeFile + syn match NERDTreeClosable #▼# containedin=NERDTreeDir,NERDTreeFile + syn match NERDTreeOpenable #▶# containedin=NERDTreeDir,NERDTreeFile - syn match NERDTreeDir #[^▾▸ ].*/# + syn match NERDTreeDir #[^▼▶ ].*/# syn match NERDTreeExecFile #^ .*\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark - syn match NERDTreeFile #^[^"\.▾▸] *[^▾▸]*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile + syn match NERDTreeFile #^[^"\.▼▶] *[^▼▶]*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile "highlighting for readonly files syn match NERDTreeRO # *\zs.*\ze \[RO\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile From 321de60366fc799e5564a7f7f8b826fd8a9b5fc1 Mon Sep 17 00:00:00 2001 From: Devon Hinton Date: Wed, 22 Apr 2015 01:06:47 -0700 Subject: [PATCH 12/48] Remove NERD_tree.txt typo "If not" -> "If No" --- doc/NERD_tree.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/NERD_tree.txt b/doc/NERD_tree.txt index 5d5b3f6..85dfba6 100644 --- a/doc/NERD_tree.txt +++ b/doc/NERD_tree.txt @@ -131,7 +131,7 @@ The following features and functionality are provided by the NERD tree: :NERDTreeFind *:NERDTreeFind* Find the current file in the tree. - If not tree exists and the current file is under vim's CWD, then init a + If no tree exists and the current file is under vim's CWD, then init a tree at the CWD and reveal the file. Otherwise init a tree in the current file's directory. From 87b27802b57bbf383a812b57338fbab28499b7e8 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Fri, 1 May 2015 15:33:06 +0100 Subject: [PATCH 13/48] allow control over whether to reuse windows in different tabs When opening a file we will "reuse" a window if the buffer is already open somewhere. Add an option to NERDTreeOpener to configure it to not reuse windows across tabs. --- autoload/nerdtree/ui_glue.vim | 6 ++--- lib/nerdtree/opener.vim | 42 ++++++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index 8607389..0dd826d 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -93,13 +93,13 @@ endfunction "FUNCTION: s:activateDirNode() {{{1 "handle the user activating a tree node function! s:activateDirNode(node) - call a:node.activate({'reuse': 1}) + call a:node.activate() endfunction "FUNCTION: s:activateFileNode() {{{1 "handle the user activating a tree node function! s:activateFileNode(node) - call a:node.activate({'reuse': 1, 'where': 'p'}) + call a:node.activate({'reuse': 'all', 'where': 'p'}) endfunction "FUNCTION: s:activateBookmark() {{{1 @@ -324,7 +324,7 @@ function! s:handleLeftClick() if currentNode.path.isDirectory call currentNode.activate() else - call currentNode.activate({'reuse': 1, 'where': 'p'}) + call currentNode.activate({'reuse': 'all', 'where': 'p'}) endif return endif diff --git a/lib/nerdtree/opener.vim b/lib/nerdtree/opener.vim index 845e55c..14d1e2b 100644 --- a/lib/nerdtree/opener.vim +++ b/lib/nerdtree/opener.vim @@ -131,7 +131,8 @@ endfunction " 'where': Specifies whether the node should be opened in new split/tab or in " the previous window. Can be either 'v' or 'h' or 't' (for open in " new tab) -" 'reuse': if a window is displaying the file then jump the cursor there +" 'reuse': if a window is displaying the file then jump the cursor there. Can +" 'all', 'currenttab' or empty to not reuse. " 'keepopen': dont close the tree window " 'stay': open the file, but keep the cursor in the tree win function! s:Opener.New(path, opts) @@ -139,7 +140,13 @@ function! s:Opener.New(path, opts) let newObj._path = a:path let newObj._stay = nerdtree#has_opt(a:opts, 'stay') - let newObj._reuse = nerdtree#has_opt(a:opts, 'reuse') + + if has_key(a:opts, 'reuse') + let newObj._reuse = a:opts['reuse'] + else + let newObj._reuse = '' + endif + let newObj._keepopen = nerdtree#has_opt(a:opts, 'keepopen') let newObj._where = has_key(a:opts, 'where') ? a:opts['where'] : '' let newObj._treetype = b:NERDTreeType @@ -235,7 +242,7 @@ endfunction "FUNCTION: Opener._openFile() {{{1 function! s:Opener._openFile() - if self._reuse && self._reuseWindow() + if self._reuseWindow() return endif @@ -307,23 +314,32 @@ endfunction " "return 1 if we were successful function! s:Opener._reuseWindow() + if empty(self._reuse) + return 0 + endif + "check the current tab for the window let winnr = bufwinnr('^' . self._path.str() . '$') if winnr != -1 call nerdtree#exec(winnr . "wincmd w") call self._checkToCloseTree(0) return 1 - else - "check other tabs - let tabnr = self._path.tabnr() - if tabnr - call self._checkToCloseTree(1) - call nerdtree#exec('normal! ' . tabnr . 'gt') - let winnr = bufwinnr('^' . self._path.str() . '$') - call nerdtree#exec(winnr . "wincmd w") - return 1 - endif endif + + if self._reuse == 'currenttab' + return 0 + endif + + "check other tabs + let tabnr = self._path.tabnr() + if tabnr + call self._checkToCloseTree(1) + call nerdtree#exec('normal! ' . tabnr . 'gt') + let winnr = bufwinnr('^' . self._path.str() . '$') + call nerdtree#exec(winnr . "wincmd w") + return 1 + endif + return 0 endfunction From b3281cc63e44d97888a398d202f75c92ed0a0a04 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Fri, 1 May 2015 16:00:52 +0100 Subject: [PATCH 14/48] fix one of the old style arrows See here: 1cbd52aa77541682658f4c8a6d217c77a78c3879 --- autoload/nerdtree/ui_glue.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index 8607389..ad30594 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -312,7 +312,7 @@ function! s:handleLeftClick() endfor if currentNode.path.isDirectory - if startToCur =~# nerdtree#treeMarkupReg() && startToCur =~# '[+~▾▸] \?$' + if startToCur =~# nerdtree#treeMarkupReg() && startToCur =~# '[+~▶▼] \?$' call currentNode.activate() return endif From 186f817f5ade23fe39db91267f5a1ce66d711af1 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 11:28:54 +0100 Subject: [PATCH 15/48] Revert "fix one of the old style arrows" This reverts commit b3281cc63e44d97888a398d202f75c92ed0a0a04. --- autoload/nerdtree/ui_glue.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index ad30594..8607389 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -312,7 +312,7 @@ function! s:handleLeftClick() endfor if currentNode.path.isDirectory - if startToCur =~# nerdtree#treeMarkupReg() && startToCur =~# '[+~▶▼] \?$' + if startToCur =~# nerdtree#treeMarkupReg() && startToCur =~# '[+~▾▸] \?$' call currentNode.activate() return endif From f8499462c5728f9f96836c99f24e4faf0774bccd Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 11:29:43 +0100 Subject: [PATCH 16/48] Revert "Use different arrow characters for compatibility." This reverts commit f6cad7e9576bc618187450cd4eb5903ee09d449c. --- autoload/nerdtree.vim | 2 +- lib/nerdtree/tree_file_node.vim | 4 ++-- lib/nerdtree/ui.vim | 6 +++--- syntax/nerdtree.vim | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index 07b9744..539e783 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -98,7 +98,7 @@ endfunction "FUNCTION: nerdtree#treeMarkupReg(dir) {{{2 function! nerdtree#treeMarkupReg() if g:NERDTreeDirArrows - return '^\([▼▶] \| \+[▼▶] \| \+\)' + return '^\([▾▸] \| \+[▾▸] \| \+\)' endif return '^[ `|]*[\-+~]' diff --git a/lib/nerdtree/tree_file_node.vim b/lib/nerdtree/tree_file_node.vim index d9f956e..b4924d7 100644 --- a/lib/nerdtree/tree_file_node.vim +++ b/lib/nerdtree/tree_file_node.vim @@ -383,13 +383,13 @@ function! s:TreeFileNode._renderToString(depth, drawText, vertMap, isLastChild) if self.path.isDirectory if self.isOpen if g:NERDTreeDirArrows - let treeParts = treeParts . '▼ ' + let treeParts = treeParts . '▾ ' else let treeParts = treeParts . '~' endif else if g:NERDTreeDirArrows - let treeParts = treeParts . '▶ ' + let treeParts = treeParts . '▸ ' else let treeParts = treeParts . '+' endif diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 418fd2d..ed93d80 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -51,7 +51,7 @@ function! s:UI.getPath(ln) if !g:NERDTreeDirArrows " in case called from outside the tree - if line !~# '^ *[|`▶▼ ]' || line =~# '^$' + if line !~# '^ *[|`▸▾ ]' || line =~# '^$' return {} endif endif @@ -159,9 +159,9 @@ endfunction "FUNCTION: s:UI._indentLevelFor(line) {{{2 function! s:UI._indentLevelFor(line) - let level = match(a:line, '[^ \-+~▶▼`|]') / nerdtree#treeWid() + let level = match(a:line, '[^ \-+~▸▾`|]') / nerdtree#treeWid() " check if line includes arrows - if match(a:line, '[▶▼]') > -1 + if match(a:line, '[▸▾]') > -1 " decrement level as arrow uses 3 ascii chars let level = level - 1 endif diff --git a/syntax/nerdtree.vim b/syntax/nerdtree.vim index 8c32868..5f7b49c 100644 --- a/syntax/nerdtree.vim +++ b/syntax/nerdtree.vim @@ -23,12 +23,12 @@ syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir syn match NERDTreeDirSlash #/# containedin=NERDTreeDir if g:NERDTreeDirArrows - syn match NERDTreeClosable #▼# containedin=NERDTreeDir,NERDTreeFile - syn match NERDTreeOpenable #▶# containedin=NERDTreeDir,NERDTreeFile + syn match NERDTreeClosable #▾# containedin=NERDTreeDir,NERDTreeFile + syn match NERDTreeOpenable #▸# containedin=NERDTreeDir,NERDTreeFile - syn match NERDTreeDir #[^▼▶ ].*/# + syn match NERDTreeDir #[^▾▸ ].*/# syn match NERDTreeExecFile #^ .*\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark - syn match NERDTreeFile #^[^"\.▼▶] *[^▼▶]*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile + syn match NERDTreeFile #^[^"\.▾▸] *[^▾▸]*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile "highlighting for readonly files syn match NERDTreeRO # *\zs.*\ze \[RO\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile From 0e87d45e84b942b1d152cf05b5bc418d9d4ee5b0 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 12:01:22 +0100 Subject: [PATCH 17/48] update readme to add an FAQ, update the FAQ style and rm the changelog --- README.markdown | 46 ++++++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/README.markdown b/README.markdown index 4234b54..880079a 100644 --- a/README.markdown +++ b/README.markdown @@ -66,48 +66,38 @@ Then reload vim, run `:Helptags`, and check out `:help NERD_tree.txt`. Faq --- -__Q. Can I have the nerdtree on every tab automatically?__ +> Is there any support for `git` flags? -A. Nope. If this is something you want then chances are you aren't using tabs - and buffers as they were intended to be used. Read this - http://stackoverflow.com/questions/102384/using-vims-tabs-like-buffers +Yes, install [nerdtree-git-plugin](https://github.com/Xuyuanp/nerdtree-git-plugin). - If you are interested in this behaviour then consider [vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs) -__Q. How can I open a NERDTree automatically when vim starts up?__ +> Can I have the nerdtree on every tab automatically? -A. Stick this in your vimrc: `autocmd vimenter * NERDTree` +Nope. If this is something you want then chances are you aren't using tabs and +buffers as they were intended to be used. Read this +http://stackoverflow.com/questions/102384/using-vims-tabs-like-buffers -__Q. How can I open a NERDTree automatically when vim starts up if no files were specified?__ +If you are interested in this behaviour then consider [vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs) -A. Stick this in your vimrc +> How can I open a NERDTree automatically when vim starts up? + +Stick this in your vimrc: `autocmd vimenter * NERDTree` + +> How can I open a NERDTree automatically when vim starts up if no files were specified? + +Stick this in your vimrc autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif -__Q. How can I map a specific key or shortcut to open NERDTree?__ +> How can I map a specific key or shortcut to open NERDTree? -A. Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever key you want): +Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever key you want): `map :NERDTreeToggle` -__Q. How can I close vim if the only window left open is a NERDTree?__ +> How can I close vim if the only window left open is a NERDTree? -A. Stick this in your vimrc: +Stick this in your vimrc: `autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif` - - -Changelog ---------- - -4.2.0 (2011-12-28) - - * Add NERDTreeDirArrows option to make the UI use pretty arrow chars instead of the old +~| chars to define the tree structure (sickill) - * shift the syntax highlighting out into its own syntax file (gnap) * add some mac specific options to the filesystem menu - for macvim only (andersonfreitas) - * Add NERDTreeMinimalUI option to remove some non functional parts of the nerdtree ui (camthompson) - * tweak the behaviour of :NERDTreeFind - see :help :NERDTreeFind for the new behaviour (benjamingeiger) - * if no name is given to :Bookmark, make it default to the name of the target file/dir (minyoung) - * use 'file' completion when doing copying, create, and move operations (EvanDotPro) - * lots of misc bug fixes (paddyoloughlin, sdewald, camthompson, Vitaly Bogdanov, AndrewRadev, mathias, scottstvnsn, kml, wycats, me RAWR!) - From 973c9906f8ff548ad60f93b73dfc424356931890 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 12:42:59 +0100 Subject: [PATCH 18/48] refactor 3 more functions out of the monolithic autoload file --- autoload/nerdtree.vim | 21 +-------------------- autoload/nerdtree/ui_glue.vim | 6 +++--- lib/nerdtree/ui.vim | 33 +++++++++++++++++++++++++-------- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index 539e783..d68faaa 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -95,25 +95,6 @@ function! nerdtree#runningWindows() return has("win16") || has("win32") || has("win64") endfunction -"FUNCTION: nerdtree#treeMarkupReg(dir) {{{2 -function! nerdtree#treeMarkupReg() - if g:NERDTreeDirArrows - return '^\([▾▸] \| \+[▾▸] \| \+\)' - endif - - return '^[ `|]*[\-+~]' -endfunction - -"FUNCTION: nerdtree#treeUpDirLine(dir) {{{2 -function! nerdtree#treeUpDirLine() - return '.. (up a dir)' -endfunction - -"FUNCTION: nerdtree#treeWid(dir) {{{2 -function! nerdtree#treeWid() - return 2 -endfunction - " SECTION: View Functions {{{1 "============================================================ @@ -374,7 +355,7 @@ endfunction function! nerdtree#stripMarkupFromLine(line, removeLeadingSpaces) let line = a:line "remove the tree parts and the leading space - let line = substitute (line, nerdtree#treeMarkupReg(),"","") + let line = substitute (line, g:NERDTreeUI.MarkupReg(),"","") "strip off any read only flag let line = substitute (line, ' \[RO\]', "","") diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index 8607389..a86011c 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -85,7 +85,7 @@ endfunction "FUNCTION: s:activateAll() {{{1 "handle the user activating the updir line function! s:activateAll() - if getline(".") ==# nerdtree#treeUpDirLine() + if getline(".") ==# g:NERDTreeUI.UpDirLine() return nerdtree#ui_glue#upDir(0) endif endfunction @@ -312,7 +312,7 @@ function! s:handleLeftClick() endfor if currentNode.path.isDirectory - if startToCur =~# nerdtree#treeMarkupReg() && startToCur =~# '[+~▾▸] \?$' + if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~▾▸] \?$' call currentNode.activate() return endif @@ -320,7 +320,7 @@ function! s:handleLeftClick() if (g:NERDTreeMouseMode ==# 2 && currentNode.path.isDirectory) || g:NERDTreeMouseMode ==# 3 let char = strpart(startToCur, strlen(startToCur)-1, 1) - if char !~# nerdtree#treeMarkupReg() + if char !~# g:NERDTreeUI.MarkupReg() if currentNode.path.isDirectory call currentNode.activate() else diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index ed93d80..8382b4f 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -56,7 +56,7 @@ function! s:UI.getPath(ln) endif endif - if line ==# nerdtree#treeUpDirLine() + if line ==# s:UI.UpDirLine() return b:NERDTreeRoot.path.getParent() endif @@ -146,7 +146,6 @@ function! s:UI.getLineNum(file_node) return -1 endfunction - "FUNCTION: s:UI.getRootLineNum(){{{1 "gets the line number of the root node function! s:UI.getRootLineNum() @@ -157,9 +156,9 @@ function! s:UI.getRootLineNum() return rootLine endfunction -"FUNCTION: s:UI._indentLevelFor(line) {{{2 +"FUNCTION: s:UI._indentLevelFor(line) {{{1 function! s:UI._indentLevelFor(line) - let level = match(a:line, '[^ \-+~▸▾`|]') / nerdtree#treeWid() + let level = match(a:line, '[^ \-+~▸▾`|]') / s:UI.IndentWid() " check if line includes arrows if match(a:line, '[▸▾]') > -1 " decrement level as arrow uses 3 ascii chars @@ -168,8 +167,21 @@ function! s:UI._indentLevelFor(line) return level endfunction +"FUNCTION: s:UI.IndentWid() {{{1 +function! s:UI.IndentWid() + return 2 +endfunction -"FUNCTION: s:UI.restoreScreenState() {{{2 +"FUNCTION: s:UI.MarkupReg() {{{1 +function! s:UI.MarkupReg() + if g:NERDTreeDirArrows + return '^\([▾▸] \| \+[▾▸] \| \+\)' + endif + + return '^[ `|]*[\-+~]' +endfunction + +"FUNCTION: s:UI.restoreScreenState() {{{1 " "Sets the screen state back to what it was when nerdtree#saveScreenState was last "called. @@ -189,7 +201,7 @@ function! s:UI.restoreScreenState() let &scrolloff=old_scrolloff endfunction -"FUNCTION: s:UI.saveScreenState() {{{2 +"FUNCTION: s:UI.saveScreenState() {{{1 "Saves the current cursor position in the current buffer and the window "scroll position function! s:UI.saveScreenState() @@ -205,7 +217,7 @@ function! s:UI.saveScreenState() endtry endfunction -"FUNCTION: s:UI.render() {{{2 +"FUNCTION: s:UI.render() {{{1 function! s:UI.render() setlocal modifiable @@ -232,7 +244,7 @@ function! s:UI.render() "add the 'up a dir' line if !g:NERDTreeMinimalUI - call setline(line(".")+1, nerdtree#treeUpDirLine()) + call setline(line(".")+1, s:UI.UpDirLine()) call cursor(line(".")+1, col(".")) endif @@ -330,3 +342,8 @@ function! s:UI.toggleZoom() let b:NERDTreeZoomed = 1 endif endfunction + +"FUNCTION: s:UI.UpDirLine() {{{1 +function! s:UI.UpDirLine() + return '.. (up a dir)' +endfunction From 8270b6d71782930306b5788b218af82c59b01224 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 14:31:57 +0100 Subject: [PATCH 19/48] move nerdtree#getTreeWinNum out of autoload --- autoload/nerdtree.vim | 18 ++++-------------- lib/nerdtree/bookmark.vim | 2 +- lib/nerdtree/nerdtree.vim | 10 ++++++++++ lib/nerdtree/ui.vim | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index d68faaa..be1afbe 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -106,7 +106,7 @@ function! nerdtree#closeTree() endif if winnr("$") != 1 - if winnr() == nerdtree#getTreeWinNum() + if winnr() == g:NERDTree.GetWinNum() call nerdtree#exec("wincmd p") let bufnr = bufnr("") call nerdtree#exec("wincmd p") @@ -114,7 +114,7 @@ function! nerdtree#closeTree() let bufnr = bufnr("") endif - call nerdtree#exec(nerdtree#getTreeWinNum() . " wincmd w") + call nerdtree#exec(g:NERDTree.GetWinNum() . " wincmd w") close call nerdtree#exec(bufwinnr(bufnr) . " wincmd w") else @@ -275,19 +275,9 @@ function! nerdtree#echoWarning(msg) echohl normal endfunction -"FUNCTION: nerdtree#getTreeWinNum() {{{2 -"gets the nerd tree window number for this tab -function! nerdtree#getTreeWinNum() - if exists("t:NERDTreeBufName") - return bufwinnr(t:NERDTreeBufName) - else - return -1 - endif -endfunction - "FUNCTION: nerdtree#isTreeOpen() {{{2 function! nerdtree#isTreeOpen() - return nerdtree#getTreeWinNum() != -1 + return g:NERDTree.GetWinNum() != -1 endfunction "FUNCTION: nerdtree#putCursorOnBookmarkTable(){{{2 @@ -320,7 +310,7 @@ function! nerdtree#putCursorInTreeWin() throw "NERDTree.InvalidOperationError: cant put cursor in NERD tree window, no window exists" endif - call nerdtree#exec(nerdtree#getTreeWinNum() . "wincmd w") + call nerdtree#exec(g:NERDTree.GetWinNum() . "wincmd w") endfunction "FUNCTION: nerdtree#renderBookmarks {{{2 diff --git a/lib/nerdtree/bookmark.vim b/lib/nerdtree/bookmark.vim index 6de9be4..8a94b25 100644 --- a/lib/nerdtree/bookmark.vim +++ b/lib/nerdtree/bookmark.vim @@ -253,7 +253,7 @@ endfunction " FUNCTION: Bookmark.str() {{{1 " Get the string that should be rendered in the view for this bookmark function! s:Bookmark.str() - let pathStrMaxLen = winwidth(nerdtree#getTreeWinNum()) - 4 - len(self.name) + let pathStrMaxLen = winwidth(g:NERDTree.GetWinNum()) - 4 - len(self.name) if &nu let pathStrMaxLen = pathStrMaxLen - &numberwidth endif diff --git a/lib/nerdtree/nerdtree.vim b/lib/nerdtree/nerdtree.vim index a41490b..91ccc53 100644 --- a/lib/nerdtree/nerdtree.vim +++ b/lib/nerdtree/nerdtree.vim @@ -23,6 +23,16 @@ function! s:NERDTree.ForCurrentBuf() endif endfunction +"FUNCTION: s:NERDTree.GetWinNum() {{{1 +"gets the nerd tree window number for this tab +function! s:NERDTree.GetWinNum() + if exists("t:NERDTreeBufName") + return bufwinnr(t:NERDTreeBufName) + else + return -1 + endif +endfunction + function! s:NERDTree.New(path) let newObj = copy(self) let newObj.ui = g:NERDTreeUI.New(newObj) diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 8382b4f..209f826 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -15,7 +15,7 @@ function! s:UI.centerView() if g:NERDTreeAutoCenter let current_line = winline() let lines_to_top = current_line - let lines_to_bottom = winheight(nerdtree#getTreeWinNum()) - current_line + let lines_to_bottom = winheight(g:NERDTree.GetWinNum()) - current_line if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold normal! zz endif From 0d88ce946fc21eca51bc1efef47ae843845e5f16 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 14:44:32 +0100 Subject: [PATCH 20/48] move isTreeOpen() out of autoload --- autoload/nerdtree.vim | 18 ++++-------------- autoload/nerdtree/ui_glue.vim | 4 ++-- lib/nerdtree/creator.vim | 6 +++--- lib/nerdtree/nerdtree.vim | 13 +++++++++++++ plugin/NERD_tree.vim | 2 +- 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index be1afbe..f3fc0be 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -101,9 +101,7 @@ endfunction "FUNCTION: nerdtree#closeTree() {{{2 "Closes the primary NERD tree window for this tab function! nerdtree#closeTree() - if !nerdtree#isTreeOpen() - throw "NERDTree.NoTreeFoundError: no NERDTree is open" - endif + call g:NERDTree.MustBeOpen() if winnr("$") != 1 if winnr() == g:NERDTree.GetWinNum() @@ -125,7 +123,7 @@ endfunction "FUNCTION: nerdtree#closeTreeIfOpen() {{{2 "Closes the NERD tree window if it is open function! nerdtree#closeTreeIfOpen() - if nerdtree#isTreeOpen() + if g:NERDTree.IsOpen() call nerdtree#closeTree() endif endfunction @@ -133,7 +131,7 @@ endfunction "FUNCTION: nerdtree#closeTreeIfQuitOnOpen() {{{2 "Closes the NERD tree window if the close on open option is set function! nerdtree#closeTreeIfQuitOnOpen() - if g:NERDTreeQuitOnOpen && nerdtree#isTreeOpen() + if g:NERDTreeQuitOnOpen && g:NERDTree.IsOpen() call nerdtree#closeTree() endif endfunction @@ -275,11 +273,6 @@ function! nerdtree#echoWarning(msg) echohl normal endfunction -"FUNCTION: nerdtree#isTreeOpen() {{{2 -function! nerdtree#isTreeOpen() - return g:NERDTree.GetWinNum() != -1 -endfunction - "FUNCTION: nerdtree#putCursorOnBookmarkTable(){{{2 "Places the cursor at the top of the bookmarks table function! nerdtree#putCursorOnBookmarkTable() @@ -306,10 +299,7 @@ endfunction "FUNCTION: nerdtree#putCursorInTreeWin(){{{2 "Places the cursor in the nerd tree window function! nerdtree#putCursorInTreeWin() - if !nerdtree#isTreeOpen() - throw "NERDTree.InvalidOperationError: cant put cursor in NERD tree window, no window exists" - endif - + call g:NERDTree.MustBeOpen() call nerdtree#exec(g:NERDTree.GetWinNum() . "wincmd w") endfunction diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index a86011c..3b9784a 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -275,7 +275,7 @@ function! s:findAndRevealPath() endif else if !p.isUnder(g:NERDTreeFileNode.GetRootForTab().path) - if !nerdtree#isTreeOpen() + if !g:NERDTree.IsOpen() call g:NERDTreeCreator.TogglePrimary('') else call nerdtree#putCursorInTreeWin() @@ -283,7 +283,7 @@ function! s:findAndRevealPath() let b:NERDTreeShowHidden = g:NERDTreeShowHidden call s:chRoot(g:NERDTreeDirNode.New(p.getParent())) else - if !nerdtree#isTreeOpen() + if !g:NERDTree.IsOpen() call g:NERDTreeCreator.TogglePrimary("") endif endif diff --git a/lib/nerdtree/creator.vim b/lib/nerdtree/creator.vim index 0697759..efa9846 100644 --- a/lib/nerdtree/creator.vim +++ b/lib/nerdtree/creator.vim @@ -55,7 +55,7 @@ function! s:Creator.createPrimary(name) endif if g:NERDTree.ExistsForTab() - if nerdtree#isTreeOpen() + if g:NERDTree.IsOpen() call nerdtree#closeTree() endif unlet t:NERDTreeBufName @@ -168,7 +168,7 @@ function! s:Creator.createMirror() return endif - if g:NERDTree.ExistsForTab() && nerdtree#isTreeOpen() + if g:NERDTree.ExistsForTab() && g:NERDTree.IsOpen() call nerdtree#closeTree() endif @@ -333,7 +333,7 @@ endfunction "initialized. function! s:Creator.togglePrimary(dir) if g:NERDTree.ExistsForTab() - if !nerdtree#isTreeOpen() + if !g:NERDTree.IsOpen() call self._createTreeWin() if !&hidden call b:NERDTree.render() diff --git a/lib/nerdtree/nerdtree.vim b/lib/nerdtree/nerdtree.vim index 91ccc53..29a5930 100644 --- a/lib/nerdtree/nerdtree.vim +++ b/lib/nerdtree/nerdtree.vim @@ -33,6 +33,19 @@ function! s:NERDTree.GetWinNum() endif endfunction +"FUNCTION: s:NERDTree.IsOpen() {{{1 +function! s:NERDTree.IsOpen() + return s:NERDTree.GetWinNum() != -1 +endfunction + +"FUNCTION: s:NERDTree.MustBeOpen() {{{1 +function! s:NERDTree.MustBeOpen() + if !s:NERDTree.IsOpen() + throw "NERDTree.TreeNotOpen" + endif +endfunction + +"FUNCTION: s:NERDTree.New() {{{1 function! s:NERDTree.New(path) let newObj = copy(self) let newObj.ui = g:NERDTreeUI.New(newObj) diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index 28fd3ad..8038668 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -185,7 +185,7 @@ function! NERDTreeRender() endfunction function! NERDTreeFocus() - if nerdtree#isTreeOpen() + if g:NERDTree.IsOpen() call nerdtree#putCursorInTreeWin() else call g:NERDTreeCreator.TogglePrimary("") From 53d2de86eb9b2fa0e77272dfc9d94ee33467e895 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 15:01:58 +0100 Subject: [PATCH 21/48] move the closeTree functions out of autoload Remove `closeTreeIfOpen` and just make `closeTree` fail silently. --- autoload/nerdtree.vim | 38 ----------------------------------- autoload/nerdtree/ui_glue.vim | 4 ++-- lib/nerdtree/creator.vim | 6 +++--- lib/nerdtree/nerdtree.vim | 33 +++++++++++++++++++++++++++++- lib/nerdtree/opener.vim | 2 +- 5 files changed, 38 insertions(+), 45 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index f3fc0be..bb422db 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -98,44 +98,6 @@ endfunction " SECTION: View Functions {{{1 "============================================================ -"FUNCTION: nerdtree#closeTree() {{{2 -"Closes the primary NERD tree window for this tab -function! nerdtree#closeTree() - call g:NERDTree.MustBeOpen() - - if winnr("$") != 1 - if winnr() == g:NERDTree.GetWinNum() - call nerdtree#exec("wincmd p") - let bufnr = bufnr("") - call nerdtree#exec("wincmd p") - else - let bufnr = bufnr("") - endif - - call nerdtree#exec(g:NERDTree.GetWinNum() . " wincmd w") - close - call nerdtree#exec(bufwinnr(bufnr) . " wincmd w") - else - close - endif -endfunction - -"FUNCTION: nerdtree#closeTreeIfOpen() {{{2 -"Closes the NERD tree window if it is open -function! nerdtree#closeTreeIfOpen() - if g:NERDTree.IsOpen() - call nerdtree#closeTree() - endif -endfunction - -"FUNCTION: nerdtree#closeTreeIfQuitOnOpen() {{{2 -"Closes the NERD tree window if the close on open option is set -function! nerdtree#closeTreeIfQuitOnOpen() - if g:NERDTreeQuitOnOpen && g:NERDTree.IsOpen() - call nerdtree#closeTree() - endif -endfunction - "FUNCTION: nerdtree#dumpHelp {{{2 "prints out the quick help function! nerdtree#dumpHelp() diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index 3b9784a..1dbfc50 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -212,7 +212,7 @@ function! s:closeTreeWindow() exec "buffer " . b:NERDTreePreviousBuf else if winnr("$") > 1 - call nerdtree#closeTree() + call g:NERDTree.Close() else call nerdtree#echo("Cannot close last window") endif @@ -547,7 +547,7 @@ endfunction function! nerdtree#ui_glue#setupCommands() command! -n=? -complete=dir -bar NERDTree :call g:NERDTreeCreator.CreatePrimary('') command! -n=? -complete=dir -bar NERDTreeToggle :call g:NERDTreeCreator.TogglePrimary('') - command! -n=0 -bar NERDTreeClose :call nerdtree#closeTreeIfOpen() + command! -n=0 -bar NERDTreeClose :call g:NERDTree.Close() command! -n=1 -complete=customlist,nerdtree#completeBookmarks -bar NERDTreeFromBookmark call g:NERDTreeCreator.CreatePrimary('') command! -n=0 -bar NERDTreeMirror call g:NERDTreeCreator.CreateMirror() command! -n=0 -bar NERDTreeFind call s:findAndRevealPath() diff --git a/lib/nerdtree/creator.vim b/lib/nerdtree/creator.vim index efa9846..2d6a5c2 100644 --- a/lib/nerdtree/creator.vim +++ b/lib/nerdtree/creator.vim @@ -56,7 +56,7 @@ function! s:Creator.createPrimary(name) if g:NERDTree.ExistsForTab() if g:NERDTree.IsOpen() - call nerdtree#closeTree() + call g:NERDTree.Close() endif unlet t:NERDTreeBufName endif @@ -169,7 +169,7 @@ function! s:Creator.createMirror() endif if g:NERDTree.ExistsForTab() && g:NERDTree.IsOpen() - call nerdtree#closeTree() + call g:NERDTree.Close() endif let t:NERDTreeBufName = bufferName @@ -340,7 +340,7 @@ function! s:Creator.togglePrimary(dir) endif call b:NERDTree.ui.restoreScreenState() else - call nerdtree#closeTree() + call g:NERDTree.Close() endif else call self.createPrimary(a:dir) diff --git a/lib/nerdtree/nerdtree.vim b/lib/nerdtree/nerdtree.vim index 29a5930..7fec67b 100644 --- a/lib/nerdtree/nerdtree.vim +++ b/lib/nerdtree/nerdtree.vim @@ -3,6 +3,38 @@ let s:NERDTree = {} let g:NERDTree = s:NERDTree +"FUNCTION: s:NERDTree.Close() {{{1 +"Closes the primary NERD tree window for this tab +function! s:NERDTree.Close() + if !s:NERDTree.IsOpen() + return + endif + + if winnr("$") != 1 + if winnr() == s:NERDTree.GetWinNum() + call nerdtree#exec("wincmd p") + let bufnr = bufnr("") + call nerdtree#exec("wincmd p") + else + let bufnr = bufnr("") + endif + + call nerdtree#exec(s:NERDTree.GetWinNum() . " wincmd w") + close + call nerdtree#exec(bufwinnr(bufnr) . " wincmd w") + else + close + endif +endfunction + +"FUNCTION: s:NERDTree.CloseIfQuitOnOpen() {{{1 +"Closes the NERD tree window if the close on open option is set +function! s:NERDTree.CloseIfQuitOnOpen() + if g:NERDTreeQuitOnOpen && s:NERDTree.IsOpen() + call s:NERDTree.Close() + endif +endfunction + " Function: s:NERDTree.ExistsForBuffer() {{{1 " Returns 1 if a nerd tree root exists in the current buffer function! s:NERDTree.ExistsForBuf() @@ -59,4 +91,3 @@ endfunction function! s:NERDTree.render() call self.ui.render() endfunction - diff --git a/lib/nerdtree/opener.vim b/lib/nerdtree/opener.vim index 845e55c..6dea3b0 100644 --- a/lib/nerdtree/opener.vim +++ b/lib/nerdtree/opener.vim @@ -40,7 +40,7 @@ function! s:Opener._checkToCloseTree(newtab) endif if (a:newtab && self._where == 't') || !a:newtab - call nerdtree#closeTreeIfQuitOnOpen() + call g:NERDTree.CloseIfQuitOnOpen() endif endfunction From b0114d202bd3641cffb232a5f1f4522c02659880 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 15:05:28 +0100 Subject: [PATCH 22/48] move dumpHelp out of autoload --- autoload/nerdtree.vim | 107 ---------------------------------------- lib/nerdtree/ui.vim | 110 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 108 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index bb422db..48bdb80 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -98,113 +98,6 @@ endfunction " SECTION: View Functions {{{1 "============================================================ -"FUNCTION: nerdtree#dumpHelp {{{2 -"prints out the quick help -function! nerdtree#dumpHelp() - let old_h = @h - if b:treeShowHelp ==# 1 - let @h= "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n" - let @h=@h."\" ============================\n" - let @h=@h."\" File node mappings~\n" - let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" - let @h=@h."\" ,\n" - if b:NERDTreeType ==# "primary" - let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n" - else - let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n" - endif - if b:NERDTreeType ==# "primary" - let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n" - endif - let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" - let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" - let @h=@h."\" middle-click,\n" - let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n" - let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n" - let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n" - let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n" - - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Directory node mappings~\n" - let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" - let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n" - let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" - let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n" - let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" - let @h=@h."\" current node recursively\n" - let @h=@h."\" middle-click,\n" - let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n" - - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Bookmark table mappings~\n" - let @h=@h."\" double-click,\n" - let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n" - let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" - let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" - let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n" - - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Tree navigation mappings~\n" - let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n" - let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n" - let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n" - let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n" - let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n" - let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" - - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Filesystem mappings~\n" - let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n" - let @h=@h."\" selected dir\n" - let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n" - let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" - let @h=@h."\" but leave old root open\n" - let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n" - let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n" - let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n" - let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n" - let @h=@h."\" selected dir\n" - let @h=@h."\" ". g:NERDTreeMapCWD .":change tree root to CWD\n" - - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Tree filtering mappings~\n" - let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (b:NERDTreeShowHidden ? "on" : "off") . ")\n" - let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (b:NERDTreeIgnoreEnabled ? "on" : "off") . ")\n" - let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (b:NERDTreeShowFiles ? "on" : "off") . ")\n" - let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (b:NERDTreeShowBookmarks ? "on" : "off") . ")\n" - - "add quickhelp entries for each custom key map - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Custom mappings~\n" - for i in g:NERDTreeKeyMap.All() - if !empty(i.quickhelpText) - let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n" - endif - endfor - - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Other mappings~\n" - let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n" - let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" - let @h=@h."\" the NERDTree window\n" - let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n" - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Bookmark commands~\n" - let @h=@h."\" :Bookmark []\n" - let @h=@h."\" :BookmarkToRoot \n" - let @h=@h."\" :RevealBookmark \n" - let @h=@h."\" :OpenBookmark \n" - let @h=@h."\" :ClearBookmarks []\n" - let @h=@h."\" :ClearAllBookmarks\n" - silent! put h - elseif g:NERDTreeMinimalUI == 0 - let @h="\" Press ". g:NERDTreeMapHelp ." for help\n" - silent! put h - endif - - let @h = old_h -endfunction - "FUNCTION: nerdtree#echo {{{2 "A wrapper for :echo. Appends 'NERDTree:' on the front of all messages " diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 209f826..b33fc8b 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -22,6 +22,114 @@ function! s:UI.centerView() endif endfunction +"FUNCTION: s:UI._dumpHelp {{{1 +"prints out the quick help +function! s:UI._dumpHelp() + let old_h = @h + if b:treeShowHelp ==# 1 + let @h= "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n" + let @h=@h."\" ============================\n" + let @h=@h."\" File node mappings~\n" + let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" + let @h=@h."\" ,\n" + if b:NERDTreeType ==# "primary" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n" + else + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n" + endif + if b:NERDTreeType ==# "primary" + let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n" + endif + let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let @h=@h."\" middle-click,\n" + let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n" + let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n" + let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n" + let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Directory node mappings~\n" + let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n" + let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" + let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n" + let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" + let @h=@h."\" current node recursively\n" + let @h=@h."\" middle-click,\n" + let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Bookmark table mappings~\n" + let @h=@h."\" double-click,\n" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Tree navigation mappings~\n" + let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n" + let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n" + let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n" + let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n" + let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n" + let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Filesystem mappings~\n" + let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n" + let @h=@h."\" selected dir\n" + let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n" + let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" + let @h=@h."\" but leave old root open\n" + let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n" + let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n" + let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n" + let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n" + let @h=@h."\" selected dir\n" + let @h=@h."\" ". g:NERDTreeMapCWD .":change tree root to CWD\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Tree filtering mappings~\n" + let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (b:NERDTreeShowHidden ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (b:NERDTreeIgnoreEnabled ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (b:NERDTreeShowFiles ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (b:NERDTreeShowBookmarks ? "on" : "off") . ")\n" + + "add quickhelp entries for each custom key map + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Custom mappings~\n" + for i in g:NERDTreeKeyMap.All() + if !empty(i.quickhelpText) + let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n" + endif + endfor + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Other mappings~\n" + let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n" + let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" + let @h=@h."\" the NERDTree window\n" + let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n" + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Bookmark commands~\n" + let @h=@h."\" :Bookmark []\n" + let @h=@h."\" :BookmarkToRoot \n" + let @h=@h."\" :RevealBookmark \n" + let @h=@h."\" :OpenBookmark \n" + let @h=@h."\" :ClearBookmarks []\n" + let @h=@h."\" :ClearAllBookmarks\n" + silent! put h + elseif g:NERDTreeMinimalUI == 0 + let @h="\" Press ". g:NERDTreeMapHelp ." for help\n" + silent! put h + endif + + let @h = old_h +endfunction + + "FUNCTION: s:UI.new(nerdtree) {{{1 function! s:UI.New(nerdtree) let newObj = copy(self) @@ -230,7 +338,7 @@ function! s:UI.render() "delete all lines in the buffer (being careful not to clobber a register) silent 1,$delete _ - call nerdtree#dumpHelp() + call self._dumpHelp() "delete the blank line before the help and add one after it if g:NERDTreeMinimalUI == 0 From 8b189cb263b17a9cc3393cbcb037c65d99579fb8 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 15:24:59 +0100 Subject: [PATCH 23/48] move some rendering and cursor moving functions out of autoload --- autoload/nerdtree.vim | 87 ----------------------------------- autoload/nerdtree/ui_glue.vim | 4 +- lib/nerdtree/nerdtree.vim | 30 ++++++++++++ lib/nerdtree/opener.vim | 6 +-- lib/nerdtree/ui.vim | 69 ++++++++++++++++++++++++--- plugin/NERD_tree.vim | 2 +- 6 files changed, 99 insertions(+), 99 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index 48bdb80..22283aa 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -128,96 +128,9 @@ function! nerdtree#echoWarning(msg) echohl normal endfunction -"FUNCTION: nerdtree#putCursorOnBookmarkTable(){{{2 -"Places the cursor at the top of the bookmarks table -function! nerdtree#putCursorOnBookmarkTable() - if !b:NERDTreeShowBookmarks - throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active" - endif - - if g:NERDTreeMinimalUI - return cursor(1, 2) - endif - - let rootNodeLine = b:NERDTree.ui.getRootLineNum() - - let line = 1 - while getline(line) !~# '^>-\+Bookmarks-\+$' - let line = line + 1 - if line >= rootNodeLine - throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table" - endif - endwhile - call cursor(line, 2) -endfunction - -"FUNCTION: nerdtree#putCursorInTreeWin(){{{2 -"Places the cursor in the nerd tree window -function! nerdtree#putCursorInTreeWin() - call g:NERDTree.MustBeOpen() - call nerdtree#exec(g:NERDTree.GetWinNum() . "wincmd w") -endfunction - -"FUNCTION: nerdtree#renderBookmarks {{{2 -function! nerdtree#renderBookmarks() - - if g:NERDTreeMinimalUI == 0 - call setline(line(".")+1, ">----------Bookmarks----------") - call cursor(line(".")+1, col(".")) - endif - - for i in g:NERDTreeBookmark.Bookmarks() - call setline(line(".")+1, i.str()) - call cursor(line(".")+1, col(".")) - endfor - - call setline(line(".")+1, '') - call cursor(line(".")+1, col(".")) -endfunction - "FUNCTION: nerdtree#renderView {{{2 function! nerdtree#renderView() call b:NERDTree.render() endfunction -" -"FUNCTION: nerdtree#stripMarkupFromLine(line, removeLeadingSpaces){{{2 -"returns the given line with all the tree parts stripped off -" -"Args: -"line: the subject line -"removeLeadingSpaces: 1 if leading spaces are to be removed (leading spaces = -"any spaces before the actual text of the node) -function! nerdtree#stripMarkupFromLine(line, removeLeadingSpaces) - let line = a:line - "remove the tree parts and the leading space - let line = substitute (line, g:NERDTreeUI.MarkupReg(),"","") - - "strip off any read only flag - let line = substitute (line, ' \[RO\]', "","") - - "strip off any bookmark flags - let line = substitute (line, ' {[^}]*}', "","") - - "strip off any executable flags - let line = substitute (line, '*\ze\($\| \)', "","") - - "strip off any generic flags - let line = substitute (line, '\[[^]]*\]', "","") - - let wasdir = 0 - if line =~# '/$' - let wasdir = 1 - endif - let line = substitute (line,' -> .*',"","") " remove link to - if wasdir ==# 1 - let line = substitute (line, '/\?$', '/', "") - endif - - if a:removeLeadingSpaces - let line = substitute (line, '^ *', '', '') - endif - - return line -endfunction " vim: set sw=4 sts=4 et fdm=marker: diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index 1dbfc50..3bdc1b2 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -278,7 +278,7 @@ function! s:findAndRevealPath() if !g:NERDTree.IsOpen() call g:NERDTreeCreator.TogglePrimary('') else - call nerdtree#putCursorInTreeWin() + call g:NERDTree.CursorToTreeWin() endif let b:NERDTreeShowHidden = g:NERDTreeShowHidden call s:chRoot(g:NERDTreeDirNode.New(p.getParent())) @@ -288,7 +288,7 @@ function! s:findAndRevealPath() endif endif endif - call nerdtree#putCursorInTreeWin() + call g:NERDTree.CursorToTreeWin() call b:NERDTreeRoot.reveal(p) if p.isUnixHiddenFile() diff --git a/lib/nerdtree/nerdtree.vim b/lib/nerdtree/nerdtree.vim index 7fec67b..8e3bdde 100644 --- a/lib/nerdtree/nerdtree.vim +++ b/lib/nerdtree/nerdtree.vim @@ -35,6 +35,36 @@ function! s:NERDTree.CloseIfQuitOnOpen() endif endfunction +"FUNCTION: s:NERDTree.CursorToBookmarkTable(){{{1 +"Places the cursor at the top of the bookmarks table +function! s:NERDTree.CursorToBookmarkTable() + if !b:NERDTreeShowBookmarks + throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active" + endif + + if g:NERDTreeMinimalUI + return cursor(1, 2) + endif + + let rootNodeLine = b:NERDTree.ui.getRootLineNum() + + let line = 1 + while getline(line) !~# '^>-\+Bookmarks-\+$' + let line = line + 1 + if line >= rootNodeLine + throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table" + endif + endwhile + call cursor(line, 2) +endfunction + +"FUNCTION: s:NERDTree.CursorToTreeWin(){{{1 +"Places the cursor in the nerd tree window +function! s:NERDTree.CursorToTreeWin() + call g:NERDTree.MustBeOpen() + call nerdtree#exec(g:NERDTree.GetWinNum() . "wincmd w") +endfunction + " Function: s:NERDTree.ExistsForBuffer() {{{1 " Returns 1 if a nerd tree root exists in the current buffer function! s:NERDTree.ExistsForBuf() diff --git a/lib/nerdtree/opener.vim b/lib/nerdtree/opener.vim index 6dea3b0..cd6619b 100644 --- a/lib/nerdtree/opener.vim +++ b/lib/nerdtree/opener.vim @@ -189,7 +189,7 @@ function! s:Opener._newSplit() try exec(splitMode." sp ") catch /^Vim\%((\a\+)\)\=:E37/ - call nerdtree#putCursorInTreeWin() + call g:NERDTree.CursorToTreeWin() throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified." catch /^Vim\%((\a\+)\)\=:/ "do nothing @@ -219,7 +219,7 @@ function! s:Opener._newVSplit() vnew "resize the nerd tree back to the original size - call nerdtree#putCursorInTreeWin() + call g:NERDTree.CursorToTreeWin() exec("silent vertical resize ". winwidth) call nerdtree#exec('wincmd p') endfunction @@ -288,7 +288,7 @@ function! s:Opener._previousWindow() call nerdtree#exec('wincmd p') endif catch /^Vim\%((\a\+)\)\=:E37/ - call nerdtree#putCursorInTreeWin() + call g:NERDTree.CursorToTreeWin() throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified." catch /^Vim\%((\a\+)\)\=:/ echo v:exception diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index b33fc8b..dfe96a3 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -171,7 +171,7 @@ function! s:UI.getPath(ln) let indent = self._indentLevelFor(line) "remove the tree parts and the leading space - let curFile = nerdtree#stripMarkupFromLine(line, 0) + let curFile = self._stripMarkup(line, 0) let wasdir = 0 if curFile =~# '/$' @@ -184,7 +184,7 @@ function! s:UI.getPath(ln) while lnum > 0 let lnum = lnum - 1 let curLine = getline(lnum) - let curLineStripped = nerdtree#stripMarkupFromLine(curLine, 1) + let curLineStripped = self._stripMarkup(curLine, 1) "have we reached the top of the tree? if lnum == rootLine @@ -235,7 +235,7 @@ function! s:UI.getLineNum(file_node) let indent = self._indentLevelFor(curLine) if indent ==# curPathComponent - let curLine = nerdtree#stripMarkupFromLine(curLine, 1) + let curLine = self._stripMarkup(curLine, 1) let curPath = join(pathcomponents, '/') . '/' . curLine if stridx(fullpath, curPath, 0) ==# 0 @@ -289,6 +289,23 @@ function! s:UI.MarkupReg() return '^[ `|]*[\-+~]' endfunction +"FUNCTION: s:UI._renderBookmarks {{{1 +function! s:UI._renderBookmarks() + + if g:NERDTreeMinimalUI == 0 + call setline(line(".")+1, ">----------Bookmarks----------") + call cursor(line(".")+1, col(".")) + endif + + for i in g:NERDTreeBookmark.Bookmarks() + call setline(line(".")+1, i.str()) + call cursor(line(".")+1, col(".")) + endfor + + call setline(line(".")+1, '') + call cursor(line(".")+1, col(".")) +endfunction + "FUNCTION: s:UI.restoreScreenState() {{{1 " "Sets the screen state back to what it was when nerdtree#saveScreenState was last @@ -315,7 +332,7 @@ endfunction function! s:UI.saveScreenState() let win = winnr() try - call nerdtree#putCursorInTreeWin() + call g:NERDTree.CursorToTreeWin() let self._screenState = {} let self._screenState['oldPos'] = getpos(".") let self._screenState['oldTopLine'] = line("w0") @@ -325,6 +342,46 @@ function! s:UI.saveScreenState() endtry endfunction +"FUNCTION: s:UI._stripMarkup(line, removeLeadingSpaces){{{1 +"returns the given line with all the tree parts stripped off +" +"Args: +"line: the subject line +"removeLeadingSpaces: 1 if leading spaces are to be removed (leading spaces = +"any spaces before the actual text of the node) +function! s:UI._stripMarkup(line, removeLeadingSpaces) + let line = a:line + "remove the tree parts and the leading space + let line = substitute (line, g:NERDTreeUI.MarkupReg(),"","") + + "strip off any read only flag + let line = substitute (line, ' \[RO\]', "","") + + "strip off any bookmark flags + let line = substitute (line, ' {[^}]*}', "","") + + "strip off any executable flags + let line = substitute (line, '*\ze\($\| \)', "","") + + "strip off any generic flags + let line = substitute (line, '\[[^]]*\]', "","") + + let wasdir = 0 + if line =~# '/$' + let wasdir = 1 + endif + let line = substitute (line,' -> .*',"","") " remove link to + if wasdir ==# 1 + let line = substitute (line, '/\?$', '/', "") + endif + + if a:removeLeadingSpaces + let line = substitute (line, '^ *', '', '') + endif + + return line +endfunction + "FUNCTION: s:UI.render() {{{1 function! s:UI.render() setlocal modifiable @@ -347,7 +404,7 @@ function! s:UI.render() endif if b:NERDTreeShowBookmarks - call nerdtree#renderBookmarks() + call self._renderBookmarks() endif "add the 'up a dir' line @@ -415,7 +472,7 @@ function! s:UI.toggleShowBookmarks() let b:NERDTreeShowBookmarks = !b:NERDTreeShowBookmarks if b:NERDTreeShowBookmarks call b:NERDTree.render() - call nerdtree#putCursorOnBookmarkTable() + call g:NERDTree.CursorToBookmarkTable() else call b:NERDTree.ui.renderViewSavingPosition() endif diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index 8038668..3eae93b 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -186,7 +186,7 @@ endfunction function! NERDTreeFocus() if g:NERDTree.IsOpen() - call nerdtree#putCursorInTreeWin() + call g:NERDTree.CursorToTreeWin() else call g:NERDTreeCreator.TogglePrimary("") endif From fc4bcb4806bb7f6c123ced3e1caa4ccfc141b00e Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 15:26:15 +0100 Subject: [PATCH 24/48] remove UI.lolcats()... not sure what the story is there --- lib/nerdtree/ui.vim | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index dfe96a3..417e6ae 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -3,11 +3,6 @@ let s:UI = {} let g:NERDTreeUI = s:UI - -function! s:UI.lolcats() - echomsg "lolcats" -endfunction - "FUNCTION: s:UI.centerView() {{{2 "centers the nerd tree window around the cursor (provided the nerd tree "options permit) From 64a9579c11b63e2fe0242d45ca12455a7a7d2833 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sat, 2 May 2015 22:20:59 +0100 Subject: [PATCH 25/48] add a path filter API Add an API to allow custom "path filter callbacks" to be added. Previously we allowed one path filtering function to exist called `NERDTreeCustomIgnoreFilter`. This has been removed and replaced with an API to allow any number of such functions to exist - via the new `NERDTreeAddPathFilter()` --- lib/nerdtree/nerdtree.vim | 14 ++++++++++++++ lib/nerdtree/path.vim | 10 ++++++---- plugin/NERD_tree.vim | 5 +++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/lib/nerdtree/nerdtree.vim b/lib/nerdtree/nerdtree.vim index 8e3bdde..55f3dd7 100644 --- a/lib/nerdtree/nerdtree.vim +++ b/lib/nerdtree/nerdtree.vim @@ -3,6 +3,11 @@ let s:NERDTree = {} let g:NERDTree = s:NERDTree +"FUNCTION: s:NERDTree.AddPathFilter() {{{1 +function! s:NERDTree.AddPathFilter(callback) + call add(s:NERDTree.PathFilters(), a:callback) +endfunction + "FUNCTION: s:NERDTree.Close() {{{1 "Closes the primary NERD tree window for this tab function! s:NERDTree.Close() @@ -116,6 +121,15 @@ function! s:NERDTree.New(path) return newObj endfunction +"FUNCTION: s:NERDTree.PathFilters() {{{1 +function! s:NERDTree.PathFilters() + if !exists('s:NERDTree._PathFilters') + let s:NERDTree._PathFilters = [] + endif + return s:NERDTree._PathFilters +endfunction + + "FUNCTION: s:NERDTree.render() {{{1 "A convenience function - since this is called often function! s:NERDTree.render() diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index dbecb02..48793eb 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -392,6 +392,12 @@ function! s:Path.ignore() return 1 endif endfor + + for callback in g:NERDTree.PathFilters() + if {callback}({'path': self, 'nerdtree': b:NERDTree}) + return 1 + endif + endfor endif "dont show hidden files unless instructed to @@ -403,10 +409,6 @@ function! s:Path.ignore() return 1 endif - if exists("*NERDTreeCustomIgnoreFilter") && NERDTreeCustomIgnoreFilter(self) - return 1 - endif - return 0 endfunction diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index 3eae93b..ed769e9 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -196,6 +196,11 @@ function! NERDTreeCWD() call NERDTreeFocus() call nerdtree#ui_glue#chRootCwd() endfunction + +function! NERDTreeAddPathFilter(callback) + call g:NERDTree.AddPathFilter(a:callback) +endfunction + " SECTION: Post Source Actions {{{1 call nerdtree#postSourceActions() From 7270212214660961df9a06846cdd4a36cf1b6fc0 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sun, 3 May 2015 11:14:34 +0100 Subject: [PATCH 26/48] bugfix for secondary trees occurring when the screen state is saved --- lib/nerdtree/ui.vim | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 417e6ae..41ec21d 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -325,16 +325,20 @@ endfunction "Saves the current cursor position in the current buffer and the window "scroll position function! s:UI.saveScreenState() + + "FIXME: b:NERDTreeType should really me moved to b:NERDTree.type. Update + "this when that refactor is done + if b:NERDTreeType == "secondary" + return + endif + let win = winnr() - try - call g:NERDTree.CursorToTreeWin() - let self._screenState = {} - let self._screenState['oldPos'] = getpos(".") - let self._screenState['oldTopLine'] = line("w0") - let self._screenState['oldWindowSize']= winwidth("") - call nerdtree#exec(win . "wincmd w") - catch /^NERDTree.InvalidOperationError/ - endtry + call g:NERDTree.CursorToTreeWin() + let self._screenState = {} + let self._screenState['oldPos'] = getpos(".") + let self._screenState['oldTopLine'] = line("w0") + let self._screenState['oldWindowSize']= winwidth("") + call nerdtree#exec(win . "wincmd w") endfunction "FUNCTION: s:UI._stripMarkup(line, removeLeadingSpaces){{{1 From da3874cf933e3736f9a8d1a2cfe35943d88fa94b Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Mon, 4 May 2015 20:25:03 +0100 Subject: [PATCH 27/48] fix a bug when opening files in a new tab On bufleave we save the nerdtree window state. However, sometimes when bufleave is triggered the tree is no longer open in this tab - e.g. for secondary trees or mappings that open in another tab. Dont bother saving screen state in these cases as the code doing the saving assumes the tree is available in this tab. --- lib/nerdtree/ui.vim | 7 ------- plugin/NERD_tree.vim | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 41ec21d..22e450c 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -325,13 +325,6 @@ endfunction "Saves the current cursor position in the current buffer and the window "scroll position function! s:UI.saveScreenState() - - "FIXME: b:NERDTreeType should really me moved to b:NERDTree.type. Update - "this when that refactor is done - if b:NERDTreeType == "secondary" - return - endif - let win = winnr() call g:NERDTree.CursorToTreeWin() let self._screenState = {} diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index 3eae93b..bd911c6 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -148,7 +148,7 @@ call nerdtree#ui_glue#setupCommands() "============================================================ augroup NERDTree "Save the cursor position whenever we close the nerd tree - exec "autocmd BufLeave ". g:NERDTreeCreator.BufNamePrefix() ."* call b:NERDTree.ui.saveScreenState()" + exec "autocmd BufLeave ". g:NERDTreeCreator.BufNamePrefix() ."* if g:NERDTree.IsOpen() | call b:NERDTree.ui.saveScreenState() | endif" "disallow insert mode in the NERDTree exec "autocmd BufEnter ". g:NERDTreeCreator.BufNamePrefix() ."* stopinsert" From 5c2060149f52b31786e9003222d3dc54ba80fed9 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Wed, 6 May 2015 21:19:06 +0100 Subject: [PATCH 28/48] doc NERDTreeAddPathFilter() --- doc/NERD_tree.txt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/doc/NERD_tree.txt b/doc/NERD_tree.txt index 85dfba6..6418b57 100644 --- a/doc/NERD_tree.txt +++ b/doc/NERD_tree.txt @@ -34,6 +34,7 @@ CONTENTS *NERDTree-contents* 4.The NERD tree API.......................|NERDTreeAPI| 4.1.Key map API.......................|NERDTreeKeymapAPI| 4.2.Menu API..........................|NERDTreeMenuAPI| + 4.3.Menu API..........................|NERDTreeAddPathFilter()| 5.About...................................|NERDTreeAbout| 6.Changelog...............................|NERDTreeChangelog| 7.Credits.................................|NERDTreeCredits| @@ -1173,6 +1174,24 @@ Where selecting "a (s)ub menu" will lead to a second menu: > When any of the 3 concrete menu items are selected the function "SomeFunction" will be called. +------------------------------------------------------------------------------ +4.3 NERDTreeAddPathFilter(callback) *NERDTreeAddPathFilter()* + +Path filters are essentially a more powerful version of |NERDTreeIgnore|. +If the simple regex matching in |NERDTreeIgnore| is not enough then use +|NERDTreeAddPathFilter()| to add a callback function that paths will be +checked against when the decision to ignore them is made. Example > + + call NERDTreeAddPathFilter('MyFilter') + + function! MyFilter(params) + "params is a dict containing keys: 'nerdtree' and 'path' which are + "g:NERDTree and g:NERDTreePath objects + + "return 1 to ignore params['path'] or 0 otherwise + endfunction +< + ------------------------------------------------------------------------------ NERDTreeRender() *NERDTreeRender()* Re-renders the NERD tree buffer. Useful if you change the state of the @@ -1203,6 +1222,7 @@ Next - add 'scope' argument to the key map API - add NERDTreeCustomIgnoreFilter hook - needs doc - add magic [[dir]] and [[file]] flags to NERDTreeIgnore + - add support for custom path filters. See :help NERDTreeAddPathFilter() 4.2.0 - Add NERDTreeDirArrows option to make the UI use pretty arrow chars From 1f2531ec3ac2c306e61a98e974b6db2c6099f2cc Mon Sep 17 00:00:00 2001 From: Vincent Tsang Date: Sat, 9 May 2015 22:38:16 +0800 Subject: [PATCH 29/48] Speed up sortChildren() by using sorting token This improves the sorting functions from 12 seconds to 0.66 seconds for ~4000 objects --- autoload/nerdtree.vim | 12 ++++++++++++ lib/nerdtree/tree_dir_node.vim | 19 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index 22283aa..cf044fd 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -34,6 +34,18 @@ function! nerdtree#compareNodes(n1, n2) return a:n1.path.compareTo(a:n2.path) endfunction +"FUNCTION: nerdtree#compareNodesBySortingToken(n1, n2) {{{2 +function! nerdtree#compareNodesBySortingToken(n1, n2) + return a:n1.path.compareTo(a:n2.path) + if a:n1.sorting_token < a:n2.sorting_token + return -1 + elseif a:n1.sorting_token > a:n2.sorting_token + return 1 + else + return 0 + endif +endfunction + " FUNCTION: nerdtree#deprecated(func, [msg]) {{{2 " Issue a deprecation warning for a:func. If a second arg is given, use this " as the deprecation message diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index a24c270..9a7f45a 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -504,7 +504,24 @@ endfunction "directory priority. " function! s:TreeDirNode.sortChildren() - let CompareFunc = function("nerdtree#compareNodes") + let CompareFunc = function("nerdtree#compareNodesBySortingToken") + " To optimize sorting, let's generate the sorting token for comparison + + " calculate how large number is needed to represent " order index + let digit = ceil(log10(len(g:NERDTreeSortOrder))) + let format = "%0" . float2nr(digit) . "d" " e.g. '%04d' + + for child in self.children + let path = child.path.getLastPathComponent(1) + if !g:NERDTreeSortHiddenFirst + let path = substitute(path, '^[._]', '', '') + endif + if !g:NERDTreeCaseSensitiveSort + let path = tolower(path) + endif + let child.sorting_token = printf(format, child.path.getSortOrderIndex()) . path + endfor + call sort(self.children, CompareFunc) endfunction From 57d5bd773101a86c7983b5b0755cd3720ea8be0c Mon Sep 17 00:00:00 2001 From: Vincent Tsang Date: Sat, 9 May 2015 22:38:16 +0800 Subject: [PATCH 30/48] Speed up sortChildren() by using sorting token This improves the sorting functions from 12 seconds to 0.66 seconds for ~4000 objects --- autoload/nerdtree.vim | 11 +++++++++++ lib/nerdtree/tree_dir_node.vim | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index 22283aa..0a7e4c7 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -34,6 +34,17 @@ function! nerdtree#compareNodes(n1, n2) return a:n1.path.compareTo(a:n2.path) endfunction +"FUNCTION: nerdtree#compareNodesBySortingToken(n1, n2) {{{2 +function! nerdtree#compareNodesBySortingToken(n1, n2) + if a:n1.sorting_token < a:n2.sorting_token + return -1 + elseif a:n1.sorting_token > a:n2.sorting_token + return 1 + else + return 0 + endif +endfunction + " FUNCTION: nerdtree#deprecated(func, [msg]) {{{2 " Issue a deprecation warning for a:func. If a second arg is given, use this " as the deprecation message diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index a24c270..9a7f45a 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -504,7 +504,24 @@ endfunction "directory priority. " function! s:TreeDirNode.sortChildren() - let CompareFunc = function("nerdtree#compareNodes") + let CompareFunc = function("nerdtree#compareNodesBySortingToken") + " To optimize sorting, let's generate the sorting token for comparison + + " calculate how large number is needed to represent " order index + let digit = ceil(log10(len(g:NERDTreeSortOrder))) + let format = "%0" . float2nr(digit) . "d" " e.g. '%04d' + + for child in self.children + let path = child.path.getLastPathComponent(1) + if !g:NERDTreeSortHiddenFirst + let path = substitute(path, '^[._]', '', '') + endif + if !g:NERDTreeCaseSensitiveSort + let path = tolower(path) + endif + let child.sorting_token = printf(format, child.path.getSortOrderIndex()) . path + endfor + call sort(self.children, CompareFunc) endfunction From 80e184df5615b9f4181abec289437b7fc07b8b5d Mon Sep 17 00:00:00 2001 From: Vincent Tsang Date: Mon, 11 May 2015 11:56:08 +0800 Subject: [PATCH 31/48] Refactor code to use getSortKey() and replace regular expression with simple string comparison in tree_dir_node.vim --- autoload/nerdtree.vim | 8 ++++---- lib/nerdtree/path.vim | 21 ++++++++++++++++++++ lib/nerdtree/tree_dir_node.vim | 35 ++++++++++++++-------------------- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index 0a7e4c7..d16cd66 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -34,11 +34,11 @@ function! nerdtree#compareNodes(n1, n2) return a:n1.path.compareTo(a:n2.path) endfunction -"FUNCTION: nerdtree#compareNodesBySortingToken(n1, n2) {{{2 -function! nerdtree#compareNodesBySortingToken(n1, n2) - if a:n1.sorting_token < a:n2.sorting_token +"FUNCTION: nerdtree#compareNodesBySortKey(n1, n2) {{{2 +function! nerdtree#compareNodesBySortKey(n1, n2) + if a:n1.path.getSortKey() < a:n2.path.getSortKey() return -1 - elseif a:n1.sorting_token > a:n2.sorting_token + elseif a:n1.path.getSortKey() > a:n2.path.getSortKey() return 1 else return 0 diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 48793eb..4553418 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -1,6 +1,9 @@ "we need to use this number many times for sorting... so we calculate it only "once here let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') +" used in formating sortKey, e.g. '%04d' +let s:format = "%0" . float2nr(ceil(log10(len(g:NERDTreeSortOrder)))) . "d" + "CLASS: Path "============================================================ @@ -361,6 +364,24 @@ function! s:Path.getSortOrderIndex() return s:NERDTreeSortStarIndex endfunction +"FUNCTION: Path.getSortKey() {{{1 +"returns a string used in compare function for sorting +function! s:Path.getSortKey() + if !exists("self.sortKey") + let path = self.getLastPathComponent(1) + if !g:NERDTreeSortHiddenFirst + let path = substitute(path, '^[._]', '', '') + endif + if !g:NERDTreeCaseSensitiveSort + let path = tolower(path) + endif + let self.sortKey = printf(s:format, self.getSortOrderIndex()) . path + endif + + return self.sortKey +endfunction + + "FUNCTION: Path.isUnixHiddenFile() {{{1 "check for unix hidden files function! s:Path.isUnixHiddenFile() diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index 9a7f45a..4d8fd40 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -246,8 +246,13 @@ function! s:TreeDirNode._initChildren(silent) "filter out the .. and . directories "Note: we must match .. AND ../ cos sometimes the globpath returns "../ for path with strange chars (eg $) - if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' - +" if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' +" + " 20150511 + " Regular expression is too expensive. Use simply string comparison + " instead + if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." && + \ i[len(i)-2:1] != "." && i[len(i)-1] != "." "put the next file in a new node and attach it try let path = g:NERDTreePath.New(i) @@ -405,8 +410,13 @@ function! s:TreeDirNode.refresh() "filter out the .. and . directories "Note: we must match .. AND ../ cos sometimes the globpath returns "../ for path with strange chars (eg $) - if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' + "if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' + " 20150511 + " Regular expression is too expensive. Use simply string comparison + " instead + if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." && + \ i[len(i)-2:1] != "." && i[len(i)-1] != "." try "create a new path and see if it exists in this nodes children let path = g:NERDTreePath.New(i) @@ -504,24 +514,7 @@ endfunction "directory priority. " function! s:TreeDirNode.sortChildren() - let CompareFunc = function("nerdtree#compareNodesBySortingToken") - " To optimize sorting, let's generate the sorting token for comparison - - " calculate how large number is needed to represent " order index - let digit = ceil(log10(len(g:NERDTreeSortOrder))) - let format = "%0" . float2nr(digit) . "d" " e.g. '%04d' - - for child in self.children - let path = child.path.getLastPathComponent(1) - if !g:NERDTreeSortHiddenFirst - let path = substitute(path, '^[._]', '', '') - endif - if !g:NERDTreeCaseSensitiveSort - let path = tolower(path) - endif - let child.sorting_token = printf(format, child.path.getSortOrderIndex()) . path - endfor - + let CompareFunc = function("nerdtree#compareNodesBySortKey") call sort(self.children, CompareFunc) endfunction From 10261d60a05c3a2237a2b5e47df9235d52430e57 Mon Sep 17 00:00:00 2001 From: Vincent Tsang Date: Mon, 11 May 2015 11:59:10 +0800 Subject: [PATCH 32/48] Updated the comment --- lib/nerdtree/tree_dir_node.vim | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim index 4d8fd40..765982d 100644 --- a/lib/nerdtree/tree_dir_node.vim +++ b/lib/nerdtree/tree_dir_node.vim @@ -248,7 +248,6 @@ function! s:TreeDirNode._initChildren(silent) "../ for path with strange chars (eg $) " if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' " - " 20150511 " Regular expression is too expensive. Use simply string comparison " instead if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." && @@ -412,7 +411,6 @@ function! s:TreeDirNode.refresh() "../ for path with strange chars (eg $) "if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' - " 20150511 " Regular expression is too expensive. Use simply string comparison " instead if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." && From dfe260d1d7436367a5e38c8e34a3feae3c7b06b0 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Tue, 12 May 2015 20:45:15 +0100 Subject: [PATCH 33/48] doc the path listener API --- doc/NERD_tree.txt | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/doc/NERD_tree.txt b/doc/NERD_tree.txt index 6418b57..cfc8ed9 100644 --- a/doc/NERD_tree.txt +++ b/doc/NERD_tree.txt @@ -35,6 +35,7 @@ CONTENTS *NERDTree-contents* 4.1.Key map API.......................|NERDTreeKeymapAPI| 4.2.Menu API..........................|NERDTreeMenuAPI| 4.3.Menu API..........................|NERDTreeAddPathFilter()| + 4.4.Path Listener API.................|NERDTreePathListenerAPI| 5.About...................................|NERDTreeAbout| 6.Changelog...............................|NERDTreeChangelog| 7.Credits.................................|NERDTreeCredits| @@ -1191,6 +1192,26 @@ checked against when the decision to ignore them is made. Example > "return 1 to ignore params['path'] or 0 otherwise endfunction < +------------------------------------------------------------------------------ +4.4 Path Listener API *NERDTreePathListenerAPI* + +Use this API if you want to run a callback for events on Path objects. E.G > + + call g:NERDTreePathNotifier.AddListener("init", "MyListener") + + ".... + + function! MyListener(event) + "This function will be called whenever a Path object is created. + + "a:event is an object that contains a bunch of relevant info - + "including the path in question. See lib/event.vim for details. + endfunction +< +Current events supported: + init ~ + refresh ~ + refreshFlags ~ ------------------------------------------------------------------------------ NERDTreeRender() *NERDTreeRender()* @@ -1223,6 +1244,7 @@ Next - add NERDTreeCustomIgnoreFilter hook - needs doc - add magic [[dir]] and [[file]] flags to NERDTreeIgnore - add support for custom path filters. See :help NERDTreeAddPathFilter() + - add path listener API. See :help NERDTreePathListenerAPI. 4.2.0 - Add NERDTreeDirArrows option to make the UI use pretty arrow chars From 2c1ebc37b2b92ff0d6197b543d02584e28005ee8 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Tue, 12 May 2015 20:57:49 +0100 Subject: [PATCH 34/48] add an FAQ about highlighting file with certain extensions Closes #433 --- README.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.markdown b/README.markdown index 880079a..851071e 100644 --- a/README.markdown +++ b/README.markdown @@ -101,3 +101,7 @@ Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever ke Stick this in your vimrc: `autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif` + +> Can I have different highlighting for different file extensions? + +See here: https://github.com/scrooloose/nerdtree/issues/433#issuecomment-92590696 From 6018af36bf376a2b881e2b3a035adf9898406b2e Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Tue, 12 May 2015 20:58:35 +0100 Subject: [PATCH 35/48] pretty up some FAQ code blocks --- README.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.markdown b/README.markdown index 851071e..0317e62 100644 --- a/README.markdown +++ b/README.markdown @@ -94,13 +94,13 @@ Stick this in your vimrc Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever key you want): -`map :NERDTreeToggle` + map :NERDTreeToggle > How can I close vim if the only window left open is a NERDTree? Stick this in your vimrc: - `autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif` + autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif > Can I have different highlighting for different file extensions? From 99fa465b5d103dba2c9009c84b2eaada6a431675 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Wed, 13 May 2015 20:26:16 +0100 Subject: [PATCH 36/48] fix syntax error --- lib/nerdtree/path.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 4553418..5455395 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -634,7 +634,7 @@ function! s:Path.str(...) if has_key(self, '_strFor' . format) exec 'let toReturn = self._strFor' . format . '()' else - raise 'NERDTree.UnknownFormatError: unknown format "'. format .'"' + throw 'NERDTree.UnknownFormatError: unknown format "'. format .'"' endif else let toReturn = self._str() From af85499edace2acca27ce41790ac333f62b689bb Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Wed, 13 May 2015 20:29:03 +0100 Subject: [PATCH 37/48] rename 2 sort key related vars rename s:format to s:sortKeyFormat - purely for descriptive reasons rename self.sortKey to self._sortKey - the convention is to use leading underscores to indicate private vars --- lib/nerdtree/path.vim | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index 5455395..c0242d0 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -2,7 +2,7 @@ "once here let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') " used in formating sortKey, e.g. '%04d' -let s:format = "%0" . float2nr(ceil(log10(len(g:NERDTreeSortOrder)))) . "d" +let s:sortKeyFormat = "%0" . float2nr(ceil(log10(len(g:NERDTreeSortOrder)))) . "d" "CLASS: Path @@ -367,7 +367,7 @@ endfunction "FUNCTION: Path.getSortKey() {{{1 "returns a string used in compare function for sorting function! s:Path.getSortKey() - if !exists("self.sortKey") + if !exists("self._sortKey") let path = self.getLastPathComponent(1) if !g:NERDTreeSortHiddenFirst let path = substitute(path, '^[._]', '', '') @@ -375,10 +375,10 @@ function! s:Path.getSortKey() if !g:NERDTreeCaseSensitiveSort let path = tolower(path) endif - let self.sortKey = printf(s:format, self.getSortOrderIndex()) . path + let self._sortKey = printf(s:sortKeyFormat, self.getSortOrderIndex()) . path endif - return self.sortKey + return self._sortKey endfunction From 013c607ba4bc2e459f3f5f70a69f9f13bcf77f35 Mon Sep 17 00:00:00 2001 From: Rick van Hattem Date: Fri, 22 May 2015 13:14:01 +0200 Subject: [PATCH 38/48] Fixed incompatibility with older Vim versions Fixed incompatibility with older Vim versions that are compiled without float function support such as `log10` and `ceil` This fixes #452 --- lib/nerdtree/path.vim | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim index c0242d0..2af07dd 100644 --- a/lib/nerdtree/path.vim +++ b/lib/nerdtree/path.vim @@ -2,8 +2,11 @@ "once here let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') " used in formating sortKey, e.g. '%04d' -let s:sortKeyFormat = "%0" . float2nr(ceil(log10(len(g:NERDTreeSortOrder)))) . "d" - +if exists("log10") + let s:sortKeyFormat = "%0" . float2nr(ceil(log10(len(g:NERDTreeSortOrder)))) . "d" +else + let s:sortKeyFormat = "%04d" +endif "CLASS: Path "============================================================ From 93c9726c6d96289d6daa59bfb277dff68efa42ba Mon Sep 17 00:00:00 2001 From: toiffel Date: Mon, 13 Jul 2015 03:03:14 +0600 Subject: [PATCH 39/48] Fixed case-sensitive sorting of tree nodes when 'ignorecase' option is on --- autoload/nerdtree.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/nerdtree.vim b/autoload/nerdtree.vim index d16cd66..37d7d10 100644 --- a/autoload/nerdtree.vim +++ b/autoload/nerdtree.vim @@ -36,9 +36,9 @@ endfunction "FUNCTION: nerdtree#compareNodesBySortKey(n1, n2) {{{2 function! nerdtree#compareNodesBySortKey(n1, n2) - if a:n1.path.getSortKey() < a:n2.path.getSortKey() + if a:n1.path.getSortKey() <# a:n2.path.getSortKey() return -1 - elseif a:n1.path.getSortKey() > a:n2.path.getSortKey() + elseif a:n1.path.getSortKey() ># a:n2.path.getSortKey() return 1 else return 0 From 37f7a6cbe1d28847425e3af1e2975c705222a8f8 Mon Sep 17 00:00:00 2001 From: egalpin Date: Thu, 30 Jul 2015 08:52:17 -0400 Subject: [PATCH 40/48] Update README.markdown Add apt-vim installation recipe. --- README.markdown | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 0317e62..571a655 100644 --- a/README.markdown +++ b/README.markdown @@ -55,7 +55,7 @@ The following features and functionality are provided by the NERD tree: Installation ------------ -[pathogen.vim](https://github.com/tpope/vim-pathogen) is the recommended way to install nerdtree. +####[pathogen.vim](https://github.com/tpope/vim-pathogen) cd ~/.vim/bundle git clone https://github.com/scrooloose/nerdtree.git @@ -63,6 +63,12 @@ Installation Then reload vim, run `:Helptags`, and check out `:help NERD_tree.txt`. +####[apt-vim](https://github.com/egalpin/apt-vim) + + apt-vim install -y https://github.com/scrooloose/nerdtree.git + + + Faq --- From f5fd121837493e719caecf7cbed94fbbe5413d55 Mon Sep 17 00:00:00 2001 From: Den Date: Thu, 30 Jul 2015 16:28:11 +0300 Subject: [PATCH 41/48] Incorrect path to event.vim --- doc/NERD_tree.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/NERD_tree.txt b/doc/NERD_tree.txt index cfc8ed9..fbca0e1 100644 --- a/doc/NERD_tree.txt +++ b/doc/NERD_tree.txt @@ -1205,7 +1205,7 @@ Use this API if you want to run a callback for events on Path objects. E.G > "This function will be called whenever a Path object is created. "a:event is an object that contains a bunch of relevant info - - "including the path in question. See lib/event.vim for details. + "including the path in question. See lib/nerdtree/event.vim for details. endfunction < Current events supported: From 188bd9265892bbd03320e51ad01c253dfd98993f Mon Sep 17 00:00:00 2001 From: Igor Tatarintsev Date: Fri, 11 Sep 2015 23:44:06 +0600 Subject: [PATCH 42/48] Added global variables for changing default arrows --- README.markdown | 8 ++++++++ autoload/nerdtree/ui_glue.vim | 2 +- lib/nerdtree/tree_file_node.vim | 4 ++-- lib/nerdtree/ui.vim | 8 ++++---- plugin/NERD_tree.vim | 2 ++ syntax/nerdtree.vim | 9 +++++---- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/README.markdown b/README.markdown index 0317e62..bc2741f 100644 --- a/README.markdown +++ b/README.markdown @@ -105,3 +105,11 @@ Stick this in your vimrc: > Can I have different highlighting for different file extensions? See here: https://github.com/scrooloose/nerdtree/issues/433#issuecomment-92590696 + +> How can I change default arrows? + +Use these variables in your vimrc. Note that below are default arrow symbols + + let g:NERDTreeDirArrows = 1 + let g:NERDTreeDirArrowExpandable = '▸' + let g:NERDTreeDirArrowCollapsable = '▾' diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index 1f922df..e706ee5 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -312,7 +312,7 @@ function! s:handleLeftClick() endfor if currentNode.path.isDirectory - if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~▾▸] \?$' + if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.'] \?$' call currentNode.activate() return endif diff --git a/lib/nerdtree/tree_file_node.vim b/lib/nerdtree/tree_file_node.vim index b4924d7..5c38641 100644 --- a/lib/nerdtree/tree_file_node.vim +++ b/lib/nerdtree/tree_file_node.vim @@ -383,13 +383,13 @@ function! s:TreeFileNode._renderToString(depth, drawText, vertMap, isLastChild) if self.path.isDirectory if self.isOpen if g:NERDTreeDirArrows - let treeParts = treeParts . '▾ ' + let treeParts = treeParts . g:NERDTreeDirArrowCollapsable . ' ' else let treeParts = treeParts . '~' endif else if g:NERDTreeDirArrows - let treeParts = treeParts . '▸ ' + let treeParts = treeParts . g:NERDTreeDirArrowExpandable . ' ' else let treeParts = treeParts . '+' endif diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 22e450c..5632ab0 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -154,7 +154,7 @@ function! s:UI.getPath(ln) if !g:NERDTreeDirArrows " in case called from outside the tree - if line !~# '^ *[|`▸▾ ]' || line =~# '^$' + if line !~# '^ *[|`'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.' ]' || line =~# '^$' return {} endif endif @@ -261,9 +261,9 @@ endfunction "FUNCTION: s:UI._indentLevelFor(line) {{{1 function! s:UI._indentLevelFor(line) - let level = match(a:line, '[^ \-+~▸▾`|]') / s:UI.IndentWid() + let level = match(a:line, '[^ \-+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.'`|]') / s:UI.IndentWid() " check if line includes arrows - if match(a:line, '[▸▾]') > -1 + if match(a:line, '['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.]') > -1 " decrement level as arrow uses 3 ascii chars let level = level - 1 endif @@ -278,7 +278,7 @@ endfunction "FUNCTION: s:UI.MarkupReg() {{{1 function! s:UI.MarkupReg() if g:NERDTreeDirArrows - return '^\([▾▸] \| \+[▾▸] \| \+\)' + return '^\(['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.'] \| \+['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.'] \| \+\)' endif return '^[ `|]*[\-+~]' diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index 966838c..7b3dff0 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -68,6 +68,8 @@ call s:initVariable("g:NERDTreeShowHidden", 0) call s:initVariable("g:NERDTreeShowLineNumbers", 0) call s:initVariable("g:NERDTreeSortDirs", 1) call s:initVariable("g:NERDTreeDirArrows", !nerdtree#runningWindows()) +call s:initVariable("g:NERDTreeDirArrowExpandable", "▸") +call s:initVariable("g:NERDTreeDirArrowCollapsable", "▾") call s:initVariable("g:NERDTreeCascadeOpenSingleChildDir", 1) if !exists("g:NERDTreeSortOrder") diff --git a/syntax/nerdtree.vim b/syntax/nerdtree.vim index 5f7b49c..1d09788 100644 --- a/syntax/nerdtree.vim +++ b/syntax/nerdtree.vim @@ -23,12 +23,13 @@ syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir syn match NERDTreeDirSlash #/# containedin=NERDTreeDir if g:NERDTreeDirArrows - syn match NERDTreeClosable #▾# containedin=NERDTreeDir,NERDTreeFile - syn match NERDTreeOpenable #▸# containedin=NERDTreeDir,NERDTreeFile + exec 'syn match NERDTreeClosable #'.g:NERDTreeDirArrowCollapsable.'# containedin=NERDTreeDir,NERDTreeFile' + exec 'syn match NERDTreeOpenable #'.g:NERDTreeDirArrowExpandable.'# containedin=NERDTreeDir,NERDTreeFile' - syn match NERDTreeDir #[^▾▸ ].*/# + let s:dirArrows = g:NERDTreeDirArrowCollapsable.g:NERDTreeDirArrowExpandable + exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#' syn match NERDTreeExecFile #^ .*\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark - syn match NERDTreeFile #^[^"\.▾▸] *[^▾▸]*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile + exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile' "highlighting for readonly files syn match NERDTreeRO # *\zs.*\ze \[RO\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile From dc29ec2db3e710cb4034acdcf94b0cc862446d03 Mon Sep 17 00:00:00 2001 From: Igor Tatarintsev Date: Fri, 11 Sep 2015 23:52:37 +0600 Subject: [PATCH 43/48] Added global variables for changing default arrows g:NERDTreeDirArrowExpandable g:NERDTreeDirArrowCollapsable --- README.markdown | 2 +- autoload/nerdtree/ui_glue.vim | 2 +- lib/nerdtree/tree_file_node.vim | 2 +- lib/nerdtree/ui.vim | 8 ++++---- plugin/NERD_tree.vim | 2 +- syntax/nerdtree.vim | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.markdown b/README.markdown index bc2741f..c11b135 100644 --- a/README.markdown +++ b/README.markdown @@ -112,4 +112,4 @@ Use these variables in your vimrc. Note that below are default arrow symbols let g:NERDTreeDirArrows = 1 let g:NERDTreeDirArrowExpandable = '▸' - let g:NERDTreeDirArrowCollapsable = '▾' + let g:NERDTreeDirArrowCollapsible = '▾' diff --git a/autoload/nerdtree/ui_glue.vim b/autoload/nerdtree/ui_glue.vim index e706ee5..dadb8f8 100644 --- a/autoload/nerdtree/ui_glue.vim +++ b/autoload/nerdtree/ui_glue.vim @@ -312,7 +312,7 @@ function! s:handleLeftClick() endfor if currentNode.path.isDirectory - if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.'] \?$' + if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \?$' call currentNode.activate() return endif diff --git a/lib/nerdtree/tree_file_node.vim b/lib/nerdtree/tree_file_node.vim index 5c38641..a3fe98f 100644 --- a/lib/nerdtree/tree_file_node.vim +++ b/lib/nerdtree/tree_file_node.vim @@ -383,7 +383,7 @@ function! s:TreeFileNode._renderToString(depth, drawText, vertMap, isLastChild) if self.path.isDirectory if self.isOpen if g:NERDTreeDirArrows - let treeParts = treeParts . g:NERDTreeDirArrowCollapsable . ' ' + let treeParts = treeParts . g:NERDTreeDirArrowCollapsible . ' ' else let treeParts = treeParts . '~' endif diff --git a/lib/nerdtree/ui.vim b/lib/nerdtree/ui.vim index 5632ab0..74cee9c 100644 --- a/lib/nerdtree/ui.vim +++ b/lib/nerdtree/ui.vim @@ -154,7 +154,7 @@ function! s:UI.getPath(ln) if !g:NERDTreeDirArrows " in case called from outside the tree - if line !~# '^ *[|`'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.' ]' || line =~# '^$' + if line !~# '^ *[|`'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.' ]' || line =~# '^$' return {} endif endif @@ -261,9 +261,9 @@ endfunction "FUNCTION: s:UI._indentLevelFor(line) {{{1 function! s:UI._indentLevelFor(line) - let level = match(a:line, '[^ \-+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.'`|]') / s:UI.IndentWid() + let level = match(a:line, '[^ \-+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'`|]') / s:UI.IndentWid() " check if line includes arrows - if match(a:line, '['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.]') > -1 + if match(a:line, '['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.']') > -1 " decrement level as arrow uses 3 ascii chars let level = level - 1 endif @@ -278,7 +278,7 @@ endfunction "FUNCTION: s:UI.MarkupReg() {{{1 function! s:UI.MarkupReg() if g:NERDTreeDirArrows - return '^\(['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.'] \| \+['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsable.'] \| \+\)' + return '^\(['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \| \+['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \| \+\)' endif return '^[ `|]*[\-+~]' diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim index 7b3dff0..6fff0c3 100644 --- a/plugin/NERD_tree.vim +++ b/plugin/NERD_tree.vim @@ -69,7 +69,7 @@ call s:initVariable("g:NERDTreeShowLineNumbers", 0) call s:initVariable("g:NERDTreeSortDirs", 1) call s:initVariable("g:NERDTreeDirArrows", !nerdtree#runningWindows()) call s:initVariable("g:NERDTreeDirArrowExpandable", "▸") -call s:initVariable("g:NERDTreeDirArrowCollapsable", "▾") +call s:initVariable("g:NERDTreeDirArrowCollapsible", "▾") call s:initVariable("g:NERDTreeCascadeOpenSingleChildDir", 1) if !exists("g:NERDTreeSortOrder") diff --git a/syntax/nerdtree.vim b/syntax/nerdtree.vim index 1d09788..fd548cf 100644 --- a/syntax/nerdtree.vim +++ b/syntax/nerdtree.vim @@ -23,10 +23,10 @@ syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir syn match NERDTreeDirSlash #/# containedin=NERDTreeDir if g:NERDTreeDirArrows - exec 'syn match NERDTreeClosable #'.g:NERDTreeDirArrowCollapsable.'# containedin=NERDTreeDir,NERDTreeFile' + exec 'syn match NERDTreeClosable #'.g:NERDTreeDirArrowCollapsible.'# containedin=NERDTreeDir,NERDTreeFile' exec 'syn match NERDTreeOpenable #'.g:NERDTreeDirArrowExpandable.'# containedin=NERDTreeDir,NERDTreeFile' - let s:dirArrows = g:NERDTreeDirArrowCollapsable.g:NERDTreeDirArrowExpandable + let s:dirArrows = g:NERDTreeDirArrowCollapsible.g:NERDTreeDirArrowExpandable exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#' syn match NERDTreeExecFile #^ .*\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile' From 8c8c794104246d0d4f65cf23bc8bbb3722b4c3c2 Mon Sep 17 00:00:00 2001 From: Igor Tatarintsev Date: Tue, 15 Sep 2015 23:22:14 +0600 Subject: [PATCH 44/48] Added character escaping to syn match regexes --- syntax/nerdtree.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/syntax/nerdtree.vim b/syntax/nerdtree.vim index fd548cf..a48445a 100644 --- a/syntax/nerdtree.vim +++ b/syntax/nerdtree.vim @@ -23,10 +23,10 @@ syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir syn match NERDTreeDirSlash #/# containedin=NERDTreeDir if g:NERDTreeDirArrows - exec 'syn match NERDTreeClosable #'.g:NERDTreeDirArrowCollapsible.'# containedin=NERDTreeDir,NERDTreeFile' - exec 'syn match NERDTreeOpenable #'.g:NERDTreeDirArrowExpandable.'# containedin=NERDTreeDir,NERDTreeFile' + exec 'syn match NERDTreeClosable #'.escape(g:NERDTreeDirArrowCollapsible, '~').'# containedin=NERDTreeDir,NERDTreeFile' + exec 'syn match NERDTreeOpenable #'.escape(g:NERDTreeDirArrowExpandable, '~').'# containedin=NERDTreeDir,NERDTreeFile' - let s:dirArrows = g:NERDTreeDirArrowCollapsible.g:NERDTreeDirArrowExpandable + let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~').escape(g:NERDTreeDirArrowExpandable, '~') exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#' syn match NERDTreeExecFile #^ .*\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile' From d66370a8e51abf21705756b2ff4c8874a30abc1a Mon Sep 17 00:00:00 2001 From: Xuyuan Pang Date: Thu, 17 Sep 2015 11:30:14 +0800 Subject: [PATCH 45/48] Made NERDTreeFlags contained in NERDTreeExecFile --- syntax/nerdtree.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/nerdtree.vim b/syntax/nerdtree.vim index fd548cf..effb7fe 100644 --- a/syntax/nerdtree.vim +++ b/syntax/nerdtree.vim @@ -34,7 +34,7 @@ if g:NERDTreeDirArrows "highlighting for readonly files syn match NERDTreeRO # *\zs.*\ze \[RO\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile - syn match NERDTreeFlags #^ *\zs\[.\]# containedin=NERDTreeFile + syn match NERDTreeFlags #^ *\zs\[.\]# containedin=NERDTreeFile,NERDTreeExecFile syn match NERDTreeFlags #\[.\]# containedin=NERDTreeDir else "highlighting for the ~/+ symbols for the directory nodes From 34630f3926eccd35c7c2ae23dd315f67557cde3b Mon Sep 17 00:00:00 2001 From: hiberabyss Date: Sun, 20 Sep 2015 00:53:39 +0800 Subject: [PATCH 46/48] issue #147: add support to ~ expand in bookmarks --- lib/nerdtree/bookmark.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/nerdtree/bookmark.vim b/lib/nerdtree/bookmark.vim index 8a94b25..91648d2 100644 --- a/lib/nerdtree/bookmark.vim +++ b/lib/nerdtree/bookmark.vim @@ -87,6 +87,7 @@ function! s:Bookmark.CacheBookmarks(silent) let name = substitute(i, '^\(.\{-}\) .*$', '\1', '') let path = substitute(i, '^.\{-} \(.*\)$', '\1', '') + let path = fnamemodify(path, ':p') try let bookmark = s:Bookmark.New(name, g:NERDTreePath.New(path)) @@ -304,7 +305,7 @@ endfunction function! s:Bookmark.Write() let bookmarkStrings = [] for i in s:Bookmark.Bookmarks() - call add(bookmarkStrings, i.name . ' ' . i.path.str()) + call add(bookmarkStrings, i.name . ' ' . fnamemodify(i.path.str(), ':~')) endfor "add a blank line before the invalid ones From 8996ea5bb56c0af1b1df32f1990f37e224d25112 Mon Sep 17 00:00:00 2001 From: Arseny Zarechnev Date: Sun, 4 Oct 2015 01:54:15 +0100 Subject: [PATCH 47/48] Fix MacOS detection for menu, fixes #478 --- nerdtree_plugin/fs_menu.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nerdtree_plugin/fs_menu.vim b/nerdtree_plugin/fs_menu.vim index e99a85b..b5569e5 100644 --- a/nerdtree_plugin/fs_menu.vim +++ b/nerdtree_plugin/fs_menu.vim @@ -24,7 +24,7 @@ call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callbac call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'}) call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'}) -if has("gui_mac") || has("gui_macvim") +if has("gui_mac") || has("gui_macvim") || has("mac") call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'}) call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'}) call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'}) From 88104d26ac5935d256e2b2800a5704461529eda5 Mon Sep 17 00:00:00 2001 From: Jonathan Seidel Date: Mon, 2 Nov 2015 11:30:16 -0800 Subject: [PATCH 48/48] Add ability to list file metadata... (Based on a change by github.com/apbarrero)) Add menu/list command to display file metadata Support OSX as well as Unix --- nerdtree_plugin/fs_menu.vim | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/nerdtree_plugin/fs_menu.vim b/nerdtree_plugin/fs_menu.vim index e99a85b..7caa6cc 100644 --- a/nerdtree_plugin/fs_menu.vim +++ b/nerdtree_plugin/fs_menu.vim @@ -34,6 +34,10 @@ if g:NERDTreePath.CopyingSupported() call NERDTreeAddMenuItem({'text': '(c)opy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'}) endif +if has("unix") || has("osx") + call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNode'}) +endif + "FUNCTION: s:echo(msg){{{1 function! s:echo(msg) redraw @@ -267,4 +271,14 @@ function! NERDTreeExecuteFile() endif endfunction +function! NERDTreeListNode() + let treenode = g:NERDTreeFileNode.GetSelected() + if treenode != {} + let metadata = split(system('ls -ld ' . shellescape(treenode.path.str())), '\n') + call s:echo(metadata[0]) + else + call s:echo("No information avaialable") + endif +endfunction + " vim: set sw=4 sts=4 et fdm=marker: