commit 86605413339960e0f32e5197d1d38b547bf141cf
parent 18f04e082493c553f5f5e3323a1b84c12d77cc24
Author: Jason Franklin <j_fra@fastmail.us>
Date: Sun, 2 Jul 2017 11:51:32 -0400
Fix the "TreeDirNode.open()" method
Issues #547 and #526 reported a problem with the "open()" method in
the "TreeDirNode" class.
Specifically, opening a cascade in the NERDTree will perform the
opening operation on the tail of the cascade. This is a problem when
other operations (such as the "u" mapping) close intermediate
cascaded directories, which causes opening the tail to have no
effect (other than toggling the arrow).
Here, the "open()" method was modified to open all directories in a
cascade whenever the tail is opened. This is the only reasonable fix
for this type of problem.
Fixes #547 and fixes #526.
Diffstat:
1 file changed, 28 insertions(+), 14 deletions(-)
diff --git a/lib/nerdtree/tree_dir_node.vim b/lib/nerdtree/tree_dir_node.vim
@@ -410,25 +410,39 @@ function! s:TreeDirNode.New(path, nerdtree)
return newTreeNode
endfunction
-" FUNCTION: TreeDirNode.open([opts]) {{{1
-" Open the dir in the current tree or in a new tree elsewhere.
-"
-" If opening in the current tree, return the number of cached nodes.
-unlet s:TreeDirNode.open
+" FUNCTION: TreeDirNode.open([options]) {{{1
+" Open this directory node in the current tree or elsewhere if special options
+" are provided. Return 0 if options were processed. Otherwise, return the
+" number of new cached nodes.
function! s:TreeDirNode.open(...)
- let opts = a:0 ? a:1 : {}
+ let l:options = a:0 ? a:1 : {}
- if has_key(opts, 'where') && !empty(opts['where'])
- let opener = g:NERDTreeOpener.New(self.path, opts)
- call opener.open(self)
- else
- let self.isOpen = 1
- if self.children ==# []
- return self._initChildren(0)
+ " If special options were specified, process them and return.
+ if has_key(l:options, 'where') && !empty(l:options['where'])
+ let l:opener = g:NERDTreeOpener.New(self.path, l:options)
+ call l:opener.open(self)
+ return 0
+ endif
+
+ " Open any ancestors of this node that render within the same cascade.
+ let l:parent = self.parent
+ while l:parent != b:NERDTree.root && !empty(l:parent)
+ if index(l:parent.getCascade(), self) >= 0
+ let l:parent.isOpen = 1
+ let l:parent = l:parent.parent
else
- return 0
+ break
endif
+ endwhile
+
+ let self.isOpen = 1
+
+ let l:numChildrenCached = 0
+ if empty(self.children)
+ let l:numChildrenCached = self._initChildren(0)
endif
+
+ return l:numChildrenCached
endfunction
" FUNCTION: TreeDirNode.openAlong([opts]) {{{1