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

Jog*_*usa 363 vim session

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

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

Ben*_*enj 487

你想要的东西

:mksession ~/mysession.vim
Run Code Online (Sandbox Code Playgroud)

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

:source ~/mysession.vim
Run Code Online (Sandbox Code Playgroud)

或使用-S选项打开vim:

$ vim -S ~/mysession.vim
Run Code Online (Sandbox Code Playgroud)

  • 哦,我差点忘了你可以输入:gvim -S~/mysession.vim来加载它 (27认同)
  • 如果您没有指定会话文件名,它将默认写入和读取`Session.vim`.因此,如果您只想在当前目录中保存一个会话,则可以使用vim中的`:mksession`或`:mks`来保存当前会话,只需要`vim -S`来打开它. (14认同)
  • 简短的是:所以〜/文件.如果您碰巧想要获取当前文件的简单:那么%将为您完成工作. (8认同)
  • 哎呀!抱歉,Benj,我的意思是命令模式。我已经找到它了:``:source ~/mysession.vim´´。 (2认同)

小智 59

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

set ssop-=options    " do not store global and local values in a session
set ssop-=folds      " do not store folds
Run Code Online (Sandbox Code Playgroud)


小智 40

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

  • 这应该带有与`:mksession`相关的任何答案. (11认同)
  • 或只是`:xa`少一次击键.好极了! (9认同)
  • 是的,你可能想在后面加上 `:wqa` (2认同)

gds*_*dso 32

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


mat*_*elo 15

如果您想在不使用任何插件的情况下自动执行该过程,您可以使用Go away并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()
Run Code Online (Sandbox Code Playgroud)

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

请注意,此脚本仅适用于Unix系统(MacOS/Linux),需要适应在Windows上运行.


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

if(argc() == 0)
  au VimEnter * nested :call LoadSession()
endif
Run Code Online (Sandbox Code Playgroud)


PMu*_*nch 9

由于这是我(可能还有其他人)第一次在 Google 上讨论如何在 Vim 中使用会话,因此我决定在@mathielo 的回答中添加一些关于如何使其自动化的答案。

我喜欢他的代码,但是“仅当没有 args”解决方案的添加似乎有点缺乏。这是我的修改版本:

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
Run Code Online (Sandbox Code Playgroud)

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


viv*_*vek 6

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

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


cut*_*ptr 6

如果你计划只有 1 个项目的会话就做

:mks
Run Code Online (Sandbox Code Playgroud)

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

vim -S
Run Code Online (Sandbox Code Playgroud)

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

:mks!
Run Code Online (Sandbox Code Playgroud)

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

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

:mks .session-name.vim
Run Code Online (Sandbox Code Playgroud)

打开它(从同一目录):

vim -S .session-name.vim
Run Code Online (Sandbox Code Playgroud)

保存会议:

:mks! .session-name.vim
Run Code Online (Sandbox Code Playgroud)

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

ls -a
Run Code Online (Sandbox Code Playgroud)