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

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


当前回答

因为这是谷歌上对我(可能还有其他人)的第一次打击,关于如何在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来运行会话。如果不存在会话,则创建一个新的会话。

其他回答

因为这是谷歌上对我(可能还有其他人)的第一次打击,关于如何在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来运行会话。如果不存在会话,则创建一个新的会话。

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

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

如果你计划只有一个阶段的项目,那就这样做

:mks

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

vim -S

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

:mks!

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

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

:mks .session-name.vim

打开它(从同一目录):

vim -S .session-name.vim

保存会话:

:mks! .session-name.vim

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

ls -a

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

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