繁体   English   中英

Vim,NERDtree 在会话还原中未恢复

[英]Vim, NERDtree not recovered in session restore

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

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

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

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

我遇到了同样的问题,在研究过程中我找到了两个解决方案:

您可以使用一个名为“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

要使用会话插件修复 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/

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

另一种基于 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>)

使 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"

就我而言,NERDTree 在加载会话后打开,但它没有显示任何文件。 以下脚本修复了该问题:

" Automatically save the session when leaving vim
set sessionoptions=blank,buffers,curdir,help,tabpages,winsize
autocmd VimLeave * NERDTreeClose
autocmd! VimLeave * mksession! ~/Session.vim

" Automatically load the session when entering vim when no arguments were provided
if argc() == 0 && filereadable(expand('~/Session.vim'))
    autocmd! VimEnter * source ~/Session.vim
    autocmd VimEnter * :NERDTreeToggle | wincmd l | wincmd q
endif

IE:

  • 在保存会话之前 - 关闭 NERDTree
  • 加载会话后 - 打开 NERDTree(现在有两个),使用wincmd l转到另一个并使用wincmd q关闭

例子:

" Save session on quitting Vim but we have to first close NERDTree
autocmd VimLeave * NERDTreeClose
autocmd VimLeave * mksession! ~/mysession.vim

" Open session first and then start NERDTree
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * source ~/mysession.vim
autocmd VimEnter * NERDTree

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM