如何在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理相对简单,运行良好。