2010-11-19 122 views
22

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

对这种奇怪的行为有何想法?

回答

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" 
+0

不符合当前NERDtree 5.0工作... – 2016-03-26 19:39:21

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

+0

+1:' “session.vim”,其中有一个基本的support'什么是真的!除了session.vim还有一个autorestore last session选项。正是我想要的... – 2012-01-03 03:09:39

19

刚刚决定处理这一非常问题我自己。就我而言,当我退出Vim在我的vimrc下面是创建的会话:

autocmd VimLeave * mksession! [filename]

我还试图打开NERDTree时自动Vim的打开与:

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

简单明了。顺便说一句,我在这里使用会话恢复代码:http://stackoverflow.com/questions/5142099/auto-save-vim-session-on-quit-and-auto-reload-session-on-start/6052704#6052704 – 2013-06-05 02:28:53

+0

我更喜欢使用由[vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs)使用的标签'NERDTreeTabsClose',而不是'NERDTreeClose'。这种组合对于多个标签会话也可以完美地工作。 – Egel 2015-10-13 13:31:15

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/

2

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

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