nerdtree

A tree explorer plugin for vim.
Index Commits Files Refs
commit d4b4d694698b04e2a69716d28e21872f22d6f5fb
parent 283559bd97f3431bf1fe3fde98e4f1416ce30372
Author: Martin Grenfell <martin_grenfell@msn.com>
Date:   Mon, 27 Oct 2008 23:21:39 +1300

when opening a file (with o), dont split unless there is no choice

Diffstat:
Mplugin/NERD_tree.vim | 105+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 63 insertions(+), 42 deletions(-)
diff --git a/plugin/NERD_tree.vim b/plugin/NERD_tree.vim
@@ -2092,6 +2092,21 @@ function! s:findRootNodeLineNumber()
     return rootLine
 endfunction
 
+"FUNCTION: s:firstNormalWindow(){{{2
+"find the window number of the first normal window
+function! s:firstNormalWindow()
+    let i = 1
+    while i <= winnr("$")
+        let bnum = winbufnr(i)
+        if bnum != -1 && getbufvar(bnum, '&buftype') == ''
+                    \ && !getwinvar(i, '&previewwindow')
+            return i
+        endif
+
+        let i += 1
+    endwhile
+    return -1
+endfunction
 "FUNCTION: s:getPath(ln) {{{2
 "Gets the full path to the node that is rendered on the given line number
 "
@@ -2284,18 +2299,24 @@ function! s:openFileNode(treenode)
     if winnr != -1
         exec winnr . "wincmd w"
 
-    elseif s:shouldSplitToOpen(winnr("#"))
-        call s:openFileNodeSplit(a:treenode)
     else
-        try
-            wincmd p
-            exec ("edit " . a:treenode.path.strForEditCmd())
-        catch /^Vim\%((\a\+)\)\=:E37/
-            call s:putCursorInTreeWin()
-            call s:echo("Cannot open file, it is already open and modified")
-        catch /^Vim\%((\a\+)\)\=:/
-            echo v:exception
-        endtry
+        if s:windowIsUsable(winnr("#")) && s:firstNormalWindow() == -1
+            call s:openFileNodeSplit(a:treenode)
+        else
+            try
+                if s:windowIsUsable(winnr("#"))
+                    exec s:firstNormalWindow() . "wincmd w"
+                else
+                    wincmd p
+                endif
+                exec ("edit " . a:treenode.path.strForEditCmd())
+            catch /^Vim\%((\a\+)\)\=:E37/
+                call s:putCursorInTreeWin()
+                call s:echo("Cannot open file, it is already open and modified")
+            catch /^Vim\%((\a\+)\)\=:/
+                echo v:exception
+            endtry
+        endif
     endif
 endfunction
 
@@ -2680,37 +2701,6 @@ function! s:setupSyntaxHighlighting()
     hi def link NERDTreeCurrentNode Search
 endfunction
 
-"FUNCTION: s:shouldSplitToOpen() {{{2
-"Returns 1 if opening a file from the tree in the given window requires it to
-"be split
-"
-"Args:
-"winnumber: the number of the window in question
-function! s:shouldSplitToOpen(winnumber)
-    "gotta split if theres only one window (i.e. the NERD tree)
-    if winnr("$") == 1
-        return 1
-    endif
-
-    let oldwinnr = winnr()
-    exec a:winnumber . "wincmd p"
-    let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow')
-    let modified = &modified
-    exec oldwinnr . "wincmd p"
-
-    "if its a special window e.g. quickfix or another explorer plugin then we
-    "have to split
-    if specialWindow
-        return 1
-    endif
-
-    if &hidden
-        return 0
-    endif
-
-    return modified && s:bufInWindows(winbufnr(a:winnumber)) < 2
-endfunction
-
 " Function: s:shouldSplitVertically()   {{{2
 " Returns 1 if g:NERDTreeWinPos is 'left' or 'right'
 function! s:shouldSplitVertically()
@@ -2774,6 +2764,37 @@ function! s:toggle(dir)
         call s:initNerdTree(a:dir)
     endif
 endfunction
+"FUNCTION: s:windowIsUsable() {{{2
+"Returns 1 if opening a file from the tree in the given window requires it to
+"be split
+"
+"Args:
+"winnumber: the number of the window in question
+function! s:windowIsUsable(winnumber)
+    "gotta split if theres only one window (i.e. the NERD tree)
+    if winnr("$") == 1
+        return 1
+    endif
+
+    let oldwinnr = winnr()
+    exec a:winnumber . "wincmd p"
+    let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow')
+    let modified = &modified
+    exec oldwinnr . "wincmd p"
+
+    "if its a special window e.g. quickfix or another explorer plugin then we
+    "have to split
+    if specialWindow
+        return 1
+    endif
+
+    if &hidden
+        return 0
+    endif
+
+    return modified && s:bufInWindows(winbufnr(a:winnumber)) < 2
+endfunction
+
 "SECTION: Interface bindings {{{1
 "============================================================
 "FUNCTION: s:activateNode(forceKeepWindowOpen) {{{2