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


60

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

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

Answers:



116

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

 map <leader>r :NERDTreeFind<cr>

3
我发现这非常有用,然后我转到了.vimrc。我想使用其他绑定使我更容易记住。而且我发现已经有这个与NERDTree绑定 <Leader>f
甲氧基苯

1
太棒了!示例我在寻找什么。
mawaldne 2015年

您能详细说明一下吗?
jterm

如果您使用的是惊人的vimrc(不是我的),则将其映射到,nf:github.com/amix/vimrc
alpha_989

什么钥匙是<leader>
stillanoob

29

像老板一样在末尾加一个%符号

:NERDTree %

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

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


2
你知道我很怀疑。您所说的话:D。但这是我需要的唯一有效的方法,它做得很好。
雨果

这样的老板回答!
ecbrodie'3

1
很多老板,这样的答案
mhz

唯一的问题是,从空白文件开始时,切换将不起作用,因为当前缓冲区没有目录。
X.Arthur

25

我发现现有的答案都具有教育意义,并成功地将两者结合在一起,使行为更像许多人对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上;这会切换回您最初关注的窗口

注意,这不能在任何其他不可修改的缓冲区上使用,但这通常是一件好事;否则(例如),:help在您进入vim时,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()

1
目的是isNTFocused()什么?未在&modifiable检查覆盖情况?
jrdioko

2
Function name must start with a capital or "s:": rc:isNTOpen()您是否正在使用扩展范围的插件?
Brian Haak'8

1
对不起,但我不知道,@ BrianHaak。我目前不使用NerdTree,并且放错了.vimrc我以前编写代码的位置。我不记得为什么使用了rc:,但是我认为这是避免命名与其他功能冲突的一种命名方式。据我记得,我没有使用任何与此特别相关的插件。您将不得不研究文档,或者只是尝试将其遗漏,看看是否有任何问题。但是我认为其中一个函数名称与NerdTree或其他地方的内容冲突。近五年来没有人问过,所以我觉得这很简单。:)
Lambart '17

4
@Lambart我创建了一个可用的配置,解决了所有问题:gist.github.com/avesus/1954d9384d86cc1e39cb2b2eff7017b7
Brian Haak

1
凉。多年来,我一直在意将各种.rc文件进行git-ify。某天...
Lambart

2

昨天,在经过几个小时的挖掘后,我遇到了这个问题,我向scrooloose的nerdtree repo提交了一个Pull请求,引入了将NERD树根更改为当前工作目录的命令(2012年11月12日更新:PR已合并到上游主服务器,它应该在更新版本上可用)。通过此更改,可以通过以下代码简单地解决此问题。NERDTreeCWD

autocmd BufEnter * silent! if bufname('%') !~# 'NERD_tree_' | cd %:p:h | NERDTreeCWD | wincmd p | endif

与@shinzui和@Lambart的NERDTreeFind方法相比,这确实符合问题的要求。使用NERDTreeFind将更改nerdtree的滚动位置,并且结果并不总是相同的(如果CWD在NERD树根中,则只是简单地扩展节点而不是更改为该节点)。

与@Yaser Sulaiman的答案相比,此解决方案总是打开NERD树形窗口,并且可以轻松编码。如果NERD树窗口已经打开,NERDTreeToggle则将需要触发两次使用(首先关闭现有窗口,然后再次打开它),不幸的是,第二次打开将跳过整个cwd处理。


您的解决方案是否导致NERDTree始终处于打开状态?另外,我发现如果我使用MRU插件并尝试打开文件,则在使用此更改后,它将在NERDtree窗口中打开文件。就目前而言,这种修改会导致与MRU(github.com/yegappan/mru/wiki/User-Manual)产生很多问题和冲突,但是我不知道为什么。也许其他人可以检查他们是否有类似的问题。我确实喜欢NERDtree选项卡始终处于打开状态
。–

是的,这导致NERDTree始终处于打开状态。悲伤
Meredith '18

1

行为类似,:NERDTreeToggle但将在NERDTree中显示当前打开的文件。如果尚未打开文件(即,您刚刚vim在命令行中输入了文件),则NERDTree将显示/home

将其放在您的.vimrc中:

" Open NERDTree in the directory of the current file (or /home if no file is open)
nmap <silent> <C-i> :call NERDTreeToggleInCurDir()<cr>
function! NERDTreeToggleInCurDir()
  " If NERDTree is open in the current buffer
  if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
    exe ":NERDTreeClose"
  else
    exe ":NERDTreeFind"
  endif
endfunction



0

我发现Matthias发布的答案对于一个问题来说是一个很好的答案,在一些极端情况下效果不佳。进行以下更改后效果会更好:

function! NERDTreeToggleInCurDir()
  " If NERDTree is open in the current buffer
  if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
    exe ":NERDTreeClose"
  elseif bufname('%')
    exe ":NERDTreeFind"
  else
    exe ":NERDTreeCWD"
  endif
endfunction
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.