如何在Vim中保存和恢复多个不同的会话?

根据我在Vim中的任务,我打开了几个选项卡。

如何保存不同的会话供以后使用?

你想要的东西

 :mksession ~/mysession.vim 

然后,您可以获取该vim文件,然后您将返回旧会话:

 :source ~/mysession.vim 

或者用-S选项打开vim:

 $ vim -S ~/mysession.vim 

你可能想在你的vimrc中设置这些会话选项。 特别是当你保存了会话后你改变了你的vimrc时,这个选项很烦人。

 set ssop-=options " do not store global and local values in a session set ssop-=folds " do not store folds 

请注意:mksession不会将更改保存到您创build的任何文件中。 保存会话后,我犯了这个closuresvim的错误,假设我会从那里开始。 但是下次我打开会话时,对文件所做的更改就没有了。

如果您使用NERDTree作为文件浏览器/短划线,我会推荐使用xolox / vim-session插件而不是内置的mksession命令。 出于某种原因,:mksession无法恢复NERDTree缓冲区。 你的里程可能会有所不同,但我想我会分享我的经验。

如果你想在不使用任何插件的情况下自动化这个过程,你可以使用Go来从Vim Tips Wiki中 回来 。

每次退出Vim时,都会将当前会话保存在~/.vim/sessions下,并在Vim打开后重新加载。 它也基于你当前的path,所以如果你从不同的目录打开Vim,你将会有不同的会话,这在处理不同的项目时非常有用。

只需编辑~/.vimrc文件并添加以下内容:

 function! MakeSession() let b:sessiondir = $HOME . "/.vim/sessions" . getcwd() if (filewritable(b:sessiondir) != 2) exe 'silent !mkdir -p ' b:sessiondir redraw! endif let b:filename = b:sessiondir . '/session.vim' exe "mksession! " . b:filename endfunction function! LoadSession() let b:sessiondir = $HOME . "/.vim/sessions" . getcwd() let b:sessionfile = b:sessiondir . "/session.vim" if (filereadable(b:sessionfile)) exe 'source ' b:sessionfile else echo "No session loaded." endif endfunction " Adding automatons for when entering or leaving Vim au VimEnter * nested :call LoadSession() au VimLeave * :call MakeSession() 

即使是初学者,这个脚本也有点容易理解和定制。

请注意,这个脚本只适用于Unix系统(MacOS / Linux),它需要适应在Windows上工作。


更新:添加0xc0de的build议,如果你希望Vim 只在没有提供参数的情况下加载会话,你可以replace这些VimEnter行。

 if(argc() == 0) au VimEnter * nested :call LoadSession() endif 

这个任务有一个非常有用的插件vim-startify ,它可以处理许多其他的事情,比如最近打开的文件等,它也有一个非常简单的界面。

我使用它几天,直到现在它完美的工作。 希望它可以帮助你。

有这个美妙的插件调用vim会话 。 这是非常强大的。 要安装它:

 cd ~/.vim/bundle git clone https://github.com/xolox/vim-session.git 

我已经在我的.vimrc文件中映射了它的function,如下所示:

 nnoremap <leader>so :OpenSession nnoremap <leader>ss :SaveSession nnoremap <leader>sd :DeleteSession<CR> nnoremap <leader>sc :CloseSession<CR> 

现在在正常模式下input<leader>ss ,你会看到一个这样的命令

 :SaveSession 

现在添加你的会话的名称

  :SaveSession namesession 

就这样。

closuresVim然后重新打开它就行了

  :OpenSession 

你会看到你的会议打开。

.vimrc文件中添加了许多其他configuration,请参阅文档中的示例:

 let g:session_directory = "~/.vim/tmp/session" // the directory must be created before the sessions will be saved there let g:session_autoload = "no" // automatic reload sessions let g:session_autosave = "no" // autosave let g:session_command_aliases = 1 

YouTube上有一个很好的教程 。

谢谢@mathielo @mathielo下面的例子,我添加了下面的行到.vimrc保存活动会话(如果有的话):

 au VimLeave * if this_session != "" | exe "mksession! ".this_session 

如果你想放更多的线,你需要使用endif:

 au VimLeave * if v:this_session != "" au VimLeave * exe "mksession! ".this_session au VimLeave * endif 

你只需要在vim中保存一个新的会话

 :mks [Session filename] 

并在开始之后

 $ vim -S [Session filename] 

vim将启动会话,并且您不必担心在每次closuresvim时保存会话。

如果你没有一个活动会话.vimrc将不会做任何事情。 像之前一样。

这就是我正在寻找的! 再次感谢@mathielo!

你可以将会话存储在任何你想要的地方。

例如:

 :mksession! D:/session.ses 

这将会话存储在D驱动器中。

这可以通过打字打开

 :so D:/session.ses 

在任何vim文件中。

以下是唯一的conf。 这真的对我有用。 我从这里拿走它, 在那里你也可以采取更完整/复杂的版本。

 set viewoptions+=cursor,folds,slash,unix set viewoptions-=options augroup vimrc autocmd BufWritePost * \ if expand('%') != '' && &buftype !~ 'nofile' \| mkview \| endif autocmd BufRead * \ if expand('%') != '' && &buftype !~ 'nofile' \| silent loadview \| endif augroup END 

就我个人而言,我只是将Tim Pope的Obsession插件包装起来,以允许定义一个sessiondir并避免inputpath:

 let g:sessiondir = $HOME . ".vim/sessions" command! -nargs=1 MkSession call MkSession(<f-args>) function! MkSession(sessionfile) if !isdirectory(g:sessiondir) call mkdir(g:sessiondir, "p") endif exe 'Obsession' g:sessiondir . '/' . a:sessionfile endfunction command! -nargs=1 LoadSession call LoadSession(<f-args>) function! LoadSession(sessionfile) let a:sessionpath = g:sessiondir . a:sessionfile if (filereadable(a:sessionpath)) exe 'source ' a:sessionpath else echo "No session loaded." endif endfunction 

如果你打算只有一个会议的项目只是做

 :mks 

这将在当前目录中创build一个Session.vim文件,然后打开会话(从同一个目录):

 vim -S 

如果您更改会话并想保存它:

 :mks! 

这节省了会话,而不是文件本身!

如果您计划进行多个会话 ,我更愿意将它们保存在项目目录中的隐藏文件中:

 :mks .session-name.vim 

打开它(从同一个目录):

 vim -S .session-name.vim 

保存会议:

 :mks! .session-name.vim 

由于会话保存在隐藏文件中,查看它们不要忘记-a

 ls -a 

为了pipe理多个会话(在每个目录/回购的基础上),我最近从vim-session插件切换到了vim-workspace 。 会话pipe理相对简单,运行良好。