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

4si2a6ki  于 2022-11-11  发布在  其他
关注(0)|答案(8)|浏览(255)

当我有一个NERDtree面板,我保存一个Vim会话(mksession [filename]),然后打开会话(vim -S filename),面板被打开并标记为“NERDtree”,但没有填充。如果我从命令行尝试“:NERDtree”,窗口确实填充了,但现在打开了另一个面板。
你对这种奇怪的行为有什么想法吗?

a7qyws3x

a7qyws3x1#

我决定自己来处理这个问题。在我的例子中,会话是在我退出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

到目前为止,它对我来说就像一个护身符。希望这对我有帮助。

axr492tv

axr492tv2#

我也遇到了同样的问题,在我的研究过程中,我找到了两个解决方案:
你可以使用一个名为“session.vim”的插件,它对恢复NERDree有基本的支持。你可以在这里找到它: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

ars1skjm

ars1skjm3#

要使用会话插件修复NERDTress会话,请在会话插件中嵌入新的会话命令:应该使用“SaveSession”和“OpenSession”,而不是“mksession”和“source”。
根据会话插件作者的注解:Vim的:mksession命令与使用生成的内容创建缓冲区的插件并不真正兼容,这是因为该会话。Vim包含了针对此类插件的特定解决方案:·支持BufExplorer、Project和NERD树窗口;·当安装了shell.vim时,Vim的全屏状态是持久的;·netrw和taglist.vim插件支持现成的会话。
也许这就是为什么我们应该使用新的命令来克服NERDTree会话问题。
有关详细信息,请参阅http://peterodding.com/code/vim/session/

8cdiaqws

8cdiaqws4#

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

lo8azlld

lo8azlld5#

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

rn0zuynd6#

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

mutmk8jj7#

在我的例子中,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

即:

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

btxsgosb8#

示例:

" 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

相关问题