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

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

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

103567 次浏览

你想要的是

: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不会将所做的更改保存到任何文件中。我犯了这个错误,在保存会话后关闭vim,假设我将从那里开始。但是当我再次打开会话时,我对文件所做的更改已经消失了。

如果你使用NERDTree作为文件资源管理器/dash,我建议使用xolox / vim会话插件而不是内置的:mksession命令。由于某种原因,:mksession无法恢复NERDTree缓冲区。你的观点可能不同,但我想分享一下我的经验。

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

我使用它几天了,直到现在它工作得很好。希望对你有所帮助。

有一个很棒的插件叫vim会话。它非常强大。安装方法:

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

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

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

现在在正常模式下,只要输入<leader>ss,你就会看到这样的命令

:SaveSession

现在添加会话的名称

 :SaveSession namesession

就这些。

当你关闭Vim并重新打开它时,就这么做

 :OpenSession

你会看到你的会议开始了。

在你的.vimrc文件中还有很多其他的配置要添加,参见文档中的例子:

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上有一个很好的教程

如果你想在不使用任何插件的情况下自动化这个过程,你可以使用Vim小贴士维基中的走开,再回来

每次退出Vim时,它都会将当前会话保存在~/.vim/sessions下,并在Vim打开后再次加载它。它也基于您当前的路径,因此如果您从不同的目录打开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。


更新:添加0 xc0de的建议,如果你想让Vim加载会话只有在没有提供参数的情况下,你可以替换这些VimEnter行:

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

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

例:

:mksession! D:/session.ses

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

这可以通过输入打开

:so D:/session.ses

在任何vim文件中。

下面是唯一一个对我有用的对话。我从在这里取的,在那里你也可以取一个更完整/复杂的版本。

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
< p >谢谢@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 with中保存一个新会话

:mks [Session filename]

开始之后

$ vim -S [Session filename]

Vim将启动会话,您不必担心每次关闭Vim时都要保存会话。

如果没有活动会话,vimrc将不会做任何事情。像以前一样。

这就是我要找的!再次感谢@mathielo!

就我个人而言,我只是包装了Tim Pope的痴迷插件,以允许定义sessiondir并避免输入路径:

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

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

vim -S

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

:mks!

这将保存会话,而不是文件本身!

如果你计划有多个会议,我更喜欢将它们保存在项目目录中的隐藏文件中:

:mks .session-name.vim

打开它(从同一目录):

vim -S .session-name.vim

保存会话:

:mks! .session-name.vim

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

ls -a

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

因为这是谷歌上对我(可能还有其他人)的第一次打击,关于如何在Vim中使用会话,我决定在@mathielo的回答中添加一点关于如何使此自动。

我喜欢他的代码,但“仅当不带参数时”的解决方案似乎有点不足。这是我修改过的版本:

function! MakeSession(overwrite)
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'
if a:overwrite == 0 && !empty(glob(b:filename))
return
endif
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
if(argc() == 0)
au VimEnter * nested :call LoadSession()
au VimLeave * :call MakeSession(1)
else
au VimLeave * :call MakeSession(0)
endif

这里值得注意的变化是可选的覆盖。如果你打开没有选项的Vim,它将打开任何现有的会话,并覆盖你离开时所做的更改。如果Vim是带选项打开的,它只会在不存在会话的情况下创建一个新的会话,这意味着您可以在一个有会话的目录中打开单个文件而不会覆盖它。然后可以打开不带选项的Vim来运行会话。如果不存在会话,则创建一个新的会话。