Is there a shortcut which reveal the current file in the NerdTree directory panel.
Like TextMate 'Reveal file in Drawer' - Ctrl+Command+R
6 Answers
in :h NERDTree:
:NERDTreeFind :NERDTreeFind Find the current file in the tree. If no tree exists for the current tab, or the file is not under the current root, then initialize a new tree where the root is the directory of the current file. I don't think it's bound to anything by default, so you have to do a keybind yourself.
nmap ,n :NERDTreeFind<CR> is what appears in my .vimrc, along with
nmap ,m :NERDTreeToggle<CR> 4Check this out, it automates the sync operation, whenever you change buffer, the nerdtree will automatically refreshed itself (I copied from here with tiny modifications)
" Check if NERDTree is open or active function! IsNERDTreeOpen() return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1) endfunction " Call NERDTreeFind iff NERDTree is active, current window contains a modifiable " file, and we're not in vimdiff function! SyncTree() if &modifiable && IsNERDTreeOpen() && strlen(expand('%')) > 0 && !&diff NERDTreeFind wincmd p endif endfunction " Highlight currently open buffer in NERDTree autocmd BufEnter * call SyncTree() 1This should also probably be just a comment. With the current version toggling NerdTree and using SyncTree causes NERDTree to be invoked twice. This modification seems to fix that problem:
" Check if NERDTree is open or active function! IsNERDTreeOpen() return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1) endfunction " Call NERDTreeFind iff NERDTree is active, current window contains a modifiable " file, and we're not in vimdiff function! SyncTree() if &modifiable && IsNERDTreeOpen() && strlen(expand('%')) > 0 && !&diff NERDTreeFind wincmd p endif endfunction " Highlight currently open buffer in NERDTree autocmd BufEnter * call SyncTree() function! ToggleNerdTree() set eventignore=BufEnter NERDTreeToggle set eventignore= endfunction nmap <C-n> :call ToggleNerdTree()<CR> Chen Rushan's answer + the comment worked perfectly well for me only except when the tree is activated. This settings will reveal the current file in tree when the tree is opened.
" Check if NERDTree is open or active function! IsNERDTreeOpen() return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1) endfunction function! CheckIfCurrentBufferIsFile() return strlen(expand('%')) > 0 endfunction " Call NERDTreeFind iff NERDTree is active, current window contains a modifiable " file, and we're not in vimdiff function! SyncTree() if &modifiable && IsNERDTreeOpen() && CheckIfCurrentBufferIsFile() && !&diff NERDTreeFind wincmd p endif endfunction " Highlight currently open buffer in NERDTree autocmd BufRead * call SyncTree() function! ToggleTree() if CheckIfCurrentBufferIsFile() if IsNERDTreeOpen() NERDTreeClose else NERDTreeFind endif else NERDTree endif endfunction " open NERDTree with ctrl + n nmap <C-n> :call ToggleTree()<CR> To go along with Chen Rushan's post, the
autocmd BufEnter * call SyncTree() won't let NERDTree close. I couldn't find a solution (other than below) that would highlight the current open buffer in NERDTree while allowing NERDTree to Toggle.
Below is what I scraped together to be able to toggle NERDTree and have files highlighted while using Ctrl + ] for my next buffer mapping.
Hopefully others can improve this.
"Buffers set hidden function! IsNERDTreeOpen() return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1) endfunction function! NextBuffer() bnext if IsNERDTreeOpen() NERDTreeFind wincmd p endif endfunction nnoremap <c-]> <Esc>:call NextBuffer()<CR> function! PrevBuffer() bprev if IsNERDTreeOpen() NERDTreeFind wincmd p endif endfunction nnoremap <c-[> <Esc>:call PrevBuffer()<CR> function! ToggleNT() NERDTreeToggle endfunction map <c-u> <Esc>:call ToggleNT()<cr> function! NerdTreeToggleFind() if exists("g:NERDTree") && g:NERDTree.IsOpen() NERDTreeClose elseif filereadable(expand('%')) NERDTreeFind else NERDTree endif endfunction nnoremap <C-n> :call NerdTreeToggleFind()<CR>