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

时间:2009-10-29 09:53:04

标签: session vim

根据我在Vim的任务,我打开了几个标签。

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

14 个答案:

答案 0 :(得分:476)

你想要像

这样的东西
:mksession ~/mysession.vim

之后您可以获取该vim文件,然后您将恢复旧会话:

:source ~/mysession.vim

或使用-S选项打开vim:

$ vim -S ~/mysession.vim

答案 1 :(得分:58)

您可能希望在vimrc中设置这些会话选项。特别是当您在保存会话后更改了vimrc时,选项会很烦人。

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

答案 2 :(得分:39)

请注意:mksession不会将更改保存到您创建的任何文件中。假设我将从那里开始,我在保存会话后犯了关闭vim的错误。但是下次我打开会话时,我对文件所做的更改就消失了。

答案 3 :(得分:30)

如果您使用NERDTree作为文件资源管理器/破折号,我建议使用xolox/vim-session plugin而不是内置的:mksession命令。出于某种原因,:mksession无法恢复NERDTree缓冲区。你的里程可能会有所不同,但我想我会分享我的经验。

答案 4 :(得分:14)

如果您想在不使用任何插件的情况下自动执行该过程,可以使用Go away and come back中的Vim Tips Wiki

每次退出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上运行。

更新:添加0xc0de的建议,如果您希望Vim仅加载会话,则可以替换这些版本的VimEnter行没有提供参数

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

答案 5 :(得分:5)

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

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

答案 6 :(得分:3)

有一个很棒的插件vim-session。它非常强大。安装它:

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

答案 7 :(得分:3)

由于这是我(尤其是其他人)关于如何在Vim中使用会话的第一次谷歌打击,我决定在@ mathielo上添加一些关于如何使其自动化的答案

我喜欢他的代码,但只有在没有args&#34;的情况下添加&#34;解决方案似乎有点缺乏。这是我修改过的版本:

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而不用选项来运行会话。如果没有会话,那么它会创建一个新会话。

答案 8 :(得分:1)

谢谢@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将启动会话,每次关闭vim时都不必担心保存会话。

如果您没有活动会话.vimrc将不会执行任何操作。和以前一样。

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

答案 9 :(得分:1)

就我个人而言,我只是对Tim Pope&#39; s Obsession插件允许定义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

答案 10 :(得分:0)

您可以在任何地方存储会话。

例如:

:mksession! D:/session.ses

这会将会话存储在D盘中。

可以通过输入

打开
:so D:/session.ses

在任何vim文件中。

答案 11 :(得分:0)

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

    String c = "coins<col=ffffff> x <col=ffff00>";
    String c2 = "coins<col=ffffff> x <col=ffffff>100k (100,000)";
    String c3 = "coins<col=ffffff> x <col=00ff80>10m (10,000,000)";

答案 12 :(得分:0)

如果您计划只为项目设置一个会话

:mks

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

vim -S

如果您更改了会话并希望保存它:

:mks!
  

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

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

:mks .session-name.vim

要打开它(来自同一目录):

vim -S .session-name.vim

保存会话:

:mks! .session-name.vim

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

ls -a

答案 13 :(得分:0)

为了管理多个会话(基于每个目录/ repo),我最近从vim-session插件切换到vim-workspace。它的会话管理相对简单,运行良好。