当我有一个NERDtree面板并保存一个Vim会话(mksession [filename]),然后打开会话(vim -S文件名),面板打开并标记为“NERDtree”但未填充。如果我从命令行尝试“:NERDtree”,窗口会填充,但现在会打开另一个面板。
这种奇怪的行为有什么想法吗?
答案 0 :(得分:23)
我决定自己处理这个问题。在我的例子中,当我在我的vimrc中退出Vim时会创建会话:
autocmd VimLeave * mksession! [filename]
当Vim打开时,我也试图自动打开NERDTree:
autocmd VimEnter * NERDTree
结果是我的会话打开了两个NERDTree实例,就像原帖中描述的那样。我的解决方案是在保存会话之前简单地关闭NERDTree,这样我的自动打开调用只会打开一个NERDTree实例。
我的解决方案
" Save session on quitting Vim
autocmd VimLeave * NERDTreeClose
autocmd VimLeave * mksession! [filename]
" Restore session on starting Vim
autocmd VimEnter * call MySessionRestoreFunction()
autocmd VimEnter * NERDTree
到目前为止,它对我来说就像一个魅力。希望这会有所帮助。
答案 1 :(得分:6)
我遇到了同样的问题,在我的研究中我找到了两个解决方案:
您可以使用名为“session.vim”的插件,该插件具有恢复NERDTree的基本支持。您可以在此处找到它:http://www.vim.org/scripts/script.php?script_id=3150
我自己发现这个插件不适合我,所以我采取了另一种方法。 您可以将vim配置为自动将缓冲区的目录设置为等于您的工作目录。
autocmd BufEnter * lcd %:p:h
由于NERDTree在您第一次打开工作目录时会打开工作目录,因此您已经到了想要的位置!
在打开你的文件或你的会话后,只需打开NERDTree 。
但是,由于魔法只能在一个标签中首次使用,您可以使用以下命令让NERDTree 在树中找到您的文件。
map <leader>r :NERDTreeFind<cr>
要整理树,只需使用“p”命令然后输入几个directorys,然后输入“C”。
我在这篇文章中找到了这些命令:
答案 2 :(得分:4)
要使用会话插件修复NERDTress会话,应使用会话插件中嵌入的新会话命令:“SaveSession”和“OpenSession”,而不是“mksession”和“source”。
根据会话插件作者的评论: Vim:mksession命令与创建具有生成内容的缓冲区的插件并不真正兼容,并且因为此会话.vim包含此类插件的特定解决方法: •支持BufExplorer,Project和NERD树窗口; •安装shell.vim时,Vim的全屏状态会保持不变; •netrw和taglist.vim插件支持开箱即用的会话。
也许这就是为什么我们应该使用新命令来克服NERDTree会话问题。
有关详细信息,请参阅http://peterodding.com/code/vim/session/。
答案 3 :(得分:2)
或者您可以使用Vimpanel,内置会话支持以及其他功能。
答案 4 :(得分:1)
使NERDTree按照预期的方式执行会话的最简单方法可能是修补NERD_tree.vim,向NERDTree自动命令组添加自动命令(在augroup NERDTree
行之后):
exec "autocmd BufEnter ". s:NERDTreeBufName ."* call <SID>initNerdTreeInPlace(\"\")"
它没有经过广泛测试,但这似乎对我来说有几个布局和不同数量的NERDTree窗口打开。
编辑:实际上,由于NERDTree具有主窗口和辅助窗口,并且会话文件中没有指示NERDTree缓冲区是否是其中一个,因此这不是很好。看起来为插件添加可靠的支持并不是一个巨大的挑战,但它不仅仅是微不足道的。与此同时,对于简单的情况,添加以下自动命令(而不是上面的自动命令)可能会执行您想要的操作:
exec "autocmd BufEnter ". s:NERDTreeBufName ."* :NERDTreeToggle | :NERDTreeToggle"
答案 5 :(得分:0)
另一种基于stevelove的解决方案:
fun! Mksession(name)
let need_tree = g:NERDTree.IsOpen()
NERDTreeClose
execute "mksession! " . a:name
if need_tree
call writefile(readfile(a:name)+['NERDTree'], a:name)
NERDTree
endif
endfun
command! -nargs=1 Mksession call Mksession(<f-args>)