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.
This commit is contained in:
Phil Runninger 2018-12-12 13:30:13 -05:00 committed by GitHub
parent a4dd4e1dce
commit 72c3656799
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 1 deletions

View File

@ -107,6 +107,14 @@ The following features and functionality are provided by the NERD tree:
:NERDTree /home/marty/vim7/src :NERDTree /home/marty/vim7/src
:NERDTree foo (foo is the name of a bookmark) :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* :NERDTreeFromBookmark <bookmark> *:NERDTreeFromBookmark*
Opens a fresh NERD tree with the root initialized to the dir for 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 <bookmark>. The only reason to use this command over :NERDTree is for

View File

@ -33,7 +33,7 @@ function! s:Creator._broadcastInitEvent()
silent doautocmd User NERDTreeInit silent doautocmd User NERDTreeInit
endfunction endfunction
" FUNCTION: s:Creator.BufNamePrefix() {{{2 " FUNCTION: s:Creator.BufNamePrefix() {{{1
function! s:Creator.BufNamePrefix() function! s:Creator.BufNamePrefix()
return 'NERD_tree_' return 'NERD_tree_'
endfunction endfunction

38
nerdtree_plugin/vcs.vim Normal file
View File

@ -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