Compare commits

...

6 Commits

Author SHA1 Message Date
Phil Runninger
593c16add3 Fix {'keepopen':0} in NERDTreeCustomOpenArgs (#1217)
* Replace #and() with two more-specific functions.

* Push NERDTreeQuitOnOpen checking earlier in the call stack.

* Fix bug in `go` key for file bookmarks. It was behaving like `gs`.

* Fix the `o` mapping for bookmark nodes and the g:NERDTree reference.

* Use get() function to shorten if statement logic.

* Update version number in change log.

* Remove obsolete reference to MERDTreeQuitOnOpen in comment.
2021-02-09 21:34:24 -05:00
Daniel E
d3becd1149 Removed directory separator from sort key (#1219)
* Removed directory separator from sort key

Directories had an additional separator appended to them which caused improper comparisons for other directories that shared similar prefixes.

* Updated changelog
2021-02-09 20:48:36 -05:00
Phil Runninger
1b19089917 Add new FAQ and answer: How to prevent buffers replacing NERDTree. (#1215)
* Add new FAQ and answer: How to prevent buffers replacing NERDTree.

* Update version number in change log.
2021-01-31 00:19:58 -05:00
Phil Runninger
c8be9458dd New menu command: Run a system command in this directory. (#1214)
* New menu command: Run system command in this directory.

* Echo the output from the system command.

* Update version number in change log.

* Address Vim linter message: change "\n" to nr2char(10)

* Use single quoted strings.

* Use system() instead of systemlist() for greater version compatibility.

systemlist() was introduced sometime in Vim 8+, so I switched to
system() for 7.4 compatibility.
2021-01-30 23:45:56 -05:00
Phil Runninger
628098fff1 Escape quotation marks so they can be used in key mappings. (#1213)
* Escape quotation marks so they can be used in key mappings.

* Update version number in change log.
2021-01-30 23:43:29 -05:00
Phil Runninger
b134f6518b Enable full path specifications for NERDTreeIgnore (#1207)
* Add ability to specify a path to be ignored.

This ignore expression compares itself against the whole path of the
node, instead of just the tail component of the node.

* Remove debug statements and make it work on Windows.

* Restore the original self.str() to get OS-specific paths for comparing.

Using the UI-formatted path had two problems.
1. It always appended a forward slash at the end of the path, which was
   unnecessary and made patterns like '/tmp/cache$[[path]]' not work as
   expected.
2. It always used forward slashes to join the path components. I thought
   this would be a good thing, but there's no reason to force Windows
   users to use that syntax. They'll just need to remember to escape the
   backslashes, like so: '\\Temp\\cache$[[path]]'

* Add documentation for the new [[path]] tag for NERDTreeIgnore.

* Replace the abbreviation 'dir' with the full word 'directory'.

* Update version number in change log.
2021-01-19 20:07:26 -05:00
11 changed files with 105 additions and 80 deletions

View File

@@ -4,6 +4,13 @@
version in an unordered list. The format is:
- **.PATCH**: Pull Request Title (PR Author) [PR Number](Link to PR)
-->
#### 6.10
- **.5**: Fix `{'keepopen':0}` in NERDTreeCustomOpenArgs (PhilRunninger) [#1217](https://github.com/preservim/nerdtree/pull/1217)
- **.4**: Removed directory separator from sort key (Daniel E) [#1219](https://github.com/preservim/nerdtree/pull/1219)
- **.3**: Add new FAQ and answer: How to prevent buffers replacing NERDTree. (PhilRunninger) [#1215](https://github.com/preservim/nerdtree/pull/1215)
- **.2**: New menu command: Run a system command in this directory. (PhilRunninger) [#1214](https://github.com/preservim/nerdtree/pull/1214)
- **.1**: Escape quotation marks so they can be used in key mappings. (PhilRunninger) [#1213](https://github.com/preservim/nerdtree/pull/1213)
- **.0**: Enable full path specifications for NERDTreeIgnore (PhilRunninger) [#1207](https://github.com/preservim/nerdtree/pull/1207)
#### 6.9
- **.12**: Respect NERDTreeCustomOpenArgs when opening bookmark (przepompownia) [#1200](https://github.com/preservim/nerdtree/pull/1200)
- **.11**: Revamp the README. (buncis, PhilRunninger) [#1192](https://github.com/preservim/nerdtree/pull/1192), [#1193](https://github.com/preservim/nerdtree/pull/1193)

View File

@@ -156,6 +156,14 @@ autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTr
\ quit | endif
```
### How can I prevent other buffers replacing NERDTree in its window?
```vim
" If another buffer tries to replace NERDTree, put in the other window, and bring back NERDTree.
autocmd BufEnter * if bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 |
\ let buf=bufnr() | buffer# | execute "normal! \<C-W>w" | execute 'buffer'.buf | endif
```
### Can I have the same NERDTree on every tab automatically?
```vim

View File

@@ -30,6 +30,16 @@ endfunction
" SECTION: General Functions {{{1
"============================================================
" FUNCTION: nerdtree#closeTreeOnOpen()
function! nerdtree#closeTreeOnOpen() abort
return g:NERDTreeQuitOnOpen == 1 || g:NERDTreeQuitOnOpen == 3
endfunction
" FUNCTION: nerdtree#closeBookmarksOnOpen()
function! nerdtree#closeBookmarksOnOpen() abort
return g:NERDTreeQuitOnOpen == 2 || g:NERDTreeQuitOnOpen == 3
endfunction
" FUNCTION: nerdtree#slash() {{{2
" Return the path separator used by the underlying file system. Special
" consideration is taken for the use of the 'shellslash' option on Windows
@@ -46,28 +56,6 @@ function! nerdtree#slash() abort
return '/'
endfunction
"FUNCTION: nerdtree#and(x,y) {{{2
" Implements and() function for Vim <= 7.4
function! nerdtree#and(x,y) abort
if exists('*and')
return and(a:x, a:y)
else
let l:x = a:x
let l:y = a:y
let l:n = 0
let l:result = 0
while l:x > 0 && l:y > 0
if (l:x % 2) && (l:y % 2)
let l:result += float2nr(pow(2, l:n))
endif
let l:x = float2nr(l:x / 2)
let l:y = float2nr(l:y / 2)
let l:n += 1
endwhile
return l:result
endif
endfunction
"FUNCTION: nerdtree#checkForBrowse(dir) {{{2
"inits a window tree in the current buffer if appropriate
function! nerdtree#checkForBrowse(dir) abort

View File

@@ -168,13 +168,13 @@ endfunction
"FUNCTION: s:activateFileNode() {{{1
"handle the user activating a tree node
function! s:activateFileNode(node) abort
call a:node.activate({'reuse': 'all', 'where': 'p'})
call a:node.activate({'reuse': 'all', 'where': 'p', 'keepopen': !nerdtree#closeTreeOnOpen()})
endfunction
"FUNCTION: s:activateBookmark(bookmark) {{{1
"handle the user activating a bookmark
function! s:activateBookmark(bm) abort
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'p'} : {})
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'p', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
endfunction
" FUNCTION: nerdtree#ui_glue#bookmarkNode(name) {{{1
@@ -539,24 +539,24 @@ endfunction
" FUNCTION: s:openHSplit(target) {{{1
function! s:openHSplit(target) abort
call a:target.activate({'where': 'h'})
call a:target.activate({'where': 'h', 'keepopen': !nerdtree#closeTreeOnOpen()})
endfunction
" FUNCTION: s:openVSplit(target) {{{1
function! s:openVSplit(target) abort
call a:target.activate({'where': 'v'})
call a:target.activate({'where': 'v', 'keepopen': !nerdtree#closeTreeOnOpen()})
endfunction
"FUNCTION: s:openHSplitBookmark(bookmark) {{{1
"handle the user activating a bookmark
function! s:openHSplitBookmark(bm) abort
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'h'} : {})
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'h', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
endfunction
"FUNCTION: s:openVSplitBookmark(bookmark) {{{1
"handle the user activating a bookmark
function! s:openVSplitBookmark(bm) abort
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'v'} : {})
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'v', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
endfunction
" FUNCTION: s:previewHSplitBookmark(bookmark) {{{1
@@ -576,13 +576,13 @@ endfunction
" FUNCTION: s:openInNewTab(target) {{{1
function! s:openInNewTab(target) abort
let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't'})
let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'keepopen': !nerdtree#closeTreeOnOpen()})
call l:opener.open(a:target)
endfunction
" FUNCTION: s:openInNewTabSilent(target) {{{1
function! s:openInNewTabSilent(target) abort
let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'stay': 1})
let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'keepopen': !nerdtree#closeTreeOnOpen(), 'stay': 1})
call l:opener.open(a:target)
endfunction
@@ -596,7 +596,7 @@ endfunction
" FUNCTION: s:previewBookmark(bookmark) {{{1
function! s:previewBookmark(bookmark) abort
call a:bookmark.activate(b:NERDTree, !a:bookmark.path.isDirectory ? {'stay': 1, 'where': 'h', 'keepopen': 1} : {})
call a:bookmark.activate(b:NERDTree, !a:bookmark.path.isDirectory ? {'stay': 1, 'where': 'p', 'keepopen': 1} : {})
endfunction
"FUNCTION: s:previewNodeCurrent(node) {{{1
@@ -621,7 +621,7 @@ function! nerdtree#ui_glue#revealBookmark(name) abort
let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0, b:NERDTree)
call targetNode.putCursorHere(0, 1)
catch /^NERDTree.BookmarkNotFoundError/
call nerdtree#echo('Bookmark isnt cached under the current root')
call nerdtree#echo('Bookmark isn''t cached under the current root')
endtry
endfunction

View File

@@ -116,7 +116,7 @@ The following features and functionality are provided by the NERDTree:
:NERDTreeVCS (opens root of repository containing CWD)
<
:NERDTreeFromBookmark <bookmark> *:NERDTreeFromBookmark*
Opens a fresh NERDTree with the root initialized to the dir for
Opens a fresh NERDTree with the root initialized to the directory for
<bookmark>. The only reason to use this command over :NERDTree is for
the completion (which is for bookmarks rather than directories).
@@ -126,7 +126,7 @@ The following features and functionality are provided by the NERDTree:
is set to that path. If no NERDTree exists for this tab then this command
acts the same as the |:NERDTree| command.
:NERDTreeToggleVCS [<start-directory> | <bookmark>] *:NERDTreeToggleVCS*
:NERDTreeToggleVCS [<start-directory> | <bookmark>] *:NERDTreeToggleVCS*
Like |:NERDTreeToggle|, but searches up the directory tree to find the top of
the version control system repository, and roots the NERDTree there. It
works with Git, Subversion, Mercurial, Bazaar, and Darcs repositories. A
@@ -249,7 +249,7 @@ Key Description help-tag~
o........Open files, directories and bookmarks......................|NERDTree-o|
go.......Open selected file, but leave cursor in the NERDTree......|NERDTree-go|
Open selected bookmark dir in current NERDTree
Open selected bookmark directory in current NERDTree
t........Open selected node/bookmark in a new tab...................|NERDTree-t|
T........Same as 't' but keep the focus on the current tab..........|NERDTree-T|
i........Open selected file in a split window.......................|NERDTree-i|
@@ -260,10 +260,10 @@ gs.......Same as s, but leave the cursor on the NERDTree...........|NERDTree-gs|
O........Recursively open the selected directory....................|NERDTree-O|
x........Close the current nodes parent.............................|NERDTree-x|
X........Recursively close all children of the current node.........|NERDTree-X|
e........Edit the current dir.......................................|NERDTree-e|
e........Edit the current directory.................................|NERDTree-e|
double-click....same as |NERDTree-o|.
middle-click....same as |NERDTree-i| for files, and |NERDTree-e| for dirs.
middle-click....same as |NERDTree-i| for files, and |NERDTree-e| for directories.
D........Delete the current bookmark ...............................|NERDTree-D|
@@ -274,13 +274,13 @@ J........Jump down inside directories at the current tree depth.....|NERDTree-J|
<C-J>....Jump down to next sibling of the current directory.......|NERDTree-C-J|
<C-K>....Jump up to previous sibling of the current directory.....|NERDTree-C-K|
C........Change the tree root to the selected dir...................|NERDTree-C|
C........Change the tree root to the selected directory.............|NERDTree-C|
u........Move the tree root up one directory........................|NERDTree-u|
U........Same as 'u' except the old root node is left open..........|NERDTree-U|
r........Recursively refresh the current directory..................|NERDTree-r|
R........Recursively refresh the current root.......................|NERDTree-R|
m........Display the NERDTree menu..................................|NERDTree-m|
cd.......Change the CWD to the dir of the selected node............|NERDTree-cd|
cd.......Change the CWD to the directory of the selected node......|NERDTree-cd|
CD.......Change tree root to the CWD...............................|NERDTree-CD|
I........Toggle whether hidden files displayed......................|NERDTree-I|
@@ -469,7 +469,7 @@ Jump to the first child of the current nodes parent.
If the cursor is already on the first node then do the following:
* loop back thru the siblings of the current nodes parent until we find an
open dir with children
open directory with children
* go to the first child of that node
------------------------------------------------------------------------------
@@ -482,7 +482,7 @@ Jump to the last child of the current nodes parent.
If the cursor is already on the last node then do the following:
* loop forward thru the siblings of the current nodes parent until we find
an open dir with children
an open directory with children
* go to the last child of that node
------------------------------------------------------------------------------
@@ -516,7 +516,7 @@ Default key: u
Map setting: *NERDTreeMapUpdir*
Applies to: no restrictions.
Move the tree root up a dir (like doing a "cd ..").
Move the tree root up a directory (like doing a "cd ..").
------------------------------------------------------------------------------
*NERDTree-U*
@@ -532,8 +532,8 @@ Default key: r
Map setting: *NERDTreeMapRefresh*
Applies to: files and directories.
If a dir is selected, recursively refresh that dir, i.e. scan the filesystem
for changes and represent them in the tree.
If a directory is selected, recursively refresh that directory, i.e. scan the
filesystem for changes and represent them in the tree.
If a file node is selected then the above is done on it's parent.
@@ -634,8 +634,8 @@ file explorers have.
The script comes with two default menu plugins: exec_menuitem.vim and
fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for
creating/deleting/moving/copying files and dirs. exec_menuitem.vim provides a
menu item to execute executable files.
creating/deleting/moving/copying files and directories. exec_menuitem.vim
provides a menu item to execute executable files.
Related tags: |NERDTree-m| |NERDTreeApi|
@@ -921,7 +921,7 @@ Default: ['\~$'].
This setting is used to specify which files the NERDTree should ignore. It
must be a list of regular expressions. When the NERDTree is rendered, any
files/dirs that match any of the regex's in NERDTreeIgnore won't be
files/directories that match any of the regex's in NERDTreeIgnore won't be
displayed.
For example if you put the following line in your vimrc: >
@@ -929,13 +929,18 @@ For example if you put the following line in your vimrc: >
<
then all files ending in .vim or ~ will be ignored.
There are 2 magic flags that can be appended to the end of each regular
expression to specify that the regex should match only files or only dirs.
These flags are "[[dir]]" and "[[file]]". Example: >
let NERDTreeIgnore=['\.d$[[dir]]', '\.o$[[file]]']
There are 3 magic flags that can be appended to the end of each regular
expression to specify that the regex should match only filenames, only lowest
level directories, or a full path. These flags are "[[dir]]", "[[file]]", and
"[[path]]". Example: >
let NERDTreeIgnore=['\.d$[[dir]]', '\.o$[[file]]', 'tmp/cache$[[path]]']
<
This will cause all dirs ending in ".d" to be ignored and all files ending in
".o" to be ignored.
This will cause all directories ending in ".d" to be ignored, all files ending
in ".o" to be ignored, and the "cache" subdirectory of any "tmp" directory to
be ignored. All other "cache" directories will be displayed.
When using the "[[path]]" tag on Windows, make sure you use escaped
backslashes for the separators in the regex, eg. 'Temp\\cache$[[path]]'
Note: to tell the NERDTree not to ignore any files you must use the following
line: >
@@ -1099,8 +1104,8 @@ Examples: >
<
1. Directories will appear last, everything else will appear above.
2. Everything will simply appear in alphabetical order.
3. Dirs will appear first, then ruby and php. Swap files, bak files and vim
backup files will appear last with everything else preceding them.
3. Directories will appear first, then ruby and php. Swap files, bak files
and vim backup files will appear last with everything else preceding them.
4. Everything is sorted by size, largest to smallest, with directories
considered to have size 0 bytes.
5. Directories will appear first alphabetically, followed by files, sorted by
@@ -1174,8 +1179,9 @@ Use one of the following lines for this setting: >
Values: 0 or 1
Default: 1.
When displaying dir nodes, this setting tells NERDTree to collapse dirs that
have only one child. Use one of the following lines for this setting: >
When displaying directory nodes, this setting tells NERDTree to collapse
directories that have only one child. Use one of the following lines for this
setting: >
let NERDTreeCascadeSingleChildDir=0
let NERDTreeCascadeSingleChildDir=1
<
@@ -1184,11 +1190,12 @@ have only one child. Use one of the following lines for this setting: >
Values: 0 or 1
Default: 1.
When opening dir nodes, this setting tells NERDTree to recursively open dirs
that have only one child which is also a dir. NERDTree will stop when it finds
a dir that contains anything but another single dir. This setting also causes
the |NERDTree-x| mapping to close dirs in the same manner. This setting may be
useful for Java projects. Use one of the following lines for this setting: >
When opening directory nodes, this setting tells NERDTree to recursively open
directories that have only one child which is also a directory. NERDTree will
stop when it finds a directory that contains anything but another single
directory. This setting also causes the |NERDTree-x| mapping to close
directories in the same manner. This setting may be useful for Java projects.
Use one of the following lines for this setting: >
let NERDTreeCascadeOpenSingleChildDir=0
let NERDTreeCascadeOpenSingleChildDir=1
<
@@ -1362,8 +1369,8 @@ NERDTreeAddKeyMap({options}) *NERDTreeAddKeyMap()*
<
This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim.
It adds a (redundant) mapping on 'foo' which changes vim's CWD to that of
the current dir node. Note this mapping will only fire when the cursor is
on a directory node.
the current directory node. Note this mapping will only fire when the
cursor is on a directory node.
------------------------------------------------------------------------------
4.2. Menu API *NERDTreeMenuAPI*

View File

@@ -256,7 +256,7 @@ endfunction
function! s:Bookmark.open(nerdtree, ...)
let opts = a:0 ? a:1 : {}
if nerdtree#and(g:NERDTreeQuitOnOpen,2)
if nerdtree#closeBookmarksOnOpen()
call a:nerdtree.ui.toggleShowBookmarks()
endif

View File

@@ -51,7 +51,7 @@ function! s:KeyMap.bind()
else
let keymapInvokeString = self.key
endif
let keymapInvokeString = escape(keymapInvokeString, '\')
let keymapInvokeString = escape(keymapInvokeString, '\"')
let premap = self.key ==# '<LeftRelease>' ? ' <LeftRelease>' : ' '

View File

@@ -65,14 +65,6 @@ function! s:NERDTree.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 nerdtree#and(g:NERDTreeQuitOnOpen,1) && s:NERDTree.IsOpen()
call s:NERDTree.Close()
endif
endfunction
"FUNCTION: s:NERDTree.CursorToBookmarkTable(){{{1
"Places the cursor at the top of the bookmarks table
function! s:NERDTree.CursorToBookmarkTable()

View File

@@ -33,8 +33,7 @@ function! s:Opener._bufInWindows(bnum)
endfunction
" FUNCTION: Opener._checkToCloseTree(newtab) {{{1
" Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see
" if the tree should be closed now.
" Check the class options to see if the tree should be closed now.
"
" Args:
" a:newtab - boolean. If set, only close the tree now if we are opening the
@@ -46,7 +45,7 @@ function! s:Opener._checkToCloseTree(newtab)
endif
if (a:newtab && self._where ==# 't') || !a:newtab
call g:NERDTree.CloseIfQuitOnOpen()
call g:NERDTree.Close()
endif
endfunction
@@ -218,7 +217,7 @@ endfunction
" FUNCTION: Opener._openFile() {{{1
function! s:Opener._openFile()
if !self._stay && !nerdtree#and(g:NERDTreeQuitOnOpen,1) && exists('b:NERDTreeZoomed') && b:NERDTreeZoomed
if !self._stay && self._keepopen && get(b:, 'NERDTreeZoomed', 0)
call b:NERDTree.ui.toggleZoom()
endif

View File

@@ -394,7 +394,7 @@ function! s:Path.getSortKey()
let self._sortKey = [self.getSortOrderIndex()] + metadata
endif
let path = self.getLastPathComponent(1)
let path = self.getLastPathComponent(0)
if !g:NERDTreeSortHiddenFirst
let path = substitute(path, '^[._]', '', '')
endif
@@ -483,7 +483,10 @@ endfunction
" returns true if this path matches the given ignore pattern
function! s:Path._ignorePatternMatches(pattern)
let pat = a:pattern
if strpart(pat,len(pat)-7) ==# '[[dir]]'
if strpart(pat,len(pat)-8) ==# '[[path]]'
let pat = strpart(pat,0, len(pat)-8)
return self.str() =~# pat
elseif strpart(pat,len(pat)-7) ==# '[[dir]]'
if !self.isDirectory
return 0
endif

View File

@@ -49,6 +49,10 @@ else
call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNodeWin32'})
endif
if exists('*system')
call NERDTreeAddMenuItem({'text': 'Run (s)ystem command in this directory', 'shortcut':'s', 'callback': 'NERDTreeSystemCommand'})
endif
"FUNCTION: s:inputPrompt(action){{{1
"returns the string that should be prompted to the user for the given action
"
@@ -460,4 +464,21 @@ function! NERDTreeExecuteFileWindows()
call system('cmd.exe /c start "" ' . shellescape(l:node.path.str()))
endfunction
" FUNCTION: NERDTreeSystemCommand() {{{1
function! NERDTreeSystemCommand()
let l:node = g:NERDTreeFileNode.GetSelected()
if empty(l:node)
return
endif
let l:cwd = getcwd()
let l:directory = l:node.path.isDirectory ? l:node.path.str() : l:node.parent.path.str()
execute 'cd '.l:directory
let l:nl = nr2char(10)
echo l:nl . system(input(l:directory . (nerdtree#runningWindows() ? '> ' : ' $ ')))
execute 'cd '.l:cwd
endfunction
" vim: set sw=4 sts=4 et fdm=marker: