我决定自己解决这个问题。在我的情况下,当我使用以下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”即可。
我是通过这篇文章中的人们发现了这些命令:
基于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 autocommand组添加一个autocommand(在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
即:
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
NERDTreeTabsClose
方法,而不是NERDTreeClose
。这种组合在多个标签会话中也能完美运行。 - Egel" Save session on quitting Vim autocmd VimLeave * NERDTreeClose autocmd VimLeave * mksession! ~/mysession.vim " Start NERDTree when Vim starts with a directory argument. autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * source ~/mysession.vim autocmd VimEnter * NERDTree
- Ilídio Martins