为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

vim使用进阶

2013-04-29 50页 doc 249KB 8阅读

用户头像

is_712147

暂无简介

举报
vim使用进阶 写本系列文章的最初想法,是介绍如何用vim开发软件。但纵观整个系列,讲述的其实和软件开发关系并不大,基本都在讲vim的使用技巧、vim的配置及vimrc、vim的命令和vim的插件。因此,把文章移到新站后,我把本系列的名字改为”vim使用进阶”,希望大家一如既往的支持该系列。 [目录] vim使用进阶: 序言 本文是本系列的序言,讲述我使用vim的经历和心得,以及对vim初学者的一些建议。文中的抓图展示了我的vim使用环境。 vim使用进阶: 使用会话和viminfo 本文介绍如何使用vim的会话 (session)...
vim使用进阶
写本系列文章的最初想法,是介绍如何用vim开发软件。但纵观整个系列,讲述的其实和软件开发关系并不大,基本都在讲vim的使用技巧、vim的配置及vimrc、vim的命令和vim的插件。因此,把文章移到新站后,我把本系列的名字改为”vim使用进阶”,希望大家一如既往的支持该系列。 [目录] vim使用进阶: 序言 本文是本系列的序言,讲述我使用vim的经历和,以及对vim初学者的一些建议。文中的抓图展示了我的vim使用环境。 vim使用进阶: 使用会话和viminfo 本文介绍如何使用vim的会话 (session) 和viminfo来恢复vim的使用环境。如果你需要经常恢复到相同工作环境,此功能非常有用,你不必一次次重新打开文件、设置你的工作环境。 vim使用进阶: vimrc初步 本文简要介绍了vimrc的知识以及如何使用vimrc保存vim的配置。文中还提供了一些键映射(map),使用这些映射可以快速编辑和加载vimrc。关于vimrc的更多应用,参见本系列其它文章。 vim使用进阶: 保存项目相关配置 本篇主要以path选项为例,讲述如何保存和恢复项目相关的配置。在使用vim的过程中,你可能同时打开几个project,每个project的配置可能都不相同,文中介绍了两种方法来保存每个project自身的独有配置。一种是使用一个固定的vim配置脚本保存project相关的path设置、按键映射等;另外一种是利用前面文章所介绍的会话(session)机制。 vim使用进阶: 使用标签(tag)文件 本文介绍了如何使用Exuberant ctags生成tag文件以及在vim中如何使用tag文件进行跳转、查找等操作。还简要介绍了tag文件的格式,在后面介绍的Lookupfile插件中,会利用tag文件便捷的查找、打开文件。 vim使用进阶: 使用taglist插件 本文介绍如何使用taglist插件(plugin)来查看程序中的标签(tag),并介绍了taglist插件的配置和用法。taglist插件利用Exuberant ctags程序生成标签文件,并提供像Source Insight那样的标签窗口,可以方便的跳转到函数、变量等标签所在的位置。 vim使用进阶: 文件浏览和缓冲区浏览 本节介绍了如何在vim中浏览文件,以及如何查看当前打开的缓冲区。利用netrw插件,可以方便的在vim中浏览各个目录、打开指定文件,而不用切换到文件浏览器或shell;当然,netrw插件的作用并不仅仅局限于此。利用bufexplorer插件,则可以方便的查看打开的缓冲区(buffer),在缓冲区间进行切换。本文的最后介绍了winmanager插件,使用这个插件,可以把netrw插件、bufexplorer插件和taglist插件整合起来,使vim看起来更像一个集成开发环境(IDE)。 vim使用进阶: lookupfile插件 如果你在开发一个大的项目,当你想在一大堆文件中查找或者编辑指定文件时,Lookupfile插件是必不可少的。使用它,可以快速查找项目文件、可以在缓冲区查找指定文件、可以浏览指定目录等。在查找时甚至可以使用正则表达式(regex),在你只记得部分文件名或目录名时,这可是救命的手段。 vim使用进阶: 开启文件类型检测 vim最吸引人的一点是,它支持无穷多的文件类型,而且能够随意扩展。在本文主要介绍如何打开文件类型检测的功能,以及如何使用基于文件类型的插件(filetype plugin)。正因为有了文件类型检测的功能,我们才可能针对不同的类型的文件,定义不同的键映射(map)、设置不同的选项,进行语法高亮的染色(后续文章中介绍)…你可以实现任意你想实现的功能。 vim使用进阶: 乱花渐欲迷人眼 - 语法高亮 VIM并不是只有黑色两色。正相反,它提供了非常灵活的机制允许用户自定义色彩。运行在终端中的VIM,由于终端本身的限制,只能使用若干种固定的颜色;但对于GVIM来讲,你可以根据你的喜好调出任意的颜色。本文介绍的,正是vim的语法高亮功能。 vim使用进阶: 程序员的利器 - cscope 在前面的文章中介绍了利用ctags生成的tag文件,跳转到标签定义的地方。但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,ctags就无能为力了,这时需要使用更为强大的cscope。本文就介绍如何使用cscope,有了它,你可以把source insight抛到一边去了。 vim使用进阶: 剑不离手 - quickfix vim由一个程序员开发,并且为更多的程序员所使用,所以vim对开发人员的强大支持,也就可以理解了。quickfix模式的引入就是一个例子。quickfix模式,是一种加速你开发的工作方式,使你不必离开vim,就可以快速的完成”编辑-编译-修正”你的程序。它不仅仅对开发人员有用,只要你的工作有类似”编辑-编译-修正”的过程,它就可以极大的简化你的工作。 vim使用进阶: 智能补全 使用过Source Insight的人一定对它的自动补全功能印象深刻,在很多的集成开发环境中,也都支持自动补全。vim做为一个出色的编辑器,这样的功能当然少不了。本文主要介绍vim的OMNI补全。将在下一篇中介绍其它的补全方式。 vim使用进阶: 自动补全 本文继续介绍vim的补全功能。作为一个通用的编辑器,vim实现的补全功能并不仅仅限于对程序的补全,它可以对文件名补全、根据字典进行补全、根据本缓冲区或其它缓冲区类似的进行补全、根据文件语法补全等等,它甚至允许用户自己编写函数来实现定制的补全。本文简要介绍了这些补全的方法。 vim使用进阶: 指随意动,移动如飞 (一) VIM提供的移动方式多如牛毛,但我们并不需要掌握全部这些命令,只需要掌握最适合自己的那些命令。本文介绍了最常用的一些移动命令,在下篇文章中将介绍更高级的移动方法。 vim使用进阶: 指随意动,移动如飞 (二) 本文介绍如何在vim中移动,主要涉及如何使用跳转表(jump-motions)、使用标记(mark)、使用折行(fold),以及如何在程序中移动。 vim使用进阶: 在VIM中使用GDB调试 本文介绍了如何使用vimgdb补丁在vim中用gdb调试程序,同时还介绍了vim的编译方法。然而,vim只是一个编辑器,而不是一个集成开发环境(IDE),所以它对调试的支持很有限。 序言 从初次接触vim,到现在已经有好些年时间了。在软件开发中使用vim,不过是近两年的事情。对vim的了解远远算不上深入,不过还是把自己使用vim的一些经验写出来,希望对vim用户有所帮助。 本系列文章介绍我自己使用vim的一些经验,主要包括vim使用技巧、vim配置、vim命令、vim插件等内容。本篇是序言,务虚为主。 在使用vim进行软件开发之前,我使用的工具是Source Insight,相信大家并不陌生。Source Insight是一个不错的工具,特别是在浏览代码方面。在面对成百上千个文件组成的陌生源代码时,使用Source Insight可以让你很快的了解软件的主体流程、调用关系、类型定义……。使用Source Insight写代码也不错,它的自动补全功能很强,似乎使用拷贝、粘贴,加上自动补全,就可以完成代码了。不再使用Source Insight的原因有二个,一是Source Insight只支持windows,不能在Linux上用;二是不想再用盗版的Source Insight。 在决定使用vim前,也在vim和emacs犹豫了很久,最终懒惰的天性让我放弃了emacs:实在是不习惯在移动光标时,也要用两只手按住CTRL/ALT/SHIFT再加个什么键;我的天性喜欢偷懒,能用一个手指做的事,不想用两个手指完成。所以最终选择了使用vim。现在感觉,vim和emacs在文本编辑方面不分伯仲。emacs的优势,在于它的可扩展性,使它可以完成很多和文本编辑无关的事情;不过这也造成了它的过于庞大。 刚改用vim,最不适应的是不能再用鼠标指哪儿打哪儿了(vim当然支持鼠标,只是双手在键盘、鼠标间切换,很是影响效率),然后是拷贝、粘贴,然后是查看调用关系,函数间跳转,再然后……总之,刚开始的一段时间非常痛苦,效率也非常的低,甚至总是想着放弃。经过这段时间以后,逐渐摸到一些窍门,也渐渐的知道到哪里去寻求帮助,在哪儿可以找到vim的资源,工作效率一点点提升了上来。到现在,工作中已经离不开vim了,vim成了计算机中缺省的文本编辑工具! 其实,对vim和emacs这样的工具来说,它们最强大之处,在于它们的可定制性。由于它们的可定制性,你完全可以定制出一个符合你自己编辑习惯的编辑器,在这样一个编辑器里,你的工作效率将达到最高。当然,要达到这样的境界,你需要付出非常坚苦的努力!如果你的工作是以文本编辑为主,例如,你是一个程序员,那么付出这种努力是值得的,也是有回报的。如果你没有很多文本编辑工作要做,那么也没有必要耗费这么大的力气,来学习这些工具。 最后对vim的初学者提一些建议: 如果你的工作以文本编辑(不是指Microsoft word中的文本编辑)为主,那么学习vim或emacs是值得的; 刚开始使用vim或emacs的经历是很痛苦的,因为它们可能完成不同于你已经习惯的windows编辑器。我的建议是:坚持下去!咬牙坚持下去!你会获得回报的。 vim手册 (help files) 是学习如何高效使用vim的重要资源,一定要多读手册。如果你是因为害怕读英文手册而不肯学习vim的话,那么,到vim中文文档下载vim 7.0的中文手册,安装好后,再使用”:help @cn”命令,你就可以看到中文手册了。 如果你是第一次接触vim,那么使用”:help tutor“或”:help tutor@cn“,你就会看到一个30分钟的vim教程,会教会你vim的一些基本命令。 有时间的话,一定要阅读一下Bram Moolenaar(vim的作者)写的Seven habits of effective text editing(七个有效的文本编辑习惯),你可以知道怎样提高你的编辑效率。在http://vimcdoc.sourceforge.net/下载PDF格式的手册,在附录二你可以看到它的中文译本。    本系列文章都针对vim 7.0版本,如果这里介绍的功能在你的vim中不存在,不妨升级到vim 7.0后再试一次。 我以Linux版本的vim 7.0为例。vim也有支持windows的版本,可以到vim主页下载预编译的的windows版vim 7.0。 文章尽量不涉及具体的软件源代码,如果确实需要,则以vim 7.0的源代码为例。此代码可以也可以在vim主页下载,我把它解压在~/src/vim70目录下。后续文章以此目录为例进行讲解。 附图是我所使用vim环境,在这副图中,我打开了三个标签页,一个是主编程区,一个是打开的.vimrc文件,另外一个是草稿区。在主编程标签页中有几个不同的窗口,分别是当前打开的buffer,当前文件中的tag,help窗口,lookupfile窗口,src/main.c和src/edit.c。其中使用了三个vim插件(plugin):winmanager, taglist, lookupfile。 从这副图中可以看出vim的一些特性:多标签支持(tab)、多窗口支持、插件支持(plugin)、语法高亮功能(syntax)、文本折叠功能(folding)……这些特性,以及其它数不清的特性,我都将在后续文章中尽量给予介绍。 上图是GUI界面的vim,下图是控制台(console)下的vim的抓图。这是我通常的开发方式:使用putty远程登录到linux服务器上,使用控制台的vim开发软件 vim使用进阶: 使用会话和viminfo 本节所用命令的帮助入口: :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’中加入’slash’和‘unix’,前者把文件名中的’\'替换为’/',后者会把会话文件的换行符保存成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/easwy/src/vim70″,接下来,执行下面的命令: :cd src "切换到/home/easwy/src/vim70/src目录 :set sessionoptions-=curdir "在session option中去掉curdir :set sessionoptions+=sesdir "在session option中加入sesdir :mksession vim70.vim "创建一个会话文件 :wviminfo vim70.viminfo "创建一个viminfo文件 :qa "退出vim 退出vim后,在命令行下执行gvim &,再次进入vim,这时看到的是一个空白窗口。然后执行下面的命令: :source ~/src/vim70/src/vim70.vim '载入会话文件 :rviminfo vim70.viminfo '读入viminfo文件 太棒了,又恢复到昨天退出时的状态了!继续工作~~~~ 不过,每次都要手工修改’sessionoptions’或‘viminfo’吗?多麻烦啊……别着急,现在是时候介绍vimrc了,请移步下一章: vimrc初步。 vim使用进阶: vimrc初步 上一章我们介绍了会话(session)文件和viminfo文件,其中’sessionoptions’选项和‘viminfo’选项的配置可能会根据你的需要进行调整。但如何保存你所做的调整呢?我们将在这一章中介绍。 本节所用命令的帮助入口: :help compatible :help mapleader :help map :help autocmd 为什么我的vim这么难用?不能语法高亮,没有折行,不能打开多个窗口多个buffer,不能…… 为什么别人用几个键就可以完成一个很复杂的功能,而我不能? 为什么别人的vim看起来和我的很不一样? …… 当你开始问这些问题的时候,是时候去检查一下你的vimrc了。 当vim在启动时,如果没有找到vimrc或gvimrc,它缺省工作VI兼容的模式。这意味着,你只能使用VI所具备的功能,而vim中的大量扩展功能将无法使用。也许这就是你的vim如此难用的原因。 vim中自带了一个vimrc例子,让我们从这个例子开始吧。 下面我以Linux下的vim为例,windows版本的vim,会在后面提到。 示例的vimrc(名为vimrc_example.vim)通常位于/usr/share/vim/vimXXX/目录下,其中vimXXX与你所使用的vim版本有关。 首先把这个示例的vimrc拷贝到相应的目录,在Linux下,应该把它拷贝到你的home目录下,名字为”.vimrc”,下面是shell命令: cp /usr/share/vim/vim70/vimrc_example.vim ~/.vimrc 或者你在vim中执行下面的命令,和上面的shell命令完成相同的功能: :!cp $vimRUNTIME/vimrc_example.vim ~/.vimrc 现在,你退出vim后再进入,你的vim和刚才已经不一样了。 你可以先读一下你的vimrc,看看它都设定了什么: :e ~/.vimrc 这是一个注释良好的文件,不需要多解释。 对windows版本的vim,它已经缺省的有了一个vimrc,你可以在vim在使用下面的命令来查看它: :e $vim/_vimrc 在这个文件中,它包含了上面提到的vimrc_example.vim。同时,它会把vim设置的更符合windows的操作习惯。比如,支持CTRL-C拷贝,CTRL-V粘贴等等。Windows下的用户,可以使用$vim/_vimrc来做为你的第一个vimrc。 顺便提一句,在unix/linux中,文件名可以以”.”开头,表明此文件是隐藏的。而在windows中,不允许文件名以”.”开头,所以,windows版本的vim,将读取_vimrc来做为自己的配置文件。 在今后使用vim的日子里,你会频繁的更改你的vimrc。所以我们需要设置一些快捷方式,使我们能快速的访问vimrc。 把下面这段内容拷贝到你的vimrc中: 1 "Set mapleader 2 let mapleader = "," 3 4 "Fast reloading of the .vimrc 5 map ss :source ~/.vimrc 6 "Fast editing of .vimrc 7 map ee :e ~/.vimrc 8 "When .vimrc is edited, reload it 9 autocmd! bufwritepost .vimrc source ~/.vimrc 为了方便解释,我给每一行都加了一个行号。 在vimrc中,双引号开头的行,将被当作注释忽略。 第2行,用来设置mapleader变量,当mapleader为未设置或为空时,使用缺省的”\”来作为mapleader。 mapleader变量是作用是什么呢?看下面的介绍。 ( 第5行定义了一个映射(map),这个映射把ss,映射为命令:source ~/.vimrc。当定义一个映射时,可以使用前缀。而在映射生效时,vim会把替换成mapleader变量的值。也就是说,我们这里定义的ss在使用时就变成了”,ss“,当输入这一快捷方式时,就会source一次~/.vimrc文件(也就是重新执行一遍.vimrc文件)。 ( 第7行,定义了ee快捷键,当输入,ee时,会打开~/.vimrc进行编辑。 ( 第9行,定义了一个自动命令,每次写入.vimrc后,都会执行这个自动命令,source一次~/.vimrc文件。 有了上面的快捷键,我们就能快速的打开vimrc文件编辑,快速重新source vimrc文件,方便多了。 无论在windows还是在linux中,我都使用vim作为我的缺省编辑器。并且,我想使用同一个vimrc文件。因此,我定义了一个MySys()函数,用来区分不同的平台,以进行不同的配置。 另外,在编辑vimrc文件时,我更喜欢新开一个标签页来编辑,而不是在当前窗口中。因此,我定义了SwitchToBuf()函数,它在所有标签页的窗口中查找指定的文件名,如果找到这样一个窗口,就跳到此窗口中;否则,它新建一个标签页来打开vimrc文件。(注:标签页(tab)功能只有在vim 7.0版本以上才支持。) 下面是我的vimrc中使用的设定,希望能够抛砖引玉: " Platform function! MySys() if has("win32") return "windows" else return "linux" endif endfunction 注意:我在windows中也定义一个”HOME”环境变量,然后把_vimrc放在”HOME”环境变量所指向的目录中。如果你打算在windows中使用上面的设定,也需要这样做! 好了,现在我们知道如何永久更改’sessionoptions’选项和‘viminfo’选项了,把对它们的配置放入你的vimrc即可。 vim自带的示例vimrc中,只定义最基本的配置。 在http://www.amix.dk/vim/vimrc.html有一个非常强大的vimrc,有人戏称为”史上最强的vimrc”,或许有些言过其实。不过,如果你通读了这个vimrc,相信能从中学到很多…… 这里有一个redguardtoo修改过的版本,可以对照参考一下。 我的vimrc也是基于Amix的模板,然后自已做了很多修改。 建议:不要照拷这个vimrc!可能这个文件的设定并不符合你的习惯。另外,这个文件的设定,可能也不能在你的工作环境中运行。 vim使用进阶: 保存项目相关配置 本节所用命令的帮助入口: :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使用进阶: 使用标签(tag)文件 本节所用命令的帮助入口: :help 'tags' :help :tag :help :tags :help CTRL-] :help CTRL-T :help vimgrep :help cw :help pattern 尽管相关的文章已经很多了,但tag文件实在是太有用了,所以还是啰嗦一次。 Tag文件(标签文件)无疑是开发人员的利器之一,有了tag文件的协助,你可以在vim查看函数调用关系,类、结构、宏等的定义,可以在任意标签中跳转、返回……相信使用过Source Insight的人对这些功能并不陌生,而在vim中,此功能的实现依赖于tag文件。 对于程序来说,Tag文件中保存了诸如函数、类、结构、宏等的名字,它们所处的文件,以及如何通过Ex命令跳转到这些标签。它是一个纯文本文件,因此你可以手工的编辑它,也可以使用脚本对其进行操作。 通常我们使用名为ctags的程序来生成这样的tag文件。vim能直接使用ctags程序所生成的tag文件。在UNIX系统下的ctags功能比较少,所以一般我们使用Exuberant Ctags(在大多数Linux系统上,它是缺省的ctags程序),它能够支持多达33种程序语言,足以满足我们开发的需要了。这里是它的中文手册。如果你的系统上未安装此程序,请到http://ctags.sourceforge.net下载。 emacs则使用etags来生成tag文件,如果希望vim也能支持etags的tag文件格式,需要编译vim时加入”+emacs_tags“选项。在这篇文章介绍了编译vim的方法。 Tag文件需要遵循一定的格式,由Exuberant Ctags生成的tag文件,缺省是如下格式: {tagname} {TAB} {tagfile} {TAB} {tagaddress} {term} {field} .. ({tagname} - 标识符名字,例如函数名、类名、结构名、宏等。不能包含制表符。 ({tagfile} - 包含 {tagname} 的文件。它不能包含制表符。 ({tagaddress} - 可以定位到 {tagname}光标位置的 Ex 命令。通常只包含行号或搜索命令。出于安全的考虑,vim会限制其中某些命令的执行。 ({term} - 设为 ;” ,这是为了兼容Vi编辑器,使Vi忽略后面的{field}字段。 ({field} .. - 此字段可选,通常用于表示此{tagname}的类型是函数、类、宏或是其它。 在{tagname}、{tagfile}和{tagaddress}之间,采用制表符(TAB符,即C语言中的”\t”)分隔,也就是说{tagname}、{tagfile}的内容中不能包含制表符。 Tag文件的开头可以包含以”!_TAG_”开头的行,用来在tag文件中加入其它信息。vim能够识别两种这样的标记,经常用到的是”_TAG_FILE_SORTED”标记,例如: !_TAG_FILE_SORTED1{anything} 上面这个标记说明tag文件是经过排序的,并且排序时区分了大小写,对排序的tag,vim会使用二分法来进行查找,大大加快了查找速度;如果值为0,则表示tag文件未经排序;如果值为2,则表示tag文件是忽略大小写排序的。 之所以在这里介绍tag文件的格式,是因为我们在后面提到的lookupfile插件中,会自己生成tag文件。 虽然ctags有为数众多的选项,但通常我们所使用的非常简单。还是以vim 7.0的代码为例,我们执行: cd ~/src/vim70 ctags –R src 上面这条命令会在~/src/vim70/目录下生成一个名为tags的文件,这个文件中包含~/src/vim70/src/目录下所有.c、.h文件中的标签。它一个文本文件,你可以用vim打开它看一下。此文件缺省按区分字母大小写排序,所以直接可以被vim使用。 现在我们进入vim,执行下面的命令: :cd ~/src/vim70 "切换当前目录为~/src/vim70 :set tags=tags "设置tags选项为当前目录下的tags文件 现在,我们设置好了tags选项,接下来我们使用它: :tag VimMain 你会看到vim打开了src/main.c文件,并把光标定位到第167行VimMain上。 我们知道,一般主程序的函数名为main,如果你尝试下面的命令: :tag main # pri kind tag file 1 F f main src/xxd/xxd.c main(argc, argv) 2 FS d main src/if_python.c 46 Choice number ( cancels): 这里并没有src/main.c文件,怎么回事呢?这是因为ctags并不是编译器,它在处理编译预处理指令受到局限,因此并没有生成src/main.c中main()函数的标签。你可以在生成tag文件时给ctags指定参数来解决这个问题。见ctags手册。 或者你可以用”:grep“或”:vimgrep“来查找main(这篇文章讲解grep及vimgrep的用法): :cd ~/src/vim70 :vimgrep /\/ src/*.c :cw 这时下面的quickfix窗口将显示出来,在quickfix窗口中找到我们想跳转的位置(本例中是src/main.c),按回车,就可以跳到对应的位置了。 如果你只记得部分的标签名,那么可以使用”tag“命令的搜索模式,你可以输入一个vim正则表达式来表示你所查找的名字,如: :tag /\C\<\k\+ain\> # pri kind tag file 1 F f VimMain src/main.c VimMain 2 F d bindtextdomain src/vim.h 483 502 4 F d bindtextdomain src/vim.h 504 5 F f main src/xxd/xxd.c main(argc, argv) 6 F d textdomain src/vim.h 488 Choice number ( cancels): 这表示我想查找一个以一个或多个keyword开始的标签,此标签以ain做为结尾,在查找时区分大小写。要读懂这个正则表达式,请”:help pattern“。 vim会保存一个跳转的标签栈,以允许你在跳转到一个标签后,再跳回来,可以使用”:tags“命令查找你处于标签栈的哪个位置。 我们经常用到的tag跳转命令见下(一般只需要知道CTRL-]和CTRL-T就可以了): :tag {ident} "跳转到指定的标签 :tags "显示标签栈 CTRL-] "跳转到当前光标下的标签 CTRL-T "跳到标签栈中较早的标签 如果想了解更多命令,可以”:help 29.1“(强烈建议程序员完整的阅读usr_29.txt和usr_30.txt)。 如果想更深入了解tag命令和相关知识,可以”:help tagsrch“。 我之前写的一篇关于ctags和cscope的文章,参见:Vim + Cscope/Ctags vim使用进阶: 使用taglist插件 本节所用命令的帮助入口: :help helptags :help taglist.txt 上篇文章介绍了在vim中如何使用tag文件,本文主要介绍如何使用taglist插件(plugin)。 想必用过Source Insight的人都记得这样一个功能:SI能够把当前文件中的宏、全局变量、函数等tag显示在Symbol窗口,用鼠标点上述tag,就跳到该tag定义的位置;可以按字母序、该tag所属的类或scope,以及该tag在文件中出现的位置进行排序;如果切换到另外一个文件,Symbol窗口更新显示这个文件中的tag。 在vim中的taglist插件所实现的就是上述类似的功能,有些功能比SI弱,有些功能比SI更强。而且,taglist插件还在不断完善中! 要使用taglist plugin,必须满足: 打开vim的文件类型自动检测功能:filetype on 系统中装了Exuberant ctags工具,并且taglist plugin能够找到此工具(因为taglist需要调用它来生成tag文件) 你的vim支持system()调用 在文章vimrc初步中,我们使用了vim自带的示例vimrc,这个vimrc中已经打开了文件类型检测功能;在上篇文章中,我们也已用到了Exuberant ctags;system()调用在一般的vim版本都会支持(suse Linux发行版中出于安全考虑,关闭了此功能),所以我们已经满足了这三个条件。 现在我们到http://www.vim.org/scripts/script.php?script_id=273下载最新版本的taglist plugin,目前版本是4.3。 下载后,把该文件在~/.vim/目录中解压缩,这会在你的~/.vim/plugin和~/.vim/doc目录中各放入一个文件: plugin/taglist.vim – taglist插件 doc/taglist.txt - taglist帮助文件 注:windows用户需要把这个插件解压在你的$vim/vimfiles或$HOME/vimfiles目录。 使用下面的命令生成帮助标签(下面的操作在vim中进行): :helptags ~/.vim/doc 生成帮助标签后,你就可以用下面的命令查看taglist的帮助了: :help taglist.txt Taglist提供了相当多的功能,我的vimrc中这样配置: """""""""""""""""""""""""""""" " Tag list (ctags) """""""""""""""""""""""""""""" if MySys() == "windows" "设定windows系统中ctags程序的位置 let Tlist_Ctags_Cmd = 'ctags' elseif MySys() == "linux" "设定linux系统中ctags程序的位置 let Tlist_Ctags_Cmd = '/usr/bin/ctags' endif let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口 这样配置后,当你输入”:TlistOpen“时,显示如下窗口: 在屏幕右侧出现的就是taglist窗口,你从中可以看到在main.c文件中定义的所有tag:宏、定义、变量、函数等;你也可以双击某个tag,跳到该tag定义的位置;你还可以把某一类的tag折叠起来(使用了vim的折行功能),方便查看,就像上图中macro和variable那样。更多的功能,请查看taglist的帮助页,本文也会介绍一些常用功能。 下面介绍常用的taglist配置选项,你可以根据自己的习惯进行配置: Tlist_Ctags_Cmd选项用于指定你的Exuberant ctags程序的位置,如果它没在你PATH变量所定义的路径中,需要使用此选项设置一下; 如果你不想同时显示多个文件中的tag,设置Tlist_Show_One_File为1。缺省为显示多个文件中的tag; 设置Tlist_Sort_Type为”name“可以使taglist以tag名字进行排序,缺省是按tag在文件中出现的顺序进行排序。按tag出现的范围(即所属的namespace或class)排序,已经加入taglist的TODO List,但尚未支持; 如果你在想taglist窗口是最后一个窗口时退出vim,设置Tlist_Exit_OnlyWindow为1; 如果你想taglist窗口出现在右侧,设置Tlist_Use_Right_Window为1。缺省显示在左侧。 在gvim中,如果你想显示taglist菜单,设置Tlist_Show_Menu为1。你可以使用Tlist_Max_Submenu_Items和Tlist_Max_Tag_Length来控制菜单条目数和所显示tag名字的长度; 缺省情况下,在双击一个tag时,才会跳到该tag定义的位置,如果你想单击tag就跳转,设置Tlist_Use_SingleClick为1; 如果你想在启动vim后,自动打开taglist窗口,设置Tlist_Auto_Open为1; 如果你希望在选择了tag后自动关闭taglist窗口,设置Tlist_Close_On_Select为1; 当同时显示多个文件中的tag时,设置Tlist_File_Fold_Auto_Close为1,可使taglist只显示当前文件tag,其它文件的tag都被折叠起来。 在使用:TlistToggle打开taglist窗口时,如果希望输入焦点在taglist窗口中,设置Tlist_GainFocus_On_ToggleOpen为1; 如果希望taglist始终解析文件中的tag,不管taglist窗口有没有打开,设置Tlist_Process_File_Always为1; Tlist_WinHeight和Tlist_WinWidth可以设置taglist窗口的高度和宽度。Tlist_Use_Horiz_Window为1设置taglist窗口横向显示; 在taglist窗口中,可以使用下面的快捷键: 跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样 o 在一个新打开的窗口中显示光标下tag 显示光标下tag的原型定义 u 更新taglist窗口中的tag s 更改排序方式,在按名字排序和按出现顺序排序间切换 x taglist窗口放大和缩小,方便查看较长的tag + 打开一个折叠,同zo - 将tag折叠起来,同zc * 打开所有的折叠,同zR = 将所有tag折叠起来,同zM [[ 跳到前一个文件 ]] 跳到后一个文件 q 关闭taglist窗口 显示帮助 可以用”:TlistOpen“打开taglist窗口,用”:TlistClose“关闭taglist窗口。或者使用”:TlistToggle“在打开和关闭间切换。在我的vimrc中定义了下面的映射,使用键就可以打开/关闭taglist窗口: map :TlistToggle Taglist插件还提供了很多命令,你甚至可以用这些命令创建一个taglist的会话,然后在下次进入vim时加载此会话。 Taglist插件还可以与winmanager插件协同使用,这将在下篇文章中介绍。 vim使用进阶: 文件浏览和缓冲区浏览 本节所用命令的帮助入口: :help netrw-browse :help bufexplorer :help winmanager [文件浏览] 在开发过程中,经常需要查找某个文件。我们前面在介绍path选项时,介绍过使用f
/
本文档为【vim使用进阶】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索