Linux_vim_会话和viminfo

所用命令涉及到的帮助入口:

1
2
3
4
5
6
:help mksession
:help 'sessionoptions'
:help source
:help wviminfo
:help rviminfo
:help 'viminfo'

很多软件都具有这样一种功能:在你下一次启动该软件时,它会自动为你恢复到你上次退出的环境,恢复窗口布局、所打开的文件,甚至是上次的设置。

vim有没有这种功能呢?答案当然是肯定的!这需要使用vim的会话(session)及viminfo的保存和恢复功能。

使用会话(session)和viminfo,可以把编辑环境保存下来,然后在下次启动vim后,可以再恢复回这个环境。在开发项目或书写文档时,如果在中途退出了vim而不能恢复原先的编辑环境的话,又要重新打开你所打开的文件,重新定义你的映射(map)、缩写(abbreviate),重新定位你所设定的标记的位置(mark),重新设置项目相关设置(options)等等,不是一般的麻烦!

要恢复上次的编辑环境,我们需要保存两种不同的信息,一种是会话(session)信息,另外一种是viminfo信息。

  • 会话信息中保存了所有窗口的视图,外加全局设置。
  • viminfo信息中保存了命令行历史(history)、搜索字符串历史(search)、输入行历史、非空的寄存器内容(register)、文件的位置标记(mark)、最近搜索/替换的模式、缓冲区列表、全局变量等信息。

会话

我们可以使用:mksession [file]命令来创建一个会话文件,如果省略文件名的话,会自动创建一个名为Session.vim的会话文件。

会话文件,其本质上是一个vim脚本,你可以使用上述命令生成一个session文件,然后再查看其中的内容,就会对session文件有一个深入的认识。

会话文件中保存哪些信息,是由sessionoptions选项决定的。缺省的sessionoptions选项包括:blank, buffers, curdir, folds, help, options, tabpages, winsize,也就是会话文件会恢复当前编辑环境的空窗口、所有的缓冲区、当前目录、折叠(fold)相关的信息、帮助窗口、所有的选项和映射、所有的标签页(tab)、窗口大小。

如果你使用windows上的vim,并且希望你的会话文件可以同时被windows版本的vim和UNIX版本的vim共同使用的话,在sessionoptions中加入slashunix,前者把文件名中的\替换为/,后者会把会话文件的换行符保存成unix格式。

如果你不希望在session文件中保存当前路径,而是希望session文件所在的目录自动成为当前工作目录,那么,需要在sessionoptions去掉curdir,加入sesdir,这样每次载入session文件时,此文件所在的目录就被设为vim的当前工作目录。在你通过网络访问其它项目的session文件时,或者你的项目有多个不同版本(位于不同的目录),而你想始终使用一个session文件时,这个选项比较有用:你只需要把session文件拷贝到不同的目录,然后使用就可以了。设置此选项后,session文件中保存的是文件的相对路径,而不是绝对路径。

我们在上面使用:mksession命令创建了会话文件,那么怎么使用会话文件恢复编辑环境呢?很简单,你只需要使用:source session-file来导入会话文件。因为会话文件是一个脚本,里面保存的是Ex命令,所以source命令只是把会话文件中的Ex命令执行一遍。

viminfo

使用:wviminfo [file]命令,可以手动创建一个viminfo文件。

其实,在vim退出时,每次都会保存一个.viminfo文件在用户的主目录。我们使用:wviminfo命令则是手动创建一个viminfo文件,因为缺省的.viminfo文件会在每次退出vim时自动更新,谁知道你在关闭当前软件项目后,又使用vim做过些什么呢?这样的话,.viminfo中的信息,也许就与你所进行的软件项目无关了。还是手动保存一个保险。

:wviminfo命令保存哪些内容,以及保存的数量,由viminfo选项决定,这个选项的值在windows上和在linux上的缺省值不同,具体含义参阅手册。

要读入你所保存的viminfo文件,使用:rviminfo [file]命令。

现在,先看一下我们当前目录,执行:pwd,显示/home/xcg/vimtest,接下来,执行下面的命令:

1
2
3
4
5
6
:cd src                            "切换到/home/xcg/vimtest/src目录 需要先在外部创建该目录
:set sessionoptions-=curdir "在session option中去掉curdir
:set sessionoptions+=sesdir "在session option中加入sesdir
:mksession vim90.vim "创建一个会话文件
:wviminfo vim90.viminfo "创建一个viminfo文件
:qa "退出vim

退出vim后,在命令行下执行vim,再次进入vim,这时看到的是一个空白窗口。然后执行下面的命令:

1
2
:source ~/vimtest/src/vim90.vim    '载入会话文件
:rviminfo vim90.viminfo '读入viminfo文件

