mirror of
https://github.com/preservim/nerdtree.git
synced 2025-11-12 05:13:50 -05:00
extract the tree creation functions out into their own class
Add the NERDTreeCreator class. Stick all functions related to creating a primary/secondary/mirror nerdtree in there. We may break this down further in the future, but this is a good starting point. Make some of the interface binding functions in autoload/nerdtree public. This is needed since we are accessing some of them from NERDTreeCreator. Should be temporary until we get some kind of proper interface binding system set up.
This commit is contained in:
@@ -42,7 +42,7 @@ endfunction
|
||||
"inits a secondary nerd tree in the current buffer if appropriate
|
||||
function! nerdtree#checkForBrowse(dir)
|
||||
if a:dir != '' && isdirectory(a:dir)
|
||||
call nerdtree#initNerdTreeInPlace(a:dir)
|
||||
call g:NERDTreeCreator.New().createSecondary(a:dir)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
@@ -193,14 +193,14 @@ function! nerdtree#findAndRevealPath()
|
||||
endtry
|
||||
|
||||
if p.isUnder(cwd)
|
||||
call nerdtree#initNerdTree(cwd.str())
|
||||
call g:NERDTreeCreator.New().createPrimary(cwd.str())
|
||||
else
|
||||
call nerdtree#initNerdTree(p.getParent().str())
|
||||
call g:NERDTreeCreator.New().createPrimary(p.getParent().str())
|
||||
endif
|
||||
else
|
||||
if !p.isUnder(g:NERDTreeFileNode.GetRootForTab().path)
|
||||
if !nerdtree#isTreeOpen()
|
||||
call nerdtree#createTreeWin()
|
||||
call g:NERDTreeCreator.New().togglePrimary('')
|
||||
else
|
||||
call nerdtree#putCursorInTreeWin()
|
||||
endif
|
||||
@@ -208,7 +208,7 @@ function! nerdtree#findAndRevealPath()
|
||||
call nerdtree#chRoot(g:NERDTreeDirNode.New(p.getParent()))
|
||||
else
|
||||
if !nerdtree#isTreeOpen()
|
||||
call nerdtree#toggle("")
|
||||
call g:NERDTreeCreator.New().togglePrimary("")
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -225,152 +225,6 @@ function! nerdtree#has_opt(options, name)
|
||||
return has_key(a:options, a:name) && a:options[a:name] == 1
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#initNerdTree(name) {{{2
|
||||
"Initialise the nerd tree for this tab. The tree will start in either the
|
||||
"given directory, or the directory associated with the given bookmark
|
||||
"
|
||||
"Args:
|
||||
"name: the name of a bookmark or a directory
|
||||
function! nerdtree#initNerdTree(name)
|
||||
let path = {}
|
||||
if g:NERDTreeBookmark.BookmarkExistsFor(a:name)
|
||||
let path = g:NERDTreeBookmark.BookmarkFor(a:name).path
|
||||
else
|
||||
let dir = a:name ==# '' ? getcwd() : a:name
|
||||
|
||||
"hack to get an absolute path if a relative path is given
|
||||
if dir =~# '^\.'
|
||||
let dir = getcwd() . g:NERDTreePath.Slash() . dir
|
||||
endif
|
||||
let dir = g:NERDTreePath.Resolve(dir)
|
||||
|
||||
try
|
||||
let path = g:NERDTreePath.New(dir)
|
||||
catch /^NERDTree.InvalidArgumentsError/
|
||||
call nerdtree#echo("No bookmark or directory found for: " . a:name)
|
||||
return
|
||||
endtry
|
||||
endif
|
||||
if !path.isDirectory
|
||||
let path = path.getParent()
|
||||
endif
|
||||
|
||||
"if instructed to, then change the vim CWD to the dir the NERDTree is
|
||||
"inited in
|
||||
if g:NERDTreeChDirMode != 0
|
||||
call path.changeToDir()
|
||||
endif
|
||||
|
||||
if nerdtree#treeExistsForTab()
|
||||
if nerdtree#isTreeOpen()
|
||||
call nerdtree#closeTree()
|
||||
endif
|
||||
unlet t:NERDTreeBufName
|
||||
endif
|
||||
|
||||
let newRoot = g:NERDTreeDirNode.New(path)
|
||||
call newRoot.open()
|
||||
|
||||
call nerdtree#createTreeWin()
|
||||
let b:treeShowHelp = 0
|
||||
let b:NERDTreeIgnoreEnabled = 1
|
||||
let b:NERDTreeShowFiles = g:NERDTreeShowFiles
|
||||
let b:NERDTreeShowHidden = g:NERDTreeShowHidden
|
||||
let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks
|
||||
let b:NERDTreeRoot = newRoot
|
||||
let b:NERDTreeType = "primary"
|
||||
|
||||
call nerdtree#renderView()
|
||||
call b:NERDTreeRoot.putCursorHere(0, 0)
|
||||
|
||||
silent doautocmd User NERDTreeInit
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#initNerdTreeInPlace(dir) {{{2
|
||||
function! nerdtree#initNerdTreeInPlace(dir)
|
||||
try
|
||||
let path = g:NERDTreePath.New(a:dir)
|
||||
catch /^NERDTree.InvalidArgumentsError/
|
||||
call nerdtree#echo("Invalid directory name:" . a:name)
|
||||
return
|
||||
endtry
|
||||
|
||||
"we want the directory buffer to disappear when we do the :edit below
|
||||
setlocal bufhidden=wipe
|
||||
|
||||
let previousBuf = expand("#")
|
||||
|
||||
"we need a unique name for each secondary tree buffer to ensure they are
|
||||
"all independent
|
||||
exec "silent edit " . nerdtree#nextBufferName()
|
||||
|
||||
let b:NERDTreePreviousBuf = bufnr(previousBuf)
|
||||
|
||||
let b:NERDTreeRoot = g:NERDTreeDirNode.New(path)
|
||||
call b:NERDTreeRoot.open()
|
||||
|
||||
call nerdtree#setCommonBufOptions()
|
||||
let b:NERDTreeType = "secondary"
|
||||
|
||||
call nerdtree#renderView()
|
||||
|
||||
silent doautocmd User NERDTreeInit
|
||||
endfunction
|
||||
|
||||
" FUNCTION: nerdtree#initNerdTreeMirror() {{{2
|
||||
function! nerdtree#initNerdTreeMirror()
|
||||
|
||||
"get the names off all the nerd tree buffers
|
||||
let treeBufNames = []
|
||||
for i in range(1, tabpagenr("$"))
|
||||
let nextName = nerdtree#tabpagevar(i, 'NERDTreeBufName')
|
||||
if nextName != -1 && (!exists("t:NERDTreeBufName") || nextName != t:NERDTreeBufName)
|
||||
call add(treeBufNames, nextName)
|
||||
endif
|
||||
endfor
|
||||
let treeBufNames = nerdtree#unique(treeBufNames)
|
||||
|
||||
"map the option names (that the user will be prompted with) to the nerd
|
||||
"tree buffer names
|
||||
let options = {}
|
||||
let i = 0
|
||||
while i < len(treeBufNames)
|
||||
let bufName = treeBufNames[i]
|
||||
let treeRoot = getbufvar(bufName, "NERDTreeRoot")
|
||||
let options[i+1 . '. ' . treeRoot.path.str() . ' (buf name: ' . bufName . ')'] = bufName
|
||||
let i = i + 1
|
||||
endwhile
|
||||
|
||||
"work out which tree to mirror, if there is more than 1 then ask the user
|
||||
let bufferName = ''
|
||||
if len(keys(options)) > 1
|
||||
let choices = ["Choose a tree to mirror"]
|
||||
let choices = extend(choices, sort(keys(options)))
|
||||
let choice = inputlist(choices)
|
||||
if choice < 1 || choice > len(options) || choice ==# ''
|
||||
return
|
||||
endif
|
||||
|
||||
let bufferName = options[sort(keys(options))[choice-1]]
|
||||
elseif len(keys(options)) ==# 1
|
||||
let bufferName = values(options)[0]
|
||||
else
|
||||
call nerdtree#echo("No trees to mirror")
|
||||
return
|
||||
endif
|
||||
|
||||
if nerdtree#treeExistsForTab() && nerdtree#isTreeOpen()
|
||||
call nerdtree#closeTree()
|
||||
endif
|
||||
|
||||
let t:NERDTreeBufName = bufferName
|
||||
call nerdtree#createTreeWin()
|
||||
exec 'buffer ' . bufferName
|
||||
if !&hidden
|
||||
call nerdtree#renderView()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" FUNCTION: nerdtree#invokeKeyMap(key) {{{2
|
||||
"this is needed since I cant figure out how to invoke dict functions from a
|
||||
"key map
|
||||
@@ -533,6 +387,11 @@ function! nerdtree#centerView()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" FUNCTION: nerdtree#chRoot(node) {{{2
|
||||
" changes the current root to the selected one
|
||||
function! nerdtree#chRoot(node)
|
||||
call s:chRoot(a:node)
|
||||
endfunction
|
||||
"FUNCTION: nerdtree#closeTree() {{{2
|
||||
"Closes the primary NERD tree window for this tab
|
||||
function! nerdtree#closeTree()
|
||||
@@ -573,27 +432,6 @@ function! nerdtree#closeTreeIfQuitOnOpen()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#createTreeWin() {{{2
|
||||
"Inits the NERD tree window. ie. opens it, sizes it, sets all the local
|
||||
"options etc
|
||||
function! nerdtree#createTreeWin()
|
||||
"create the nerd tree window
|
||||
let splitLocation = g:NERDTreeWinPos ==# "left" ? "topleft " : "botright "
|
||||
let splitSize = g:NERDTreeWinSize
|
||||
|
||||
if !exists('t:NERDTreeBufName')
|
||||
let t:NERDTreeBufName = nerdtree#nextBufferName()
|
||||
silent! exec splitLocation . 'vertical ' . splitSize . ' new'
|
||||
silent! exec "edit " . t:NERDTreeBufName
|
||||
else
|
||||
silent! exec splitLocation . 'vertical ' . splitSize . ' split'
|
||||
silent! exec "buffer " . t:NERDTreeBufName
|
||||
endif
|
||||
|
||||
setlocal winfixwidth
|
||||
call nerdtree#setCommonBufOptions()
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#dumpHelp {{{2
|
||||
"prints out the quick help
|
||||
function! nerdtree#dumpHelp()
|
||||
@@ -1093,51 +931,6 @@ function! nerdtree#saveScreenState()
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#setCommonBufOptions() {{{2
|
||||
function! nerdtree#setCommonBufOptions()
|
||||
"throwaway buffer options
|
||||
setlocal noswapfile
|
||||
setlocal buftype=nofile
|
||||
setlocal bufhidden=hide
|
||||
setlocal nowrap
|
||||
setlocal foldcolumn=0
|
||||
setlocal foldmethod=manual
|
||||
setlocal nofoldenable
|
||||
setlocal nobuflisted
|
||||
setlocal nospell
|
||||
if g:NERDTreeShowLineNumbers
|
||||
setlocal nu
|
||||
else
|
||||
setlocal nonu
|
||||
if v:version >= 703
|
||||
setlocal nornu
|
||||
endif
|
||||
endif
|
||||
|
||||
iabc <buffer>
|
||||
|
||||
if g:NERDTreeHighlightCursorline
|
||||
setlocal cursorline
|
||||
endif
|
||||
|
||||
call nerdtree#setupStatusline()
|
||||
|
||||
let b:treeShowHelp = 0
|
||||
let b:NERDTreeIgnoreEnabled = 1
|
||||
let b:NERDTreeShowFiles = g:NERDTreeShowFiles
|
||||
let b:NERDTreeShowHidden = g:NERDTreeShowHidden
|
||||
let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks
|
||||
setfiletype nerdtree
|
||||
call nerdtree#bindMappings()
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#setupStatusline() {{{2
|
||||
function! nerdtree#setupStatusline()
|
||||
if g:NERDTreeStatusline != -1
|
||||
let &l:statusline = g:NERDTreeStatusline
|
||||
endif
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#stripMarkupFromLine(line, removeLeadingSpaces){{{2
|
||||
"returns the given line with all the tree parts stripped off
|
||||
"
|
||||
@@ -1175,29 +968,6 @@ function! nerdtree#stripMarkupFromLine(line, removeLeadingSpaces)
|
||||
return line
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#toggle(dir) {{{2
|
||||
"Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is
|
||||
"closed it is restored or initialized (if it doesnt exist)
|
||||
"
|
||||
"Args:
|
||||
"dir: the full path for the root node (is only used if the NERD tree is being
|
||||
"initialized.
|
||||
function! nerdtree#toggle(dir)
|
||||
if nerdtree#treeExistsForTab()
|
||||
if !nerdtree#isTreeOpen()
|
||||
call nerdtree#createTreeWin()
|
||||
if !&hidden
|
||||
call nerdtree#renderView()
|
||||
endif
|
||||
call nerdtree#restoreScreenState()
|
||||
else
|
||||
call nerdtree#closeTree()
|
||||
endif
|
||||
else
|
||||
call nerdtree#initNerdTree(a:dir)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
"SECTION: Interface bindings {{{1
|
||||
"============================================================
|
||||
|
||||
@@ -1226,26 +996,9 @@ function! s:activateBookmark(bm)
|
||||
call a:bm.activate(!a:bm.path.isDirectory ? {'where': 'p'} : {})
|
||||
endfunction
|
||||
|
||||
"FUNCTION: nerdtree#bindMappings() {{{2
|
||||
function! nerdtree#bindMappings()
|
||||
call g:NERDTreeKeyMap.BindAll()
|
||||
|
||||
"make <cr> do the same as the default 'o' mapping
|
||||
exec "nnoremap <silent> <buffer> <cr> :call nerdtree#invokeKeyMap('". g:NERDTreeMapActivateNode ."')<cr>"
|
||||
|
||||
command! -buffer -nargs=? Bookmark :call <SID>bookmarkNode('<args>')
|
||||
command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 RevealBookmark :call <SID>revealBookmark('<args>')
|
||||
command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 OpenBookmark :call <SID>openBookmark('<args>')
|
||||
command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=* ClearBookmarks call <SID>clearBookmarks('<args>')
|
||||
command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=+ BookmarkToRoot call g:NERDTreeBookmark.ToRoot('<args>')
|
||||
command! -buffer -nargs=0 ClearAllBookmarks call g:NERDTreeBookmark.ClearAll() <bar> call nerdtree#renderView()
|
||||
command! -buffer -nargs=0 ReadBookmarks call g:NERDTreeBookmark.CacheBookmarks(0) <bar> call nerdtree#renderView()
|
||||
command! -buffer -nargs=0 WriteBookmarks call g:NERDTreeBookmark.Write()
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:bookmarkNode(name) {{{2
|
||||
" FUNCTION: nerdtree#bookmarkNode(name) {{{2
|
||||
" Associate the current node with the given name
|
||||
function! s:bookmarkNode(...)
|
||||
function! nerdtree#bookmarkNode(...)
|
||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
||||
if currentNode != {}
|
||||
let name = a:1
|
||||
@@ -1295,8 +1048,8 @@ function! s:chRootCwd()
|
||||
call nerdtree#chRoot(g:NERDTreeDirNode.New(cwd))
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:clearBookmarks(bookmarks) {{{2
|
||||
function! s:clearBookmarks(bookmarks)
|
||||
" FUNCTION: nerdtree#clearBookmarks(bookmarks) {{{2
|
||||
function! nerdtree#clearBookmarks(bookmarks)
|
||||
if a:bookmarks ==# ''
|
||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
||||
if currentNode != {}
|
||||
@@ -1464,9 +1217,9 @@ function! s:jumpToPrevSibling(node)
|
||||
call nerdtree#jumpToSibling(a:node, 0)
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:openBookmark(name) {{{2
|
||||
" FUNCTION: nerdtree#openBookmark(name) {{{2
|
||||
" put the cursor on the given bookmark and, if its a file, open it
|
||||
function! s:openBookmark(name)
|
||||
function! nerdtree#openBookmark(name)
|
||||
try
|
||||
let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0)
|
||||
call targetNode.putCursorHere(0, 1)
|
||||
@@ -1532,9 +1285,9 @@ function! s:previewNodeVSplit(node)
|
||||
call a:node.open({'stay': 1, 'where': 'v', 'keepopen': 1})
|
||||
endfunction
|
||||
|
||||
" FUNCTION: s:revealBookmark(name) {{{2
|
||||
" FUNCTION: nerdtree#revealBookmark(name) {{{2
|
||||
" put the cursor on the node associate with the given name
|
||||
function! s:revealBookmark(name)
|
||||
function! nerdtree#revealBookmark(name)
|
||||
try
|
||||
let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0)
|
||||
call targetNode.putCursorHere(0, 1)
|
||||
|
||||
Reference in New Issue
Block a user