本节所用命令的帮助入口:
:help 'path' :help mksession :help find :help gf :help CTRL-W_f
我们在前面介绍了vimrc,vimrc定义了vim通常的行为。然而,每个项目都有其特殊的定义,虽然我们也可以在vimrc中对每个项目进行定制,但这样一来,vimrc会变得很大,使vim启动速度变慢;另外也会使vimrc变得难以维护。
因此,我们使用其它的方法来保存项目相关的信息,这就是本文的主要内容。我们将以path选项的设置为例进行讲解。
path选项定义了一个目录列表,在使用gf,find,以及CTRL-W f等vim命令时,如果使用的是相对路径,那么就会在path选项定义的目录列表中查找相应的文件。path选项以逗号分隔各目录名。我们依旧以vim 7.0的源代码为例(源代码放在~/src/vim70/目录中)。
对于这个项目,我们的path选项设置如下:
set path=.,/usr/include,,~/src/vim70/**
稍微解释一下各项的含义,更详细的信息,请查看path选项的帮助页:
- . 在当前文件所在目录中搜索
- /usr/include 在/usr/include目录中搜索
- ,, 在当前工作路径中搜索
- ~/src/vim70/** 在~/src/vim70的所有子目录树中进行搜索
设置了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“命令,输入:
:find netrw.vim
vim打开了~/src/vim70/runtime/autoload/netrw.vim文件。用这种方法打开文件真是太方便了,你不用输入文件的路径,vim会自动在path选项定义的路径中搜索。不过”find“命令也有缺陷,如果你只记得文件名的一部分,那么就没有办法用find命令打开这个文件了。而且find命令也不允许使用正则表达式。没关系,我们还有更好的方法来打开文件,我将在Lookupfile插件中介绍这些方法。
path选项介绍完了,我们进入正题,如何把本项目相关的配置保存起来,下次打开本项目时自动恢复这些配置呢?
我们有两种方法做到这一点。
[方法1]
我们在~/src/vim70/目录下建立一个文件,假定文件名为workspace.vim,文件内容为:
"set project path set path+=~/src/vim70/**
这个文件中保存了项目相关的信息,例如选项值,键映射,函数定义,自动命令,等等。我们的例子中只定义的path选项,我们没有使用”set path=…”语句,在vim手册中建议使用”set path+=…”和”set path-=…”格式。
接下来,在你的vimrc文件中加入下面的语句:
" execute project related configuration in current directory if filereadable("workspace.vim") source workspace.vim endif
以后,每次你在~/src/vim70/目录中启动vim时,vim都会自动载入workspace.vim,恢复项目的配置信息。
[方法2]
还记得本系列文章的第二篇使用会话(session)和viminfo吗?那篇文章中,我们介绍了使用session文件和viminfo保存项目环境的方法。如果你使用了会话文件,那么选项值,键映射,和其它很多信息都已经保存了。但会话的功能毕竟有限,不能把项目相关的配置全部保存下来,怎么办呢?
vim的作者已经想到了这个问题,并提供了解决办法。
在vim载入会话文件的最后一步,它会查找一个额外的文件并执行其中的ex命令。查找的规则是,把会话文件名的后缀去掉,然后在后面加上”x.vim“,。假设你的会话文件名为example.session,vim就会查找是否有examplex.vim,如果找到,就会执行此文件中的ex命令。
好了,我们先创建我们的会话文件:
:cd ~/src/vim70 :set sessionoptions-=curdir '在session option中去掉curdir :set sessionoptions+=sesdir '在session option中加入sesdir :mksession vim70s.vim '创建一个会话文件
然后再编辑一个名为~/src/vim70/vim70sx.vim的文件,文件的内容为(当然,你可以在这个文件中加入更多内容):
"set project path set path+=~/src/vim70/**
退出vim后,在命令行下执行”gvim &”,再次进入vim,这时看到的是一个空白窗口。然后执行下面的命令:
:source ~/src/vim70/vim70s.vim '载入会话文件
太棒了!原来的会话环境已经恢复,并且项目相关的配置也设置好了!
[参考文档]
- vim手册
- vim中文手册
:find 只能搜索一path中一级目录中的文件吧。
请问博主,如果递归搜索呢?
你好 , 当我打开vim用 source 加载 保存得到session时 会因为 minibuffer NEAD_trgee 等插件的缘故出现的窗口很乱,窗口布局
也不是保存session时的样子, 而且会报错 请问您遇到过这样的问题吗?
是怎么解决的?
我不知道如何保存我想要的设置每次
:source ~/src/vim70/vim70s.vim ‘载入会话文件
的时候出现的都是奇怪的东西,我想知道如何保存自己想要保存的项目的设置
问下Easwy:
在windows下设置搜索路径set path+=./sdk/include怎么不能成功啊,gf的时候还是提示找不到,但是用绝对路径就可以,而且斜杠和反斜杠都能正常工作。
如果要在这个地方设置相对路径,应该怎么设呢?
@rainfish
你可以定义一个键映射,按一下就生成会话文件。
对于sessionoptions选项的设置,你可以放在你的vimrc里
请问怎么自动执行
:cd ~/src/vim70
:set sessionoptions-=curdir ‘在session option中去掉curdir
:set sessionoptions+=sesdir ‘在session option中加入sesdir
:mksession vim70s.vim ‘创建一个会话文件
请您指点一下
(以下为CSDN评论的转帖)
#muzuiget 发表于2007-06-03 18:19:17 IP: 61.140.26.*
按”CTRL-W f”是水平分割窗口打开,哪个键是垂直分割窗口打开?
#lyanry 发表于2007-06-04 08:06:13 IP: 202.110.209.*
to 楼上:
^W V
#muzuiget 发表于2007-06-08 01:52:16 IP: 218.20.221.*
不是,^w v是打开开本身这个文件,我要的是先^w f那样打开光标下的文件,难道只能分两步,先垂直打开,然后在新窗口gf?
#easwy 发表于2007-06-08 10:29:40 IP: 213.70.90.*:find
可以映射一下,例如:
nmap vgf :vsplit
这个映射不太完善,如果找不到头文件的话,它还是会垂直分隔一个窗口显示当前文件。
#muzuiget 发表于2007-06-08 16:11:03 IP: 218.19.243.*
多谢~
(以下为CSDN评论的转帖)
#baikaishiuc 发表于2007-04-24 10:28:48 IP: 125.71.1.*
我想问一下,但是我这样保存了后,好象在用win Manager中开的file list 栏目中,那个路径无法恢复。
#baikaishiuc 发表于2007-04-24 10:29:15 IP: 125.71.1.*
是我操作有失误,还有我没做什么别的准备工作?
#easwy 发表于2007-04-25 09:20:22 IP: 213.70.90.*
会话文件只能恢复winmanager所设置的窗口布局,而不能恢复其中的内容,因为file list中的内容是动态生成的。
我通常是先关闭winmanager,然后再生成会话文件,这样在载入会话文件后,就不会出现空白窗口。
在载入会话后再打开winmanager,它的内容就正常了。
#kinchan 发表于2007-05-01 08:36:41 IP: 218.19.64.*
winmanager插件和netrw插件有冲突???
#kinchan 发表于2007-05-01 08:37:05 IP: 218.19.64.*
发错地方。。。。
#easwy 发表于2007-05-04 12:45:44 IP: 219.133.160.*
有什么冲突?