太棒了,又恢复到昨天退出时的状态了!继续工作。不过,每次都要手工修改sessionoptionsviminfo吗?多麻烦啊。别着急,现在是时候介绍vimrc了。

Linux_vim保存项目相关配置

本节所用命令的帮助入口:

1
2
3
4
5
:help 'path'
:help mksession
:help find
:help gf
:help CTRL-W_f

引入:path

vimrc定义了vim通常的行为。然而,每个项目都有其特殊的定义,虽然我们也可以在vimrc中对每个项目进行定制,但这样一来,vimrc会变得很大,使vim启动速度变慢;另外也会使vimrc变得难以维护。

因此,使用其它的方法来保存项目相关的信息,将以path选项的设置为例进行。

path选项定义了一个目录列表,在使用gffind,以及CTRL-W f等vim命令时,如果使用的是相对路径,那么就会在path选项定义的目录列表中查找相应的文件。path选项以逗号分隔各目录名。我们以vim的源代码为例(源代码放在~/src/vimXX/目录中)。

对于这个项目,我们的path选项设置如下:

1
set path=.,/usr/include,,~/src/vim90/**

稍微解释一下各项的含义,更详细的信息,请查看path选项的帮助页:

  • .:在当前文件所在目录中搜索
  • /usr/include:在/usr/include目录中搜索
  • ,,:在当前工作路径中搜索
  • ~/src/vim90/**:在~/src/vim90的所有子目录树中进行搜索

设置了path选项后,怎么用呢?

我们把光标定位到src/main.c文件第22行的fcntl.h单词上,然后在Normal模式下按gf。咦,vim打开了/usr/include/fcntl.h文件!

现在我们按CTRL-^回到刚才的位置,光标仍旧定位在第22行的fcntl.h单词上,然后按CTRL-W f。啊哈,这次vim打开了一个水平分隔窗口,在此窗口中打开了/usr/include/fcntl.h

尽管在src/main.c中未指定fcntl.h的路径,但vim会在path选项定义的路径中搜索此文件,很方便。

现在我们看一下find命令,输入:

1
:find netrw.vim

vim打开了~/src/vim90/runtime/autoload/netrw.vim文件。用这种方法打开文件真是太方便了,你不用输入文件的路径,vim会自动在path选项定义的路径中搜索。不过find命令也有缺陷,如果你只记得文件名的一部分,那么就没有办法用find命令打开这个文件了。而且find命令也不允许使用正则表达式。没关系,我们还有更好的方法来打开文件,要用到Lookupfile插件。

path选项介绍完了,进入正题,如何把本项目相关的配置保存起来,下次打开本项目时自动恢复这些配置呢?

我们有两种方法做到这一点。

项目相关的配置保存起来:方法1

我们在~/src/vim90/目录下建立一个文件,假定文件名为workspace.vim,文件内容为:

1
2
"set project path
set path+=~/src/vim70/**

这个文件中保存了项目相关的信息,例如选项值,键映射,函数定义,自动命令,等等。我们的例子中只定义的path选项,我们没有使用set path=…语句,在vim手册中建议使用set path+=…set path-=…格式。

接下来,在你的vimrc文件中加入下面的语句:

1
2
3
4
" execute project related configuration in current directory
if filereadable("workspace.vim")
source workspace.vim
endif

以后,每次在~/src/vim90/目录中启动vim时,vim都会自动载入workspace.vim,恢复项目的配置信息。

方法2

回顾会话(session)和viminfo的作用。使用session文件和viminfo也可以保存项目环境的方法。如果你使用了会话文件,那么选项值,键映射,和其它很多信息都已经保存了。但会话的功能毕竟有限,不能把项目相关的配置全部保存下来,怎么办呢?

vim的作者已经想到了这个问题,并提供了解决办法。

在vim载入会话文件的最后一步,它会查找一个额外的文件并执行其中的ex命令。查找的规则是,把会话文件名的后缀去掉,然后在后面加上x.vim。假设你的会话文件名为example.session,vim就会查找是否有examplex.vim,如果找到,就会执行此文件中的ex命令。

好了,我们先创建我们的会话文件:

1
2
3
4
:cd ~/src/vim70
:set sessionoptions-=curdir '在session option中去掉curdir
:set sessionoptions+=sesdir '在session option中加入sesdir
:mksession vim70s.vim '创建一个会话文件

然后再编辑一个名为~/src/vim70/vim70sx.vim的文件,文件的内容为(当然,你可以在这个文件中加入更多内容):

1
2
"set project path
set path+=~/src/vim70/**

退出vim后,在命令行下执行”gvim &”,再次进入vim,这时看到的是一个空白窗口。然后执行下面的命令:

1
:source ~/src/vim70/vim70s.vim  '载入会话文件 

太棒了!原来的会话环境已经恢复,并且项目相关的配置也设置好了!