commit 72c3656799289d4635520c28e17f737066ce19d6
parent a4dd4e1dce1645a018f07d1bc30ee7d38303fb20
Author: Phil Runninger <PhilRunninger@users.noreply.github.com>
Date: Wed, 12 Dec 2018 13:30:13 -0500
Add new command to open NERDTree in the root of a VCS repository. (#872)
* Add new command to open NERDTree in the root of a VCS repository.
* Add another example to the help file.
* Refactor and make NERDTreeVCS work on Windows.
* Don't crash when NERDTreeVCS is given a nonexistent folder.
* Move VCS code to a plugin script.
* Add some documentation to the top of vcs.vim.
Diffstat:
3 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/doc/NERDTree.txt b/doc/NERDTree.txt
@@ -107,6 +107,14 @@ The following features and functionality are provided by the NERD tree:
:NERDTree /home/marty/vim7/src
:NERDTree foo (foo is the name of a bookmark)
<
+:NERDTreeVCS [<start-directory> | <bookmark>] *:NERDTreeVCS*
+ Like |:NERDTree|, but searches up the directory tree to find the top of
+ the version control system repository, and roots the NERD tree there. It
+ works with Git, Subversion, Mercurial, Bazaar, and Darcs repositories. A
+ couple of examples: >
+ :NERDTreeVCS /home/marty/nerdtree/doc (opens /home/marty/nerdtree)
+ :NERDTreeVCS (opens root of repository containing CWD)
+<
:NERDTreeFromBookmark <bookmark> *:NERDTreeFromBookmark*
Opens a fresh NERD tree with the root initialized to the dir for
<bookmark>. The only reason to use this command over :NERDTree is for
diff --git a/lib/nerdtree/creator.vim b/lib/nerdtree/creator.vim
@@ -33,7 +33,7 @@ function! s:Creator._broadcastInitEvent()
silent doautocmd User NERDTreeInit
endfunction
-" FUNCTION: s:Creator.BufNamePrefix() {{{2
+" FUNCTION: s:Creator.BufNamePrefix() {{{1
function! s:Creator.BufNamePrefix()
return 'NERD_tree_'
endfunction
diff --git a/nerdtree_plugin/vcs.vim b/nerdtree_plugin/vcs.vim
@@ -0,0 +1,38 @@
+" ============================================================================
+" File: vcs.vim
+" Description: NERDTree plugin that provides a command to open on the root of
+" a version control system repository.
+" Maintainer: Phil Runninger
+" License: This program is free software. It comes without any warranty,
+" to the extent permitted by applicable law. You can redistribute
+" it and/or modify it under the terms of the Do What The Fuck You
+" Want To Public License, Version 2, as published by Sam Hocevar.
+" See http://sam.zoy.org/wtfpl/COPYING for more details.
+"
+" ============================================================================
+command! -n=? -complete=dir -bar NERDTreeVCS :call <SID>CreateTabTreeVCS('<args>')
+
+" FUNCTION: s:CreateTabTreeVCS(a:name) {{{1
+function! s:CreateTabTreeVCS(name)
+ let l:path = g:NERDTreeCreator._pathForString(a:name)
+ let l:path = s:FindParentVCSRoot(l:path)
+ call g:NERDTreeCreator.createTabTree(empty(l:path) ? "" : l:path._str())
+endfunction
+
+" FUNCTION: s:FindParentVCSRoot(a:path) {{{1
+" Finds the root version control system folder of the given path. If a:path is
+" not part of a repository, return the original path.
+function! s:FindParentVCSRoot(path)
+ let l:path = a:path
+ while !empty(l:path) &&
+ \ l:path._str() !~ '^\(\a:\\\|\/\)$' &&
+ \ !isdirectory(l:path._str() . '/.git') &&
+ \ !isdirectory(l:path._str() . '/.svn') &&
+ \ !isdirectory(l:path._str() . '/.hg') &&
+ \ !isdirectory(l:path._str() . '/.bzr') &&
+ \ !isdirectory(l:path._str() . '/_darcs')
+ let l:path = l:path.getParent()
+ endwhile
+ return (empty(l:path) || l:path._str() =~ '^\(\a:\\\|\/\)$') ? a:path : l:path
+endfunction
+