NerdTree - 在树形目录中显示文件

125

有没有一种快捷方式可以在NerdTree目录面板中显示当前文件。

就像TextMate的“在抽屉中显示文件”-Ctrl+Command+R一样。

6个回答

224

在: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.

我认为它默认情况下没有绑定任何东西,因此您必须自己进行键位绑定。

nmap ,n :NERDTreeFind<CR>

这是出现在我的.vimrc文件中的内容,连同其它一起。

nmap ,m :NERDTreeToggle<CR>

键位映射已经生效,但如何在vim中调用NERDTreeFind? - 4Z4T4R
15
@toszter 只需输入 :NERDTreeFind 即可。 - Thomas
1
有没有办法在该选项卡中创建NERDTree时自动设置它执行此操作? - Mr Mikkél
1
@MrA,你只需要使用NERDTreeFind命令创建NERDTree - 这样就足够了吗? - Thomas
有没有办法合并:NERDTreeToggleVCS:NERDTreeFind?我想要在树中显示当前文件,其父级是版本控制系统的父级。 - undefined

23

看这个,它可以自动同步操作,每当你更改缓冲区时,nerdtree会自动刷新自己(我从这里复制并进行微小修改)

" 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()

1
这个配置在大多数情况下都很好用,但当我使用 coc.nvim 的 go to references 功能时,它会把一切都搞砸。使用 BufRead 事件代替 BufEnter 解决了这个问题。 - Eddie Cooro
使用:NERDTreeToggle切换时,会打开第二个NERDTree缓冲区。 - unrealapex

9

这也可能只是一条注释。使用当前版本切换NerdTree并使用SyncTree会导致NERDTree被调用两次。这个修改似乎可以解决这个问题:

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

4
Chen Rushan的回答和评论对我非常有帮助,除了当树形目录打开时。使用此设置,当树形目录打开时,将显示树形目录中当前文件的位置。
" 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>

太好了!我希望这个脚本还能有另一个功能,如果可能的话,折叠其他已打开的树形目录,只展开当前文件的目录,会更加清晰整洁。 - undefined

1
function! NerdTreeToggleFind()
    if exists("g:NERDTree") && g:NERDTree.IsOpen()
        NERDTreeClose
    elseif filereadable(expand('%'))
        NERDTreeFind
    else
        NERDTree
    endif
endfunction

nnoremap <C-n> :call NerdTreeToggleFind()<CR>

0
为了配合陈如山的帖子,
autocmd BufEnter * call SyncTree()

无法让NERDTree关闭。我找不到其他解决方案(除了下面的)可以在允许NERDTree切换的同时突出显示NERDTree中当前打开的缓冲区。

以下是我凑合着用来切换NERDTree并在使用Ctrl + ]进行下一个缓冲区映射时突出显示文件的方法。

希望其他人可以改进这个方法。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接