Vim:如何将 NERDTree 与当前打开的选项卡文件路径同步?

Jic*_*hao 73 vim gvim nerdtree vim-plugins

当我在 VIM 中打开一个与前一个文件路径不同的新选项卡时,NERDTree 仍将保持与前一个文件相同的目录层次结构。

是否有同步快捷方式将当前根目录更改为新打开的文件目录?

小智 136

我使用以下映射来查看 NERDTree 中的当前缓冲区:

 map <leader>r :NERDTreeFind<cr>
Run Code Online (Sandbox Code Playgroud)

  • 我发现这非常有用,我去了我的 .vimrc。我想使用其他一些绑定来让我更容易记住。我发现 NERDTree `&lt;Leader&gt;f` 已经有一个绑定 (3认同)

sch*_*pet 40

像老板一样在最后扔一个 % 符号

:NERDTree %

我的 .vimrc 中有这个,它映射Ctrl+o以在当前缓冲区的目录中切换 nerdtree:

map <C-o> :NERDTreeToggle %<CR>

  • 你知道我很怀疑。就像你说的那样:D。但这是唯一像我需要的那样工作的东西,做得好。 (2认同)
  • 很多老板,这样的答案 (2认同)
  • 唯一的问题是从空白文件开始时,切换将不起作用,因为当前缓冲区没有目录。 (2认同)

Lam*_*art 34

我发现现有的两个答案都具有教育意义,并成功地将两者结合起来,使行为更像许多人对 IDE 的期望:单击打开的窗口/缓冲区,并在 NERDTree 中突出显示该文件。我把它放在我的 ~/.vimrc 中:

autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif

这是做什么的:

  1. autocmd BufEnter - 每次关注缓冲区时运行(包括 NERDTree 窗口)
  2. if &modifiable - 当你点击 NERDTree 窗口时,什么都不做(NERDTree 窗口是不可修改的)
  3. wincmd p- NERDTreeFind 将光标放在 NERDTree 上;这将切换回您最初关注的窗口

请注意,这不适用于任何其他不可修改的缓冲区——但这通常是一件好事;否则(例如)任何时候你进入:helpvim,NERDTree 都会找到并聚焦存储帮助文件的目录——可能不是你想要它做的事情。

起初,这种单行解决方案对我很有用,但我很快发现它会导致 NERDTree 在我打开文件时激活——结果,它阻止了 NERDTree 被关闭!如果您不想全职使用 NERDTree,请将其放在您的 .vimrc 中:

" returns true iff is NERDTree open/active
function! rc:isNTOpen()        
  return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1)
endfunction

" calls NERDTreeFind iff NERDTree is active, current window contains a modifiable file, and we're not in vimdiff
function! rc:syncTree()
  if &modifiable && rc:isNTOpen() && strlen(expand('%')) > 0 && !&diff
    NERDTreeFind
    wincmd p
  endif
endfunction

autocmd BufEnter * call rc:syncTree()
Run Code Online (Sandbox Code Playgroud)

  • @Lambart 我创建了一个可用的配置,解决了所有问题:https://gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7 (7认同)
  • `函数名称必须以大写字母或 "s:" 开头:rc:isNTOpen()` 您是否使用了扩展作用域的插件? (3认同)

小智 17

我不确定是否有特定于 NERDTree 的方法可以做到这一点,但是您始终可以配置 Vim,以便它将工作目录设置为当前文件的目录

autocmd BufEnter * lcd %:p:h
Run Code Online (Sandbox Code Playgroud)

现在,在新选项卡中打开文件后您要做的所有事情都在新选项:NERDTreeToggle卡本身中。