大多数IDE编程软件(如visual studio、eclipse、pycharm等)都具有会话保存和恢复的功能:当重新打开IDE时,软件会自动恢复到上次退出时的环境,包括恢复窗口布局、所打开的文件列表等。

Vim作为最强大的编辑器,自然也具有类似功能。要实现上述效果,需要使用 Vim 的会话(session) 和 viminfo的保存和恢复功能。

viminfo文件主要保存了命令行历史(history)、搜索字符串历史(search)、输入行历史、非空的寄存器内容(register)、文件的位置标记(mark)、最近搜索/替换的模式、缓冲区列表、全局变量等信息,其作用已经在viminfo文件介绍与使用一文介绍过,这篇文章介绍下 Vim 的session保存和会话恢复功能。

1. Vim 会话

Vim 的会话信息保存了所有窗口的视图、文件列表、全局设置等。

Vim 会话具体保存哪些信息由 sessionoptions 选项决定,可通过 :set sessionoptions 设置自己个性化的会话保存信息。sessionoptions 选项的值是一串由逗号分隔的单词列表,每个单词允许保存和恢复某种设置,下表列出了所有支持的单词及其功能。

sessionoptions选项值 保存和恢复
blank 空窗口
buffers 包括隐藏和卸载的文件缓冲区,而不仅仅是显示在窗口里的
curdir 当前目录
folds 手动建立的折叠、打开/关闭的折叠和局部折叠选项
globals 大写字母开头且包含至少一个小写字母的全局变量 (只保存字符串和数值类型)
help 帮助窗口
localoptions 局部于窗口或缓冲区的选项和映射 (非局部选项的全局值)
options 所有的选项和映射 (也包括局部选项的全局值)
resize Vim 窗口的大小: ‘lines’ 和 ‘columns’
sesdir 会话文件所在的目录会成为当前目录 (用于通过网络访问别的系统的项目)
slash 文件名里的反斜杠被替换成正斜杠
tabpages 所有标签页;如果不包含,只恢复当前标签页。这样你可以为每个标签页分别保存一个会话
unix 即使在 Windows 系统也使用 Unix 换行格式
winpos 整个 Vim 窗口的位置
winsize 窗口大小

默认的 sessionoptions 选项包括: blank、buffers、curdir、folds、help、options、tabpages、winsize (等价于 :set sessionoptions=blank,buffers,curdir,folds,help,options,tabpages,winsize)。

也就是说默认的会话文件可以恢复当前编辑环境的空窗口、所有的文件缓冲区、当前目录、折叠相关信息、帮助窗口、所有的选项和映射、所有的标签页(tab)、窗口大小。通过 :help sessionoptions 命令可查看官方 Vim 文档对 sessionoptions 的介绍。

2. 创建 Vim 会话

在 Vim 命令行模式下使用命令 :mksession [file_name] 可用来创建一个会话文件,创建的会话文件保存在当前目录下,如果省略文件名则会自动创建一个名为 Session.vim 的会话文件。

例如,在 /home/vim/ 目录下使用 Vim 打开 ./test/bench.c 文件后使用 :mksession 创建的会话文件 Session.vim 保存在目录 /home/vim/

vim-mksession

会话文件本质上是一个 Vim 脚本,里面保存的都是可执行的 Vim Ex 命令

如果不希望在 session 文件中保存当前路径 (curdir),而是希望session文件所在的目录自动成为当前工作目录,则需要在 sessionoptions 去掉 curdir 并增加 sesdir。设置此选项后,session文件中保存的是文件的相对路径,而不是绝对路径。这样每次载入session件时,此文件所在的目录就被设为 Vim的当前工作目录。

当项目有多个不同版本 (位于不同的目录)或通过网络访问其它项目的session文件时,若想始终使用一个相同的session文件,只需要把session文件拷贝到不同的目录即可实现。

3. 恢复 Vim 会话

使用 :mksession 命令创建完会话文件后,可以在 Vim 命令行模式下使用 :source file_name 来导入指定的会话文件。

由于 Vim 会话文件实际上保存的是 Ex 命令,所以执行 :source 命令其实只是把会话文件中的所有 Ex 命令从头到尾执行了一遍,这就是 Vim 会话恢复的原理。

嗯,扫一扫就可以找到小女子我啦~