nerdtree

A tree explorer plugin for vim.
Index Commits Files Refs
commit 29e687978b0dc5ce006e74fa0917f8c229b4ecc1
parent dbeb1947ea986d7cda460f12962cdef5196ef87d
Author: pendulm <lonependulm@gmail.com>
Date:   Thu,  5 Jul 2012 22:26:57 +0800

add option NERDTreeCasadeOpenSingleChildDir and function
TreeDirNode.openAlong for Issues #179.

Diffstat:
Mdoc/NERD_tree.txt | 18++++++++++++++++++
Mplugin/NERD_tree.vim | 29++++++++++++++++++++++++++---
2 files changed, 44 insertions(+), 3 deletions(-)
diff --git a/doc/NERD_tree.txt b/doc/NERD_tree.txt
@@ -654,6 +654,10 @@ NERD tree. These options should be set in your vimrc.
 |'NERDTreeDirArrows'|           Tells the NERD tree to use arrows instead of
                                 + ~ chars when displaying directories.
 
+|'NERDTreeCasadeOpenSingleChildDir'|
+                                Casade open while selected directory has only
+                                one child that also is a directory.
+
 ------------------------------------------------------------------------------
 3.2. Customisation details                             *NERDTreeOptionDetails*
 
@@ -965,6 +969,20 @@ option: >
     let NERDTreeDirArrows=1
 <
 
+------------------------------------------------------------------------------
+                                          *'NERDTreeCasadeOpenSingleChildDir'*
+Values: 0 or 1
+Default: 0.
+
+This option tell NERDTree open the child directory if the selected opening
+directory has only one child that is a directory, and do same to sub-directory
+recursively. NERDTree will stop till it find a empty directory or this
+directory has more than one child. This option may be useful for Java projects.
+Use one of the follow lines to set this option: >
+    let NERDTreeCasadeOpenSingleChildDir=0
+    let NERDTreeCasadeOpenSingleChildDir=1
+<
+
 ==============================================================================
 4. The NERD tree API                                             *NERDTreeAPI*
 
diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim
@@ -69,6 +69,7 @@ call s:initVariable("g:NERDTreeShowHidden", 0)
 call s:initVariable("g:NERDTreeShowLineNumbers", 0)
 call s:initVariable("g:NERDTreeSortDirs", 1)
 call s:initVariable("g:NERDTreeDirArrows", !s:running_windows)
+call s:initVariable("g:NERDTreeCasadeOpenSingleChildDir", 0)
 
 if !exists("g:NERDTreeSortOrder")
     let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$',  '\.bak$', '\~$']
@@ -1694,7 +1695,26 @@ function! s:TreeDirNode.open(...)
         endif
     endif
 endfunction
-
+"FUNCTION: TreeDirNode.openAlong([opts]) {{{3
+"recursive open the dir if it has only one directory child.
+"
+"return the level of opened directories.
+function! s:TreeDirNode.openAlong(...)
+    let opts = a:0 ? a:1 : {}
+    let level = 0
+
+    let node = self
+    while node.path.isDirectory
+        call node.open(opts)
+        let level += 1
+        if node.getVisibleChildCount() == 1
+            let node = node.getChildByIndex(0, 1)
+        else
+            break
+        endif
+    endwhile
+    return level
+endfunction
 " FUNCTION: TreeDirNode.openExplorer() {{{3
 " opens an explorer window for this node in the previous window (could be a
 " nerd tree or a netrw)
@@ -1857,10 +1877,13 @@ function! s:TreeDirNode.toggleOpen(...)
     if self.isOpen ==# 1
         call self.close()
     else
-        call self.open(opts)
+        if g:NERDTreeCasadeOpenSingleChildDir == 0
+            call self.open(opts)
+        else
+            call self.openAlong(opts)
+        endif
     endif
 endfunction
-
 "FUNCTION: TreeDirNode.transplantChild(newNode) {{{3
 "Replaces the child of this with the given node (where the child node's full
 "path matches a:newNode's fullpath). The search for the matching node is