Vim:重新打开所有先前的文件在新会话中重新启动后

6
我通常会在Vim中打开几十个文件,维持长时间的会话。偶尔需要重启Vim,例如安装新插件或应用新配置。

如何在重新启动后打开所有以前的文件?

2个回答

10
你可以使用内置会话,也许还需要vim-session插件
Vim会话包含有关您正在编辑的所有信息。
这包括文件列表、窗口布局、全局变量、选项和其他信息。(记住的确切内容由'sessionoptions'选项控制。)
命令:
:mksession mysession.vim

将当前会话保存到指定的文件中。下次启动vim时,您可以加载该会话:

vim -S mysession.vim

或在vim内部
:source mysession.vim

你可以通过VimLeave自动命令来自动保存会话,并在VimEnter时重新加载会话,但是在恢复vim被调用的会话时要小心,例如从git中调用。


3
为了增加多样性,https://github.com/tpope/vim-obsession 也是一个非常可行的 vim-session 替代品。 - Andrew Haust
此外,您可以将类似以下内容添加到您的 shell 的 rc 文件中,以便在从命令行调用时没有传递参数时自动加载会话(就像 Boris 的答案中所示):vim() { if [ $# -gt 0 ]; then vim -O $@ elif [ -f "Session.vim" ]; then vim -S Session.vim else vim fi } - Andrew Haust
嗯,当涉及到在SO上进行评论时,我是一个新手...换行在评论中不被认可...你知道的越多。 - Andrew Haust
@AndrewHaust 哦,tpope!这是品质的标志!谢谢!顺便说一句,在 Stack Overflow 工作了五年,你居然没注意到评论如此落后! :-) - phd

3
以下是我配置文件中提取的自动会话保存/加载的基本设置:

以下是我配置文件中提取的自动会话保存/加载的基本设置:

let s:session_loaded = 1

augroup autosession
  " load last session on start
  " Note: without 'nested' filetypes are not restored.
  autocmd VimEnter * nested call s:session_vim_enter()
  autocmd VimLeavePre * call s:session_vim_leave()
augroup END

function! s:session_vim_enter()
    if bufnr('$') == 1 && bufname('%') == '' && !&mod && getline(1, '$') == ['']
        execute 'silent source ~/.vim/lastsession.vim'
    else
      let s:session_loaded = 0
    endif
endfunction

function! s:session_vim_leave()
  if s:session_loaded == 1
    let sessionoptions = &sessionoptions
    try
        set sessionoptions-=options
        set sessionoptions+=tabpages
        execute 'mksession! ~/.vim/lastsession.vim'
    finally
        let &sessionoptions = sessionoptions
    endtry
  endif
endfunction

只有在不带参数运行vim时,它才会恢复会话,所以如果您使用vim somefile.txt进行快速编辑,它将不会触及最后的会话。

额外加分(这也将恢复文件内的光标位置):

" When editing a file, always jump to the last known cursor position.
" Don't do it when the position is invalid or when inside an event
" handler.
autocmd MyAutoCmd BufReadPost *
    \ if line("'\"") > 0 |
    \   if line("'\"") <= line("$") |
    \     exe("norm '\"") |
    \   else |
    \     exe "norm $" |
    \   endif|
    \ endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接