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

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


当前回答

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

其他回答

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

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

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

就我个人而言,我只是包装了Tim Pope的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

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

每次退出Vim时,它都会将当前会话保存在~/下。vim/会话,并在打开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

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

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