119

是否有在 NerdTree 目录面板中显示当前文件的快捷方式。

像 TextMate '在抽屉中显示文件' - Ctrl+Command+R

4

5 回答 5

213

在 :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>
于 2011-10-07T20:01:16.527 回答
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()
于 2017-02-10T08:42:11.853 回答
7

这也应该只是一个评论。当前版本切换 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>
于 2020-01-29T23:21:19.317 回答
2

陈如山的回答+评论对我来说效果很好,除非树被激活。此设置将在打开树时显示树中的当前文件。

" 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>
于 2020-07-02T23:18:59.370 回答
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>
于 2019-12-05T23:50:08.367 回答