6.3 环境恢复

vim 的编辑环境保存与恢复是我一直想要的功能,我希望每当重新打开 vim 时恢复:已打开文件、光标位置、undo/redo、书签、子窗口、窗口大小、窗口位置、命令历史、buffer 列表、代码折叠。vim 文档说 viminfo 特性可以恢复书签、session 特性可以恢复书签外的其他项,所以,请确保你的 vim 支持这两个特性:

  1. vim --version | grep mksession
  2. vim --version | grep viminfo

如果编译 vim 时添加了 —with-features=huge 选项那就没问题。

一般说来,保存/恢复环境步骤如下。

第一步,保存所有文档:

  1. :wa

第二步,借助 viminfo 和 session 保存当前环境:

  1. :mksession! my.vim
  2. :wviminfo! my.viminfo

第三步,退出 vim:

  1. :qa

第四步,恢复环境,进入 vim 后执行:

  1. :source my.vim
  2. :rviminfo my.viminfo

具体能保存哪些项,可由 sessionoptions 指定,另外,前面几步可以设定快捷键,在 .vimrc 中增加:

  1. " 设置环境保存项
  2. set sessionoptions="blank,buffers,globals,localoptions,tabpages,sesdir,folds,help,options,resize,winpos,winsize"
  3. " 保存 undo 历史
  4. set undodir=~/.undo_history/
  5. set undofile
  6. " 保存快捷键
  7. map <leader>ss :mksession! my.vim<cr> :wviminfo! my.viminfo<cr>
  8. " 恢复快捷键
  9. map <leader>rs :source my.vim<cr> :rviminfo my.viminfo<cr>

这样,简化第二步、第四步操作。另外,sessionoptions 无法包含 undo 历史,你得先得手工创建存放 undo 历史的目录(如,.undo_history/)再通过开启 undofile 进行单独设置,一旦开启,每次写文件时自动保存 undo 历史,下次加载在文件时自动恢复所有 undo 历史,不再由 :mksession/:wviminfo 和 :source/:rviminfo 控制。

按此操作,并不能像 vim 文档中描述的那样能保存所有环境,比如,书签、代码折叠、命令历史都无法恢复。这和我预期存在较大差距,暂且用用吧,找个时间再深入研究!