Vim,NERDtree在会话恢复中没有恢复

时间:2010-11-19 16:11:30

标签: vim nerdtree

当我有一个NERDtree面板并保存一个Vim会话(mksession [filename]),然后打开会话(vim -S文件名),面板打开并标记为“NERDtree”但未填充。如果我从命令行尝试“:NERDtree”,窗口会填充,但现在会打开另一个面板。

这种奇怪的行为有什么想法吗?

6 个答案:

答案 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”。

我在这篇文章中找到了这些命令:

https://superuser.com/questions/195022/vim-how-to-synchronize-nerdtree-with-current-opened-tab-file-path

答案 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>)