代码之家  ›  专栏  ›  技术社区  ›  Ying Xiong

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

vim
  •  5
  • Ying Xiong  · 技术社区  · 7 年前

    我通常在vim会话中打开了几十个文件。偶尔,我需要重启vim,比如安装一个新插件或应用一些新配置。

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

    2 回复  |  直到 3 年前
        1
  •  7
  •   phd    7 年前

    您可以使用 builtin sessions ,可能与 vim-session plugin .

    Vim会话包含有关您正在编辑的内容的所有信息。

    这包括文件列表、窗口布局、全局变量、, 选项和其他信息。(准确地说,记忆是由 ' sessionoptions '选项。)

    命令

    :mksession mysession.vim
    

    将当前会话保存到命名文件中。下次启动vim时,可以加载会话:

    vim -S mysession.vim
    

    :source mysession.vim
    

    您可以在VimLeave autocommand上自动保存会话,并在VimCenter上重新加载会话,但在调用vim时(例如从git)要小心恢复会话。

        2
  •  2
  •   Borys Serebrov    7 年前

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

    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