mirror of
https://github.com/preservim/nerdtree.git
synced 2025-11-08 19:33:50 -05:00
When g:NERDTreeChDirMode is 2, changing the tree root will change the working directory as well. This change was silent because the wrong function was used to make the switch. This commit uses a better function that echoes a message.
198 lines
5.1 KiB
VimL
198 lines
5.1 KiB
VimL
"CLASS: NERDTree
|
|
"============================================================
|
|
let s:NERDTree = {}
|
|
let g:NERDTree = s:NERDTree
|
|
|
|
"FUNCTION: s:NERDTree.AddPathFilter() {{{1
|
|
function! s:NERDTree.AddPathFilter(callback)
|
|
call add(s:NERDTree.PathFilters(), a:callback)
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.changeRoot(node) {{{1
|
|
function! s:NERDTree.changeRoot(node)
|
|
if a:node.path.isDirectory
|
|
let self.root = a:node
|
|
else
|
|
call a:node.cacheParent()
|
|
let self.root = a:node.parent
|
|
endif
|
|
|
|
call self.root.open()
|
|
|
|
"change dir to the dir of the new root if instructed to
|
|
if g:NERDTreeChDirMode ==# 2
|
|
call self.root.path.changeToDir()
|
|
endif
|
|
|
|
call self.render()
|
|
call self.root.putCursorHere(0, 0)
|
|
|
|
silent doautocmd User NERDTreeNewRoot
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.Close() {{{1
|
|
"Closes the tab tree window for this tab
|
|
function! s:NERDTree.Close()
|
|
if !s:NERDTree.IsOpen()
|
|
return
|
|
endif
|
|
|
|
if winnr("$") != 1
|
|
if winnr() == s:NERDTree.GetWinNum()
|
|
call nerdtree#exec("wincmd p")
|
|
let bufnr = bufnr("")
|
|
call nerdtree#exec("wincmd p")
|
|
else
|
|
let bufnr = bufnr("")
|
|
endif
|
|
|
|
call nerdtree#exec(s:NERDTree.GetWinNum() . " wincmd w")
|
|
close
|
|
call nerdtree#exec(bufwinnr(bufnr) . " wincmd w")
|
|
else
|
|
close
|
|
endif
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.CloseIfQuitOnOpen() {{{1
|
|
"Closes the NERD tree window if the close on open option is set
|
|
function! s:NERDTree.CloseIfQuitOnOpen()
|
|
if g:NERDTreeQuitOnOpen && s:NERDTree.IsOpen()
|
|
call s:NERDTree.Close()
|
|
endif
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.CursorToBookmarkTable(){{{1
|
|
"Places the cursor at the top of the bookmarks table
|
|
function! s:NERDTree.CursorToBookmarkTable()
|
|
if !b:NERDTree.ui.getShowBookmarks()
|
|
throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active"
|
|
endif
|
|
|
|
if g:NERDTreeMinimalUI
|
|
return cursor(1, 2)
|
|
endif
|
|
|
|
let rootNodeLine = b:NERDTree.ui.getRootLineNum()
|
|
|
|
let line = 1
|
|
while getline(line) !~# '^>-\+Bookmarks-\+$'
|
|
let line = line + 1
|
|
if line >= rootNodeLine
|
|
throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table"
|
|
endif
|
|
endwhile
|
|
call cursor(line, 2)
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.CursorToTreeWin(){{{1
|
|
"Places the cursor in the nerd tree window
|
|
function! s:NERDTree.CursorToTreeWin()
|
|
call g:NERDTree.MustBeOpen()
|
|
call nerdtree#exec(g:NERDTree.GetWinNum() . "wincmd w")
|
|
endfunction
|
|
|
|
" Function: s:NERDTree.ExistsForBuffer() {{{1
|
|
" Returns 1 if a nerd tree root exists in the current buffer
|
|
function! s:NERDTree.ExistsForBuf()
|
|
return exists("b:NERDTree")
|
|
endfunction
|
|
|
|
" Function: s:NERDTree.ExistsForTab() {{{1
|
|
" Returns 1 if a nerd tree root exists in the current tab
|
|
function! s:NERDTree.ExistsForTab()
|
|
if !exists("t:NERDTreeBufName")
|
|
return
|
|
end
|
|
|
|
"check b:NERDTree is still there and hasn't been e.g. :bdeleted
|
|
return !empty(getbufvar(bufnr(t:NERDTreeBufName), 'NERDTree'))
|
|
endfunction
|
|
|
|
function! s:NERDTree.ForCurrentBuf()
|
|
if s:NERDTree.ExistsForBuf()
|
|
return b:NERDTree
|
|
else
|
|
return {}
|
|
endif
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.ForCurrentTab() {{{1
|
|
function! s:NERDTree.ForCurrentTab()
|
|
if !s:NERDTree.ExistsForTab()
|
|
return
|
|
endif
|
|
|
|
let bufnr = bufnr(t:NERDTreeBufName)
|
|
return getbufvar(bufnr, "NERDTree")
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.getRoot() {{{1
|
|
function! s:NERDTree.getRoot()
|
|
return self.root
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.GetWinNum() {{{1
|
|
"gets the nerd tree window number for this tab
|
|
function! s:NERDTree.GetWinNum()
|
|
if exists("t:NERDTreeBufName")
|
|
return bufwinnr(t:NERDTreeBufName)
|
|
endif
|
|
|
|
return -1
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.IsOpen() {{{1
|
|
function! s:NERDTree.IsOpen()
|
|
return s:NERDTree.GetWinNum() != -1
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.isTabTree() {{{1
|
|
function! s:NERDTree.isTabTree()
|
|
return self._type == "tab"
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.isWinTree() {{{1
|
|
function! s:NERDTree.isWinTree()
|
|
return self._type == "window"
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.MustBeOpen() {{{1
|
|
function! s:NERDTree.MustBeOpen()
|
|
if !s:NERDTree.IsOpen()
|
|
throw "NERDTree.TreeNotOpen"
|
|
endif
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.New() {{{1
|
|
function! s:NERDTree.New(path, type)
|
|
let newObj = copy(self)
|
|
let newObj.ui = g:NERDTreeUI.New(newObj)
|
|
let newObj.root = g:NERDTreeDirNode.New(a:path, newObj)
|
|
let newObj._type = a:type
|
|
return newObj
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.PathFilters() {{{1
|
|
function! s:NERDTree.PathFilters()
|
|
if !exists('s:NERDTree._PathFilters')
|
|
let s:NERDTree._PathFilters = []
|
|
endif
|
|
return s:NERDTree._PathFilters
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.previousBuf() {{{1
|
|
function! s:NERDTree.previousBuf()
|
|
return self._previousBuf
|
|
endfunction
|
|
|
|
function! s:NERDTree.setPreviousBuf(bnum)
|
|
let self._previousBuf = a:bnum
|
|
endfunction
|
|
|
|
"FUNCTION: s:NERDTree.render() {{{1
|
|
"A convenience function - since this is called often
|
|
function! s:NERDTree.render()
|
|
call self.ui.render()
|
|
endfunction
|