Answers:
我不确定是否有特定于NERDTree的方法来执行此操作,但是您始终可以配置Vim,以便将工作目录设置为当前文件的目录:
autocmd BufEnter * lcd %:p:h
现在,在新选项卡中打开文件后,所有要做的就是:NERDTreeToggle
在新选项卡本身中。
我使用以下映射查看NERDTree中的当前缓冲区:
map <leader>r :NERDTreeFind<cr>
<leader>
?
我发现现有的答案都具有教育意义,并成功地将两者结合在一起,使行为更像许多人对IDE的期望:单击打开的窗口/缓冲区,并在NERDTree中突出显示该文件。我把它放在我的〜/ .vimrc中:
autocmd BufEnter * if &modifiable | NERDTreeFind | wincmd p | endif
这是做什么的:
autocmd BufEnter
-每次您专注于缓冲区(包括NERDTree窗口)时运行if &modifiable
-当您单击NERDTree窗口时,请勿执行其他操作(NERDTree窗口不可修改)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()
isNTFocused()
什么?未在&modifiable
检查覆盖情况?
Function name must start with a capital or "s:": rc:isNTOpen()
您是否正在使用扩展范围的插件?
.vimrc
我以前编写代码的位置。我不记得为什么使用了rc:
,但是我认为这是避免命名与其他功能冲突的一种命名方式。据我记得,我没有使用任何与此特别相关的插件。您将不得不研究文档,或者只是尝试将其遗漏,看看是否有任何问题。但是我认为其中一个函数名称与NerdTree或其他地方的内容冲突。近五年来没有人问过,所以我觉得这很简单。:)
昨天,在经过几个小时的挖掘后,我遇到了这个问题,我向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处理。
行为类似,: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
我将使用NERDTree更改当前目录来应用这两种解决方案:用于cd
将NERDTree工作目录设置为当前目录,C
并将NERDTree根节点设置为当前目录
我发现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
<Leader>f