27

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

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

4

6 回答 6

27

只是决定自己处理这个问题。就我而言,当我在 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

到目前为止,它对我来说就像一个魅力。希望这可以帮助。

于 2011-09-28T22:55:00.600 回答
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”命令上几个目录,然后键入“C”。

感谢这篇文章中的人,我发现了这些命令:

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

于 2011-06-12T10:02:27.950 回答
4

要使用会话插件修复 NERDTress 会话,应使用嵌入在会话插件中的新会话命令:“SaveSession”和“OpenSession”,而不是“mksession”和“source”。

根据会话插件作者的评论:Vim 的 :mksession 命令与使用生成的内容创建缓冲区的插件并不真正兼容,因此 session.vim 包含此类插件的特定解决方法: •BufExplorer、Project 和 NERD 树支持窗口;• 安装shell.vim 时,Vim 的全屏状态保持不变;• netrw 和 taglist.vim 插件支持开箱即用的会话。

也许这就是我们应该使用新命令来克服 NERDTree 会话问题的原因。

更多详情请参考http://peterodding.com/code/vim/session/

于 2012-06-26T09:52:18.567 回答
2

或者您可以使用Vimpanel,它具有内置的会话支持以及其他功能。

于 2013-01-23T11:40:11.087 回答
2

另一种基于 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>)
于 2017-02-25T21:59:38.127 回答
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"
于 2011-03-11T09:26:29.263 回答