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

Ere*_*rez 24 vim nerdtree

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

任何想法都是这种奇怪的行为吗?

ste*_*ove 24

刚决定自己处理这个问题.在我的例子中,当我在我的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
Run Code Online (Sandbox Code Playgroud)

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


Jul*_*mer 6

我有同样的问题,在我的研究中我发现了两个解决方案:

您可以使用名为"session.vim"的插件,它具有恢复NERDTree的基本支持.你可以在这里找到它:http://www.vim.org/scripts/script.php?script_id = 3150

我发现这个插件不适合我,所以我采取了另一种方法.您可以将vim配置为自动将缓冲区的目录设置为等于您的工作目录.

autocmd BufEnter * lcd %:p:h
Run Code Online (Sandbox Code Playgroud)

由于NERDTree在您第一次打开它时会打开工作目录,因此您已经到了想要的位置!

在这种情况下打开文件或会话后,只需打开NERDTree即可.

但是,由于魔法仅在一个选项卡中第一次起作用,因此您可以使用以下命令让NERDTree 在树中查找您的文件.

map <leader>r :NERDTreeFind<cr>
Run Code Online (Sandbox Code Playgroud)

要整理树,只需使用"p"命令然后输入几个directorys,然后键入"C".

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

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


tor*_*iak 1

让 NERDTree 在会话中按预期运行的最简单方法可能是修补 NERD_tree.vim,将自动命令添加到 NERDTree 自动命令组中(就在该augroup NERDTree行之后):

exec "autocmd BufEnter ". s:NERDTreeBufName ."* call <SID>initNerdTreeInPlace(\"\")"
Run Code Online (Sandbox Code Playgroud)

它没有经过广泛的测试,但这似乎对我来说适用于多种布局和打开不同数量的 NERDTree 窗口。

编辑:实际上,这效果不太好,因为 NERDTree 有主窗口和辅助窗口,并且会话文件中没有指示 NERDTree 缓冲区是其中之一。看起来向插件添加对此的可靠支持并不是那么大的挑战,但它不仅仅是微不足道的。同时,对于简单的情况,添加以下自动命令(而不是上面的命令)可能会满足您的要求:

exec "autocmd BufEnter ". s:NERDTreeBufName ."* :NERDTreeToggle | :NERDTreeToggle"
Run Code Online (Sandbox Code Playgroud)