vim使用进阶使用vim提高你的文本编辑效率EaswyYangvim使用进阶:使用vim提高你的文本编辑效率EaswyYang版权2007,2008,2009本文采用署名-非商业性使用-相同方式共享[http://creativecommons.
org/licenses/by-nc-sa/2.
5/cn/]的创作共用许可协议发布,转载本文必须也遵循署名-非商业性使用-相同方式共享.
转载请注明:转载自Easwy的博客[http://easwy.
com/blog/][http://easwy.
com/blog/]iii目录1.
目录12.
序言53.
使用会话(session)和viminfo84.
vimrc初步105.
保存项目相关配置146.
使用标签(tag)文件177.
使用taglist插件218.
文件浏览和缓冲区浏览259.
使用lookupfile插件3010.
开启文件类型检测3511.
乱花渐欲迷人眼-语法高亮3812.
程序员的利器-cscope4213.
剑不离手-quickfix4614.
智能补全5015.
自动补全5616.
指随意动,移动如飞(一)5917.
指随意动,移动如飞(二)6318.
在vim中使用gdb调试6919.
vim编译中遇到的问题及解决方法771第1章目录本系列文章,是原来我在CSDN的Easwy专栏[http://blog.
csdn.
net/easwy]撰写的"使用VIM开发软件项目"系列.
Easwy的博客[http://easwy.
com/blog/]搬家以后,就把CSDN上的文章全部移到此处.
写本系列文章的最初想法,是介绍如何用vim开发软件.
但纵观整个系列,讲述的其实和软件开发关系并不大,基本都在讲vim的使用技巧、vim的配置及vimrc、vim的命令和vim的插件.
因此,把文章移到新站后,我把本系列的名字改为"vim使用进阶",希望大家一如既往的支持该系列.
本文是这一系列文章的总目录,可由此访问本系列所有文章.
我使用docbook重新整理了一下这些文章,你可以在这里下载html版本的vim使用进阶2009年前文章打包[http://easwy.
com/blog/uploads/vim/advanced_vim_skills_html.
zip],现在也提供PDF版本[http://easwy.
com/blog/uploads/vim/advanced_vim_skills_pdf.
zip]下载.
[目录]vim使用进阶:序言[http://easwy.
com/blog/archives/advanced-vim-skills-prologue/]本文是本系列的序言,讲述我使用vim的经历和心得,以及对vim初学者的一些建议.
文中的抓图展示了我的vim使用环境.
vim使用进阶:使用会话和viminfo[http://easwy.
com/blog/archives/advanced-vim-skills-session-file-and-viminfo/]本文介绍如何使用vim的会话(session)和viminfo来恢复vim的使用环境.
如果你需要经常恢复到相同工作环境,此功能非常有用,你不必一次次重新打开文件、设置你的工作环境.
vim使用进阶:vimrc初步[http://easwy.
com/blog/archives/advanced-vim-skills-introduce-vimrc/]本文简要介绍了vimrc的知识以及如何使用vimrc保存vim的配置.
文中还提供了一些键映射(map),使用这些映射可以快速编辑和加载vimrc.
关于vimrc的更多应用,参见本系列其它文章.
vim使用进阶:保存项目相关配置[http://easwy.
com/blog/archives/advanced-vim-skills-save-project-configuration/]本篇主要以path选项为例,讲述如何保存和恢复项目相关的配置.
在使用vim的过程中,你可能同时打开几个project,每个project的配置可能都不相同,文中介绍了两种方法来保存每个project自身的独有配置.
一种是使用一个固定的vim配置脚本保存project相关的path设置、按键映射等;另外一种是利用前面文章所介绍的会话(session)机制.
vim使用进阶:使用标签(tag)文件[http://easwy.
com/blog/archives/advanced-vim-skills-use-ctags-tag-file/]本文介绍了如何使用Exuberantctags生成tag文件以及在vim中如何使用tag文件进行跳转、查找等操作.
还简要介绍了tag文件的格式,在后面介绍的Lookupfile插件中,会利用tag文件便捷的查找、打开文件.
vim使用进阶:使用taglist插件[http://easwy.
com/blog/archives/advanced-vim-skills-taglist-plugin/]目录2本文介绍如何使用taglist插件(plugin)来查看程序中的标签(tag),并介绍了taglist插件的配置和用法.
taglist插件利用Exuberantctags程序生成标签文件,并提供像SourceInsight那样的标签窗口,可以方便的跳转到函数、变量等标签所在的位置.
vim使用进阶:文件浏览和缓冲区浏览[http://easwy.
com/blog/archives/advanced-vim-skills-netrw-bufexplorer-winmanager-plugin/]本节介绍了如何在vim中浏览文件,以及如何查看当前打开的缓冲区.
利用netrw插件,可以方便的在vim中浏览各个目录、打开指定文件,而不用切换到文件浏览器或shell;当然,netrw插件的作用并不仅仅局限于此.
利用bufexplorer插件,则可以方便的查看打开的缓冲区(buffer),在缓冲区间进行切换.
本文的最后介绍了winmanager插件,使用这个插件,可以把netrw插件、bufexplorer插件和taglist插件整合起来,使vim看起来更像一个集成开发环境(IDE).
vim使用进阶:lookupfile插件[http://easwy.
com/blog/archives/advanced-vim-skills-lookupfile-plugin/]如果你在开发一个大的项目,当你想在一大堆文件中查找或者编辑指定文件时,Lookupfile插件是必不可少的.
使用它,可以快速查找项目文件、可以在缓冲区查找指定文件、可以浏览指定目录等.
在查找时甚至可以使用正则表达式(regex),在你只记得部分文件名或目录名时,这可是救命的手段.
vim使用进阶:开启文件类型检测[http://easwy.
com/blog/archives/advanced-vim-skills-filetype-on/]vim最吸引人的一点是,它支持无穷多的文件类型,而且能够随意扩展.
在本文主要介绍如何打开文件类型检测的功能,以及如何使用基于文件类型的插件(filetypeplugin).
正因为有了文件类型检测的功能,我们才可能针对不同的类型的文件,定义不同的键映射(map)、设置不同的选项,进行语法高亮的染色(后续文章中介绍).
.
.
你可以实现任意你想实现的功能.
vim使用进阶:乱花渐欲迷人眼-语法高亮[http://easwy.
com/blog/archives/advanced-vim-skills-syntax-on-colorscheme/]VIM并不是只有黑色两色.
正相反,它提供了非常灵活的机制允许用户自定义色彩.
运行在终端中的VIM,由于终端本身的限制,只能使用若干种固定的颜色;但对于GVIM来讲,你可以根据你的喜好调出任意的颜色.
本文介绍的,正是vim的语法高亮功能.
vim使用进阶:程序员的利器-cscope[http://easwy.
com/blog/archives/advanced-vim-skills-cscope/]在前面的文章中介绍了利用ctags生成的tag文件,跳转到标签定义的地方.
但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,ctags就无能为力了,这时需要使用更为强大的cscope.
本文就介绍如何使用cscope,有了它,你可以把sourceinsight抛到一边去了.
vim使用进阶:剑不离手-quickfix[http://easwy.
com/blog/archives/advanced-vim-skills-quickfix-mode/]vim由一个程序员开发,并且为更多的程序员所使用,所以vim对开发人员的强大支持,也就可以理解了.
quickfix模式的引入就是一个例子.
quickfix模式,是一种加速你开发的工作方式,使你不必离开vim,就可以快速的完成"编辑-编译-修正"你的程序.
它不仅仅对开发人员有用,只要你的工作有类似"编辑-编译-修正"的过程,它就可以极大的简化你的工作.
vim使用进阶:智能补全[http://easwy.
com/blog/archives/advanced-vim-skills-omin-complete/]目录3使用过SourceInsight的人一定对它的自动补全功能印象深刻,在很多的集成开发环境中,也都支持自动补全.
vim做为一个出色的编辑器,这样的功能当然少不了.
本文主要介绍vim的OMNI补全.
将在下一篇中介绍其它的补全方式.
vim使用进阶:自动补全[http://easwy.
com/blog/archives/advanced-vim-skills-auto-complete/]本文继续介绍vim的补全功能.
作为一个通用的编辑器,vim实现的补全功能并不仅仅限于对程序的补全,它可以对文件名补全、根据字典进行补全、根据本缓冲区或其它缓冲区类似的内容进行补全、根据文件语法补全等等,它甚至允许用户自己编写函数来实现定制的补全.
本文简要介绍了这些补全的方法.
vim使用进阶:指随意动,移动如飞(一)[http://easwy.
com/blog/archives/advanced-vim-skills-basic-move-method/]VIM提供的移动方式多如牛毛,但我们并不需要掌握全部这些命令,只需要掌握最适合自己的那些命令.
本文介绍了最常用的一些移动命令,在下篇文章中将介绍更高级的移动方法.
vim使用进阶:指随意动,移动如飞(二)[http://easwy.
com/blog/archives/advanced-vim-skills-advanced-move-method/]本文介绍如何在vim中移动,主要涉及如何使用跳转表(jump-motions)、使用标记(mark)、使用折行(fold),以及如何在程序中移动.
vim使用进阶:在VIM中使用GDB调试[http://easwy.
com/blog/archives/advanced-vim-skills-vim-gdb-vimgdb/]本文介绍了如何使用vimgdb补丁在vim中用gdb调试程序,同时还介绍了vim的编译方法.
然而,vim只是一个编辑器,而不是一个集成开发环境(IDE),所以它对调试的支持很有限.
vim使用进阶:vim编译中遇到的问题及解决方法[http://easwy.
com/blog/archives/advanced-vim-skills-solve-compile-problem/]本文主要介绍vim编译中遇到的问题及解决办法.
文中介绍了如何通过看config.
log,来了解配置失败的原因.
有些网友编译图形化的gvim失败,可以参照本文的方法解决.
vim使用进阶:在vim中使用拷贝/粘贴未完待续vim使用进阶:映射自己的vim按键未完待续vim使用进阶:巧用vim的缩写功能未完待续vim使用进阶:强大的自动命令(autocmd)未完待续vim使用进阶:在vim中使用gdb调试(二)未完待续,介绍clewnvim使用进阶:在vim中使用gdb调试(三)未完待续,介绍pyclewn其它你感兴趣的话题未完待续目录4原创文章,转载请注明:转载自Easwy的博客[http://easwy.
com/blog/]本文链接地址:http://easwy.
com/blog/archives/advanced-vim-skills-catalog/5第2章序言vim配置、vim命令、vim插件等内容.
本篇是序言,务虚为主.
在使用vim进行软件开发之前,我使用的工具是SourceInsight,相信大家并不陌生.
SourceInsight是一个不错的工具,特别是在浏览代码方面.
在面对成百上千个文件组成的陌生源代码时,使用SourceInsight可以让你很快的了解软件的主体流程、调用关系、类型定义.
.
.
.
.
.
.
使用SourceInsight写代码也不错,它的自动补全功能很强,似乎使用拷贝、粘贴,加上自动补全,就可以完成代码了.
不再使用SourceInsight的原因有二个,一是SourceInsight只支持windows,不能在Linux上用;二是不想再用盗版的SourceInsight.
在决定使用vim前,也在vim和emacs犹豫了很久,最终懒惰的天性让我放弃了emacs:实在是不习惯在移动光标时,也要用两只手按住CTRL/ALT/SHIFT再加个什么键;我的天性喜欢偷懒,能用一个手指做的事,不想用两个手指完成.
所以最终选择了使用vim.
现在感觉,vim和emacs在文本编辑方面不分伯仲.
emacs的优势,在于它的可扩展性,使它可以完成很多和文本编辑无关的事情;不过这也造成了它的过于庞大.
刚改用vim,最不适应的是不能再用鼠标指哪儿打哪儿了(vim当然支持鼠标,只是双手在键盘、鼠标间切换,很是影响效率),然后是拷贝、粘贴,然后是查看调用关系,函数间跳转,再然后.
.
.
.
.
.
总之,刚开始的一段时间非常痛苦,效率也非常的低,甚至总是想着放弃.
经过这段时间以后,逐渐摸到一些窍门,也渐渐的知道到哪里去寻求帮助,在哪儿可以找到vim的资源,工作效率一点点提升了上来.
到现在,工作中已经离不开vim了,vim成了计算机中缺省的文本编辑工具!
其实,对vim和emacs这样的工具来说,它们最强大之处,在于它们的可定制性.
由于它们的可定制性,你完全可以定制出一个符合你自己编辑习惯的编辑器,在这样一个编辑器里,你的工作效率将达到最高.
当然,要达到这样的境界,你需要付出非常坚苦的努力!
如果你的工作是以文本编辑为主,例如,你是一个程序员,那么付出这种努力是值得的,也是有回报的.
如果你没有很多文本编辑工作要做,那么也没有必要耗费这么大的力气,来学习这些工具.
最后对vim的初学者提一些建议:1.
如果你的工作以文本编辑(不是指Microsoftword中的文本编辑)为主,那么学习vim或emacs是值得的;2.
刚开始使用vim或emacs的经历是很痛苦的,因为它们可能完成不同于你已经习惯的windows编辑器.
我的建议是:坚持下去!
咬牙坚持下去!
你会获得回报的.
3.
vim手册(helpfiles)是学习如何高效使用vim的重要资源,一定要多读手册.
如果你是因为害怕读英文手册而不肯学习vim的话,那么,到vim中文文档下载vim7.
0的中文手册,安装好后,再使用":help@cn"命令,你就可以看到中文手册了.
4.
如果你是第一次接触vim,那么使用":helptutor"或":helptutor@cn",你就会看到一个30分钟的vim教程,会教会你vim的一些基本命令.
序言65.
有时间的话,一定要阅读一下BramMoolenaar(vim的作者)写的Sevenhabitsofeffectivetextediting(七个有效的文本编辑习惯),你可以知道怎样提高你的编辑效率.
在http://vimcdoc.
sourceforge.
net/下载PDF格式的手册,在附录二你可以看到它的中文译本.
本系列文章都针对vim7.
0版本,如果这里介绍的功能在你的vim中不存在,不妨升级到vim7.
0后再试一次.
我以Linux版本的vim7.
0为例.
vim也有支持windows的版本,可以到vim主页下载预编译的的windows版vim7.
0.
文章尽量不涉及具体的软件源代码,如果确实需要,则以vim7.
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开发软件:序言7点击查看大图对vim的了解有限,请多指教.
ss:source~/.
vimrc6"Fasteditingof.
vimrc7mapee:e~/.
vimrc8"When.
vimrcisedited,reloadit9autocmd!
bufwritepost.
vimrcsource~/.
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文件编辑,快速重新sourcevimrc文件,方便多了.
无论在windows还是在linux中,我都使用vim作为我的缺省编辑器.
并且,我想使用同一个vimrc文件.
因此,我定义了一个MySys()函数,用来区分不同的平台,以进行不同的配置.
另外,在编辑vimrc文件时,我更喜欢新开一个标签页来编辑,而不是在当前窗口中.
因此,我定义了SwitchToBuf()函数,它在所有标签页的窗口中查找指定的文件名,如果找到这样一个窗口,就跳到此窗口中;否则,它新建一个标签页来打开vimrc文件.
(注:标签页(tab)功能只有在vim7.
0版本以上才支持.
)下面是我的vimrc中使用的设定,希望能够抛砖引玉:vimrc初步12"Platformfunction!
MySys()ifhas("win32")return"windows"elsereturn"linux"endifendfunctionfunction!
SwitchToBuf(filename)"letfullfn=substitute(a:filename,HOME"findincurrenttabletbufwinnr=bufwinnr(a:filename)ifbufwinnr!
=-1execbufwinnr.
"wincmdw"returnelse"findineachtabtabfirstlettab=1whiletabss:source~/.
vimrc"Fasteditingof.
vimrcmapee:callSwitchToBuf("~/.
vimrc")"When.
vimrcisedited,reloaditautocmd!
bufwritepost.
vimrcsource~/.
vimrcelseifMySys()=='windows'"Sethelplangsethelplang=cn"Fastreloadingofthe_vimrcmapss:source~/_vimrc"Fasteditingof_vimrcmapee:callSwitchToBuf("~/_vimrc")"When_vimrcisedited,reloaditautocmd!
bufwritepost_vimrcsource~/_vimrcendifvimrc初步13"ForwindowsversionifMySys()=='windows'source$VIMRUNTIME/mswin.
vimbehavemswinendif注意:我在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手册vim中文手册http://www.
amix.
dk/vim/vimrc.
html1{anything}上面这个标记说明tag文件是经过排序的,并且排序时区分了大小写,对排序的tag,vim会使用二分法来进行查找,大大加快了查找速度;如果值为0,则表示tag文件未经排序;如果值为2,则表示tag文件是忽略大小写排序的.
之所以在这里介绍tag文件的格式,是因为我们在后面提到的lookupfile插件中,会自己生成tag文件.
虽然ctags有为数众多的选项,但通常我们所使用的非常简单.
还是以vim7.
0的代码为例,我们执行:cd~/src/vim70ctags–Rsrc上面这条命令会在~/src/vim70/目录下生成一个名为tags的文件,这个文件中包含~/src/vim70/src/目录下所有.
c、.
h文件中的标签.
它一个文本文件,你可以用vim打开它看一下.
此文件缺省按区分字母大小写排序,所以直接可以被vim使用.
现在我们进入vim,执行下面的命令::cd~/src/vim70"切换当前目录为~/src/vim70:settags=tags"设置tags选项为当前目录下的tags文件现在,我们设置好了tags选项,接下来我们使用它::tagVimMain你会看到vim打开了src/main.
c文件,并把光标定位到第167行VimMain上.
我们知道,一般主程序的函数名为main,如果你尝试下面的命令::tagmain#prikindtagfile1Ffmainsrc/xxd/xxd.
cmain(argc,argv)2FSdmainsrc/if_python.
c46Choicenumber(cancels):这里并没有src/main.
c文件,怎么回事呢这是因为ctags并不是编译器,它在处理编译预处理指令受到局限,因此并没有生成src/main.
c中main()函数的标签.
你可以在生成tag文件时给ctags指定参数来解决这个问题.
见ctags手册.
或者你可以用":grep"或":vimgrep"来查找main(这篇文章讲解grep及vimgrep的用法)::cd~/src/vim70:vimgrep/\/src/*.
c:cw使用标签(tag)文件19这时下面的quickfix窗口将显示出来,在quickfix窗口中找到我们想跳转的位置(本例中是src/main.
c),按回车,就可以跳到对应的位置了.
点击查看大图如果你只记得部分的标签名,那么可以使用"tag"命令的搜索模式,你可以输入一个vim正则表达式来表示你所查找的名字,如::tag/\C\#prikindtagfile1FfVimMainsrc/main.
cVimMain2Fdbindtextdomainsrc/vim.
h4833Fdbindtextdomainsrc/vim.
h5024Fdbindtextdomainsrc/vim.
h5045Ffmainsrc/xxd/xxd.
cmain(argc,argv)6Fdtextdomainsrc/vim.
h4887Fdtextdomainsrc/vim.
h5108Fdtextdomainsrc/vim.
h5129FSdbindtextdomainsrc/gui_gtk.
c5410FSdbindtextdomainsrc/gui_gtk_x11.
c3711FSfcmdsrv_mainsrc/main.
ccmdsrv_main(argc,argv,serverName_arg,serverStr)12FSdmainsrc/if_python.
c46使用标签(tag)文件2013FSdtextdomainsrc/gui_gtk.
c5114FSdtextdomainsrc/gui_gtk_x11.
c34Choicenumber(cancels):这表示我想查找一个以一个或多个keyword开始的标签,此标签以ain做为结尾,在查找时区分大小写.
要读懂这个正则表达式,请":helppattern".
vim会保存一个跳转的标签栈,以允许你在跳转到一个标签后,再跳回来,可以使用":tags"命令查找你处于标签栈的哪个位置.
我们经常用到的tag跳转命令见下(一般只需要知道CTRL-]和CTRL-T就可以了)::tag{ident}"跳转到指定的标签:tags"显示标签栈CTRL-]"跳转到当前光标下的标签CTRL-T"跳到标签栈中较早的标签如果想了解更多命令,可以":help29.
1"(强烈建议程序员完整的阅读usr_29.
txt和usr_30.
txt).
如果想更深入了解tag命令和相关知识,可以":helptagsrch".
我之前写的一篇关于ctags和cscope的文章,参见:Vim+Cscope/Ctags[参考文档]vim手册vim中文手册跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样o在一个新打开的窗口中显示光标下tag显示光标下tag的原型定义u更新taglist窗口中的tags更改排序方式,在按名字排序和按出现顺序排序间切换xtaglist窗口放大和缩小,方便查看较长的tag+打开一个折叠,同zo-将tag折叠起来,同zc*打开所有的折叠,同zR=将所有tag折叠起来,同zM[[跳到前一个文件]]跳到后一个文件q关闭taglist窗口显示帮助可以用":TlistOpen"打开taglist窗口,用":TlistClose"关闭taglist窗口.
或者使用":TlistToggle"在打开和关闭间切换.
在我的vimrc中定义了下面的映射,使用键就可以打开/关闭taglist窗口:map:TlistToogleTaglist插件还提供了很多命令,你甚至可以用这些命令创建一个taglist的会话,然后在下次进入vim时加载此会话.
Taglist插件还可以与winmanager插件协同使用,这将在下篇文章中介绍.
[参考文档]vim手册使用taglist插件24vim中文手册taglist手册显示帮助如果光标下为目录,则进入该目录;如果光标下是文件,则用vim打开该文件文件浏览和缓冲区浏览26-返回上级目录c切换vim的当前工作目录为正在浏览的目录d创建目录D删除文件或目录i切换显示方式R改名文件或目录s选择排序方式x定制浏览方式,使用你指定的程序打开该文件其它常用键,诸如使用书签、隐藏符合条件的文件等,请参阅netrw帮助页.
上面我们用":e~/src/vim70/src/"的方式打开netrw,我们还可以使用":Explore"等Ex命令来打开文件浏览器.
我的vimrc中这样配置:"netrwsettingletg:netrw_winsize=30nmapfe:Sexplore!
这样,在我输入",fe"时,就会打开一个垂直分隔的窗口浏览当前文件所在的目录,窗口的宽度为30.
浏览本地文件只是netrw插件的一项小功能,netrw插件最主要的功能是支持远程文件读写.
利用该插件,你可以通过ftp,ssh,http等多种协议来编辑远程文件,也可以浏览远程机器的目录.
在软件开发过程中不常使用此功能,本文中不再介绍.
参阅netrw手册页获取更多信息.
[缓冲区浏览]在开发过程中,经常会打开很多缓冲区,尤其是使用tag文件在不同函数间跳转时,会不知不觉打开很多文件.
要知道自己当前打开了哪些缓冲区,可以使用vim的":ls"Ex命令查看.
开发过程中,又经常需要在不同文件间跳转.
我习惯于使用"CTRL-^"来切换文件,这就需要知道文件所在的缓冲区编号.
每次都使用":ls"来找缓冲区编号很麻烦,所以我使用BufExplorer插件来显示缓冲区的信息.
BufExplorer插件在此处下载:http://vim.
sourceforge.
net/scripts/script.
phpscript_id=42下载后,把该文件在~/.
vim/目录中解压缩,这会在你的~/.
vim/plugin和~/.
vim/doc目录中各放入一个文件:plugin/bufexplorer.
vim-bufexplorer插件doc/bufexplorer.
txt-bufexplorer帮助文件注:windows用户需要把这个插件解压在你的$vim/vimfiles或$HOME/vimfiles目录.
使用下面的命令生成帮助标签(下面的操作在vim中进行)::helptags~/.
vim/doc然后,就可以使用":helpbufexplorer"命令查看BufExplorer的帮助文件了.
BufExplorer功能比较简单,这里就不做介绍了.
我的vimrc里这样设置BufExplorer插件:文件浏览和缓冲区浏览27"BufExplorerletg:bufExplorerDefaultHelp=0"Donotshowdefaulthelp.
letg:bufExplorerShowRelativePath=1"Showrelativepaths.
letg:bufExplorerSortBy='mru'"Sortbymostrecentlyused.
letg:bufExplorerSplitRight=0"Splitleft.
letg:bufExplorerSplitVertical=1"Splitvertically.
letg:bufExplorerSplitVertSize=30"Splitwidthletg:bufExplorerUseCurrentWindow=1"Openinnewwindow.
autocmdBufWinEnter\[Buf\List\]setlnonumberBufExplorer已经映射了几个键绑定,例如,使用",bv"就可以打开一个垂直分割窗口显示当前的缓冲区.
有一个称为minibufexpl.
vim的插件,也可以把缓冲区列表显示出来,这个插件在此处下载:http://vim.
sourceforge.
net/scripts/script.
phpscript_id=159使用这个插件后,屏幕截图看起来是这样,最上面一个窗口就是minibuffer窗口,列出了当前打开的缓冲区:点击查看大图这个插件没有帮助文件,参考下载页上的说明,以及脚本代码来进行配置.
[winmanager插件]winmanager插件可以把上面介绍的Explorer插件(vim7.
0以前的文件浏览插件)和BufExplorer插件集成在一起,我们上篇文章中介绍过的taglist插件也提供了对winmanager插件的支持.
Winmanager插件在这里下载:http://vim.
sourceforge.
net/scripts/script.
phpscript_id=95下载后,把该文件在~/.
vim/目录中解压缩,这会把winmanager插件解压到~/.
vim/plugin和~/.
vim/doc目录中:文件浏览和缓冲区浏览28plugin/winmanager.
vim–winmanager插件plugin/winfileexplorer.
vim-改良的Explorer插件plugin/wintagexplorer.
vim–winmanager提供的tag插件,用处不大doc/winmanager.
txt–帮助文件仍然用":helptags~/.
vim/doc"命令来生成帮助标签,然后就可以使用":helpwinmanager"来查看帮助了.
使用winmanager插件可以控制各插件在vim窗口中的布局显示.
我的vimrc中这样设置:"winManagersettingletg:winManagerWindowLayout="BufExplorer,FileExplorer|TagList"letg:winManagerWidth=30letg:defaultExplorer=0nmap:FirstExplorerWindownmap:BottomExplorerWindownmapwm:WMToggleg:winManagerWindowLayout变量的值定义winmanager的窗口布局,使用上面的设置,我们的窗口布局看起来是这样的:点击查看大图左边有两个窗口,上面的是BufExplorer窗口,下面是taglist窗口.
FileExplorer窗口和BufExplorer共用一个窗口,在BufExplorer窗口中使用"CTRL-N"可以切换到FileExplorer窗口,再使用一次则又切换回BufExplorer窗口.
也就是说,在变量g:winManagerWindowLayout中,使用","分隔的插件,在同一个窗口中显示,使用"CTRL-N"在不同插件间切换;使用"|"分隔的插件,则在另外一个窗口中显示.
在屏幕右边的窗口则是主编辑区.
在上面的vimrc设置中,还定义了三个键映射,分别用于跳到左上窗口、左下窗口,以及显示/关闭winmanager窗口.
文件浏览和缓冲区浏览29注:安装后,如果未设置g:winManagerWindowLayout变量,winmanager插件需要与BufExplorer插件一起才能使用.
所以需要下载BufExplorer.
在http://vim.
sourceforge.
net/scripts/script.
phpscript_id=1440有一个winmanager插件的修改版本,如果在FileExplorer中打开文件时,它会使用与该文件相关联的程序来打开该文件,而不是使用vim.
我没有使用过这个插件,有兴趣你可以试试.
[参考文档]vim帮助文件vim中文手册filenametagsfind.
-not-regex'.
*\.
\(png\|gif\)'-typef-printf"%f\t%p\t1\n"|\sort-f>>filenametags回想一下我们在"使用标签(tag)文件"一文中介绍的tag文件的格式.
再对照脚本命令来看:echo命令用来生成filenametags文件中的"!
_TAG_FILE_SORTED"行,表明此tag文件是经过排序的.
find命令用来查找所有类型为普通文件,文件后缀名不是.
png和.
gif的文件,找到的文件按"文件名\t文件路径\t1"的格式输出出来.
sort命令则把find命令的输出重新排序,然后写入filenametags文件中在~/src/vim70/目录下运行该脚本,会生成一个名为filenametags的文件,包含了vim70目录下的所有文件的名字及其所在目录.
现在我们需要让lookupfile插件知道到哪去找文件名tag文件.
我们假定vim当前工作目录为~/src/vim70/,执行下面的命令::letg:LookupFile_TagExpr='".
/filenametags"'注:如果不设定g:LookupFile_TagExpr的值,那么lookupfile插件会以tags选项定义的文件作为它的tag文件.
现在我们就可以使用lookupfile来打开文件了,按""或输入":LookupFile"在当前窗口上方打开一个lookupfile小窗口,开始输入文件名(至少4个字符),随着你的输入,符合条件的文件就列在下拉列表中了.
文件名可以使用vim的正则表达式,这大大方便了文件的查找.
你可以用"CTRL-N"和"CTRL-P"(或者用上、下光标键)来在下拉列表中选择你所需的文件.
选中文件后,按回车,就可以在之前的窗口中打开此文件.
下图是使用lookupfile插件查找文件的一个例子:使用lookupfile插件32点击查看大图在屏幕最上方的窗口就是lookupfile窗口,在这个窗口中输入"gui.
*x11"几个字符,查找到6个匹配文件,使用CTRL-N选中gui_x11.
c文件,然后按回车,就会在前一个vim窗口中打开src/gui_x11.
c文件,lookupfile窗口也自动关闭了.
是不是非常方便!
[缓冲区查找]在开发过程中,我经常会同时打开数十甚至上百个文件.
即使是使用BufExplorer插件,想在这么多buffer中切换到自己所要的文件,也不是件容易的事.
Lookupfile插件提供了一个按缓冲区名字查找缓冲区的方式,只要输入缓冲区的名字(可以是正则表达式),它就可以把匹配的缓冲区列在下拉列表中,同时还会列出该缓冲区内文件的路径,当你的buffer中有多个同名文件时,这可以帮你迅速找到你想要的文件.
使用":LUBufs"命令开始在缓冲区中查找,输入缓冲区的名字,在你输入的过程中,符合条件的缓冲区就显示在下拉列表中了,选中所需缓冲区后,按回车,就会切换你所选的缓冲区.
下图是一个示例:点击查看大图[浏览目录]Lookupfile插件还提供了目录浏览的功能,使用":LUWalk"打开lookupfile窗口后,就可以输入目录,lookupfile会在下拉列表中列出这个目录中的所有子目录及文件供选择,如果选择了目录,就会显示这个目录下的子目录和文件;如果选择了文件,就在vim中打开这个文件.
下图是使用LUWalk的一个抓图:使用lookupfile插件33点击查看大图Lookupfile插件还提供了LUPath和LUArgs两个功能,这两个功能我用的不多,就不在这里介绍了.
感兴趣的朋友读一下lookupfile的手册.
[Lookupfile配置]Lookupfile插件提供了一些配置选项,通过调整这些配置选项,使它更符合你的工作习惯.
下面是我的vimrc中关于lookupfile的设置,供参考:"lookupfilesettingletg:LookupFile_MinPatLength=2"最少输入2个字符才开始查找letg:LookupFile_PreserveLastPattern=0"不保存上次查找的字符串letg:LookupFile_PreservePatternHistory=1"保存查找历史letg:LookupFile_AlwaysAcceptFirst=1"回车打开第一个匹配项目letg:LookupFile_AllowNewFiles=0"不允许创建不存在的文件iffilereadable(".
/filenametags")"设置tag文件的名字letg:LookupFile_TagExpr='".
/filenametags"'endifnmaplkLookupFile"映射LookupFile为,lknmapll:LUBufs"映射LUBufs为,llnmaplw:LUWalk"映射LUWalk为,lw有了上面的定义,当我输入",lk"时,就会在tag文件中查找指定的文件名;当输入",ll"时,就会在当前已打开的buffer中查找指定名字的buffer;当输入",lw"时,就会在指定目录结构中查找.
另外,我还在项目相关的配置文件vim70sx.
vim(参考保存项目相关配置)中加入了lookupfile所使用的tag文件的信息:"lookupfiletagfileletg:LookupFile_TagExpr='"filenametags"'使用lookupfile插件34这样,在恢复前次会话时就给lookupfile插件定义了tag文件.
在用lookupfile插件查找文件时,是区分文件名的大小写的,如果想进行忽略大小写的匹配,可以使用vim忽略大小写的正则表达式,即在文件名的前面加上"\c"字符.
举个例子,当你输入"\cab.
c"时,你可能会得到"ab.
c"、"Ab.
c"、"AB.
c".
.
.
注:如果想加快lookupfile忽略大小写查找的速度,在生成文件名tag文件时,使用混合大小写排序.
这在文章使用标签(tag)文件有所提及.
通常情况下我都进行忽略大小写的查找,每次都输入"\c"很麻烦.
没关系,lookupfile插件提供了扩展功能,把下面这段代码加入你的vimrc中,就可以每次在查找文件时都忽略大小写查找了:"lookupfilewithignorecasefunction!
LookupFile_IgnoreCaseFunc(pattern)let_tags=&tagstrylet&tags=eval(g:LookupFile_TagExpr)letnewpattern='\c'.
a:patternlettags=taglist(newpattern)catchechohlErrorMsg|echo"Exception:".
v:exception|echohlNONEreturn""finallylet&tags=_tagsendtry"Showthematchesforwhatistypedsofar.
letfiles=map(tags,'v:val["filename"]')returnfilesendfunctionletg:LookupFile_LookupFunc='LookupFile_IgnoreCaseFunc'有时在LUBufs时也需要忽略缓冲区名字的大小写,我是通过直接修改lookupfile插件的方法,在LUBufs查找的字符串前都加上"\c",使之忽略大小写.
如果你不想这样,可以每次在缓冲区名字前手动加上"\c".
本文关于Lookupfile插件就介绍这么多,请阅读手册获取更多的信息.
这是一个非常好的插件,希望能为更多人喜爱!
也欢迎大家多交流使用中的心得和疑问.
[参考文档]vim手册vim中文手册nnoremapqinoremapq它定义了两个局部于缓冲区的键绑定,无论在normal模式还是插入模式,只要连按两次ESC,就关闭当前缓冲区.
把这个文件保存到你的runtimepath所指向任一目录的ftplugin子目录中(一般是放在~/.
vim/ftplugin目录中).
你在下次打开lookupfile窗口时,试试连按两次ESC,是不是lookupfile窗口就关闭了这样设置,非常适合vim中按ESC取消命令的习惯,效率也高.
如果你对vim缺省文件类型插件的设置不太满意,那么可以把这个全局插件拷贝到$HOME/.
vim/plugin目录中,然后更改其中的设置.
你可以留意一下vim缺省的文件类型插件,它们的头部都有这样的代码:开启文件类型检测37"Onlydothiswhennotdoneyetforthisbufferifexists("b:did_ftplugin")finishendif这类似于C语言头文件中的"#ifndefXXX|#defineXXX"的语句,可以防止该插件被执行多次.
因此,把这个插件拷贝到$HOME/.
vim/plugin中(这个目录在runtimepath中排在最前面),它将先于vim的缺省插件被加载;而它加载后,vim的缺省文件类型插件就不会再被加载了.
这就达到了我们修改设置的目的.
不过我们通常不用这种方法.
如果这样做,一旦vim的缺省插件做了改变,我们也要更新我们改过的插件才行.
我们可以在载入全局插件以后否决一些设置.
在Unix上,我们可以把我们的设置放在~/.
vim/after/ftplugin/目录中,这个目录中的脚本会在vim的缺省脚本后执行.
这样就可以修改配置,或增加我们自己的定义.
举个例子,在多人一起开发项目时,为了使代码风格尽量保持一致,一般不允许在代码使用TAB符,而以4个空格代之.
我们可以编辑一个文件,包含下面的内容:setshiftwidth=4setexpandtab把这个文件保存为~/.
vim/after/ftplugin/c.
vim.
这样,每次在编辑c文件时,它的自动缩进为4个空格;当你在插入模式下使用CTRL-D、CTRL-T缩进时,它也会调整4个空格的缩进;当你按TAB键时,它将会插入8个空格.
.
.
.
.
.
如果你想上面的设置对h文件也生效的话,需要把它另存一份:~/.
vim/after/ftplugin/cpp.
vim,因为h文件的文件类型被设为cpp.
我们知道,vim在设置文件类型时,会触发FileType自动命令,因此,上面的例子可以用下面的自动命令来实现:autocmdFileTypec,cppsetshiftwidth=4|setexpandtab把这个命令放在你的vimrc中,可以起到和上例同样的效果.
vim的语法高亮功能,也要用到文件类型,来对不同的关键字进行染色.
这我们将在下一篇文章中介绍.
[参考文档]vim手册vim中文手册hlMarkSetvmaphlMarkSetnmaphhMarkClearvmaphhMarkClearnmaphrMarkRegexvmaphrMarkRegex这样,当我输入",hl"时,就会把光标下的单词高亮,在此单词上按",hh"会清除该单词的高亮.
如果在高亮单词外输入",hh",会清除所有的高亮.
你也可以使用virsual模式选中一段文本,然后按",hl",会高亮你所选中的文本;或者你可以用",hr"来输入一个正则表达式,这会高亮所有符合这个正则表达式的文本.
你可以在高亮文本上使用",#"或",*"来上下搜索高亮文本.
在使用了",#"或",*"后,就可以直接输入"#"或"*"来继续查找该高亮文本,直到你又用"#"或"*"查找了其它文本.
如果你在启动vim后重新执行了colorscheme命令,或者载入了会话文件,那么mark插件的颜色就会被清掉,解决的办法是重新source一下mark插件.
或者像我一样,把mark插件定义的highlight组加入到你自己的colorscheme文件中.
例如,把下面的语句加到desert_my.
vim及darkblue_my.
vim中:"FormarkpluginhiMarkWord1ctermbg=Cyanctermfg=Blackguibg=#8CCBEAguifg=BlackhiMarkWord2ctermbg=Greenctermfg=Blackguibg=#A4E57Eguifg=BlackhiMarkWord3ctermbg=Yellowctermfg=Blackguibg=#FFDB72guifg=BlackhiMarkWord4ctermbg=Redctermfg=Blackguibg=#FF7272guifg=BlackhiMarkWord5ctermbg=Magentactermfg=Blackguibg=#FFB3FFguifg=BlackhiMarkWord6ctermbg=Bluectermfg=Blackguibg=#9999FFguifg=Black不知道为什么,我的vim7.
0在切换到其它缓冲区然后再切换回来时,原来被标记的文本会失去高亮.
而作者说他并不存在此问题.
如果你存在类似的问题,可以打上我所加的补丁:---easwy/mark.
vim2006-12-0113:02:18.
000000000+0800+++plugin/mark.
vim2007-03-2310:22:02.
000000000+0800@@-440,6+440,43@@endifendfunction+"easwyadd+"returnthemarkstringunderthecursor.
multi-linesmarksnotsupported+function!
RedoMarkWord()+"definevariablesiftheydon'texist+calls:InitMarkVariables()++leti=1+whilei/pattern/+letquote+letj=0乱花渐欲迷人眼-语法高亮41+whilej=strlen(quote)+return-1+endif++"highlighttheword+exe"syntaxclearMarkWord".
i+exe"syntaxmatchMarkWord".
i.
"".
quoted_regexp.
"containedin=ALL"+endif+leti=i+1+endwhile+endfunction++augroupmarkword+autocmd!
+autocmdBufWinEnter*callRedoMarkWord()+augroupEND+"easwyend+"Restoreprevious'cpo'valuelet&cpo=s:save_cpo用法:1.
保存该patch到某一目录,例如:/tmp/mark.
vim.
patch2.
cd到你的.
vim目录:cd~/.
vim3.
运行命令:cat/tmp/mark.
vim.
patch|patch-p0[参考文档]vim手册vim中文手册cscope.
filescscope-bq这条命令把~src/vim70目录下的所有普通文件都加入了cscope.
files,这样,cscope会解析该目录下的每一个文件.
上面的cscope命令并没有使用"-R"参数递归查找子目录,因为在cscope.
files中已经包含了子目录中的文件.
注意:find命令输出的文件以相对路径表示,所以cscope.
out的索引也相对于当前路径.
如果你要在其它路径中使用当前的cscope.
out,需要使用下面介绍的-P选项.
Cscope只在第一次解析时扫描全部文件,以后再调用cscope,它只扫描那些改动过的文件,这大大提高了cscope生成索引的速度.
下表中列出了cscope的常用选项:-R:在生成索引文件时,搜索子目录树中的代码-b:只生成索引文件,不进入cscope的界面-q:生成cscope.
in.
out和cscope.
po.
out文件,加快cscope的索引速度-k:在生成索引文件时,不搜索/usr/include目录-i:如果保存文件列表的文件名不是cscope.
files时,需要加此选项告诉cscope到哪儿去找源文件列表.
可以使用"-",表示由标准输入获得文件列表.
-Idir:在-I选项指出的目录中查找头文件-u:扫描所有文件,重新生成交叉索引文件-C:在搜索时忽略大小写-Ppath:在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了.
要在vim中使用cscope的功能,需要在编译vim时选择"+cscope".
vim的cscope接口先会调用cscope的命令行接口,然后分析其输出结果找到匹配处显示给用户.
在vim中使用cscope非常简单,首先调用"cscopeadd"命令添加一个cscope数据库,然后就可以调用"cscopefind"命令进行查找了.
vim支持8种cscope的查询功能,如下:s:查找C语言符号,即查找函数名、宏、枚举值等出现的地方g:查找函数、宏、枚举等定义的位置,类似ctags所提供的功能d:查找本函数调用的函数c:查找调用本函数的函数t:查找指定的字符串e:查找egrep模式,相当于egrep功能,但查找速度快多了f:查找并打开文件,类似vim的find功能i:查找包含本文件的文件例如,我们想在vim7.
0的源代码中查找调用do_cscope()函数的函数,我们可以输入:":csfindcdo_cscope",回车后发现没有找到匹配的功能,可能并没有函数调用do_cscope().
我们程序员的利器-cscope44再输入":csfindsdo_cscope",查找这个C符号出现的位置,现在vim列出了这个符号出现的所有位置.
我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找.
还可以输入一个正则表达式,这类似于egrep程序的功能,但它是在交叉索引数据库中查找,速度要快得多.
vim提供了一些选项可以调整它的cscope功能:cscopecscopeprg选项用于设置cscope程序的位置.
cscopecscopequickfix设定是否使用quickfix窗口来显示cscope的结果,详情请":helpcscopequickfix";如果你想vim同时搜索tag文件以及cscope数据库,设置cscopecscopetag选项;cscopecscopetagorder选项决定是先查找tag文件还是先查找cscope数据库.
设置为0则先查找cscope数据库,设置为1先查找tag文件.
我通常设置为1,因为在tag文件中查找到的结果,会把最佳匹配列在第一位.
vim的手册中给出了使用cscope的建议方法,使用命令":helpcscope-suggestions"查看.
下面是我的vimrc中关于cscope接口的设置:"cscopesettingifhas("cscope")setcsprg=/usr/bin/cscopesetcsto=1setcstsetnocsverb"addanydatabaseincurrentdirectoryiffilereadable("cscope.
out")csaddcscope.
outendifsetcsverbendifnmaps:csfinds=expand("")nmapg:csfindg=expand("")nmapc:csfindc=expand("")nmapt:csfindt=expand("")nmape:csfinde=expand("")nmapf:csfindf=expand("")nmapi:csfindi^=expand("")$nmapd:csfindd=expand("")下面的两个链接是cscope主页提供的cscope使用方法,也可以作为参考:vim/cscope指导:http://cscope.
sourceforge.
net/cscope_vim_tutorial.
html在大项目中使用cscope:http://cscope.
sourceforge.
net/large_projects.
html在vim的网站上有很多与cscope相关的插件,有兴趣可以去看一下.
程序员的利器-cscope45我以前写的Vim+Cscope/Ctags.
[参考文档]vim帮助文件vim中文手册http://cscope.
sourceforge.
net/http://iamphet.
nm.
ru/cscope/cscope手册:w:makenmapcn:cnnmapcp:cpnmapcw:cw10现在使用","(先按,再按空格)就可以编译,使用",cp"和",cn"跳到上一个和下一个错误,使用",cw"来打开一个quickfix窗口.
这下顺手多了!
如果你希望跳转到出错的文件时,使用一个分隔的窗口打开,请参阅'switchbuf'选项的值.
在vim7中,每个窗口都可以拥有自己的位置列表,这样,你就能够同时打开多个位置列表了,而quickfix列表在整个vim中只有一个.
你可以使用位置列表来显示编译错误信息,具体命令参阅手册:":helplocation-list"以及":help:lmake".
[GREP]我们在程序员的利器-cscope中讲过,cscope可以做为一个快速的grep程序使用,对于我们的软件项目,用cscope生成一个数据库,可以大大加快查找字符串的速度.
但cscope需要事先生成一个数据库,对一些简单的查找,不需要专门为之生成数据库,这时候可以使用grep.
Grep的名字来源于"g/re/p","re"是正则表达式(regex)的意思,"p"是打印,也就是把匹配正则表达式的行打印出来.
vim既可以使用外部的grep程序,也可以使用内部集成的grep功能.
使用集成的grep命令非常简单,通常使用格式为::vimgrep/main/gj**/*.
c在上面的例子里,我们使用vim内部集成的grep功能,在当前目录及其子目录树的所有c文件中查找main字符串,如果一行中main出现了多次,每个匹配都计入;在查找到后,不立即跳转到第一个匹配的地方.
使用内部集成的grep功能速度要比外部grep慢一些,因为它会打开每个文件,对其进行检查,然后关闭;但集成的grep支持vim增强的正则表达式,可以利用它进行更为复杂的查找.
它也支持vim扩展的文件通配符表示方式,见":helpstarstar-wildcard".
剑不离手-quickfix49vimgrep查找到的结果,也会放在quickfix列表中.
下图是在vim7.
0的源代码目录中执行上面的命令生成的quickfix列表:点击查看大图我们可以使用上面介绍的quickfix模式的命令,来查看这些匹配.
你也可以用外部的grep程序来查找,如果你的系统中所用的不是标准的grep程序,那么就需要修改'grepprg'选项,详情请参阅手册.
使用外部grep的语法与grep程序相同,请参阅grep的手册.
无论使用内部的vimgrep,还是使用外部的grep,vim都允许你将查找到的结果放在与窗口相关联的位置列表,要了解详细信息,":help:lvimgrep"及":help:lgrep".
在我的vimrc中,定义下面的键映射,利用它可以在当前文件中快速查找光标下的单词:nmaplv:lv/=expand("")/%:lw[参考文档]vim手册vim中文手册"后,又会自动弹出classbase的成员供选择,非常方便,连"CTRL-XCTRL-O"都不必输入.
OmniCppComplete插件的缺省设置比较符合我的习惯,因此不须对其设置进行调整,如果你需要调整,参阅OmniCppComplete的帮助页.
智能补全54点击查看大图点击查看大图下表是我的vimrc中设置的键绑定,使用pumvisible()来判断下拉菜单是否显示,如果下拉菜单显示了,键映射为了一个值,如果未显示,又会映射为另一个值.
"mappinginoremappumvisible()"\":"\"inoremappumvisible()"\\\":"\"inoremappumvisible()"\\\":"\"inoremappumvisible()"\":"\"上面的映射都是在插入模式下的映射,解释如下:如果下拉菜单弹出,回车映射为接受当前所选项目,否则,仍映射为回车;智能补全55如果下拉菜单弹出,CTRL-J映射为在下拉菜单中向下翻页.
否则映射为CTRL-XCTRL-O;如果下拉菜单弹出,CTRL-K映射为在下拉菜单中向上翻页,否则仍映射为CTRL-K;如果下拉菜单弹出,CTRL-U映射为CTRL-E,即停止补全,否则,仍映射为CTRL-U;在下一篇文章中,将继续介绍vim提供的其它补全方式.
[参考文档]vim手册vim中文手册http://www.
vim.
org/tips/tip.
phptip_id=1228http://www.
vim.
org/tips/tip.
phptip_id=1386inoremapinoremapinoremapSuperTab插件会记住你上次所使用的补全方式,下次再补全时,直接使用TAB,就可以重复这种类型的补全.
比如,上次你使用CTRL-XCTRL-F进行了文件名补全,接下来,你就可以使用TAB来继续进行文件名补全,直到你再使用上面列出的补全命令进行了其它形式的补全.
这个插件在下面的链接下载:http://www.
vim.
org/scripts/script.
phpscript_id=1643下载后,把它放到.
vim/plugin目录就可以了.
可以对下面两个选项进行配置,以调整SuperTab的缺省行为:自动补全58g:SuperTabRetainCompletionType的值缺省为1,意为记住你上次的补全方式,直到使用其它的补全命令改变它;如果把它设成2,意味着记住上次的补全方式,直到按ESC退出插入模式为止;如果设为0,意味着不记录上次的补全方式.
g:SuperTabDefaultCompletionType的值设置缺省的补全方式,缺省为CTRL-P.
你可以在vimrc中设置这两个变量,例如:letg:SuperTabRetainCompletionType=2letg:SuperTabDefaultCompletionType=""现在你可以使用TAB来进行补全了,就像在shell中那样,方便了很多!
[参考文档]vim手册vim中文手册mt-打开/关闭ShowMarks插件mo-强制打开ShowMarks插件mh-清除当前行的标记ma-清除当前缓冲区中所有的标记mm-在当前行打一个标记,使用下一个可用的标记名我最常使用的是"mm"和"mh",用起来非常方便.
在我的vimrc中,把Leader定义为",",所以每次都使用",mm"和",mh"来设置和删除mark.
指随意动,移动如飞(二)65在vim7.
0中,如果大写的标记被定义了,那么函数line()无论在哪个缓冲区里都会返回该标记的行号,导致showmarks在每个缓冲区里都会把这个大写标记显示出来.
因此我为这个插件打了个补丁来修正此问题.
vim7.
0中也可以真正的删除一个mark标记,所以也改了showmarks插件的删除标记功能.
原来的功能在删除标记时,并未真正删除它,只是把这个标记指向缓冲区的第一行;现在则是真正删除此标记.
如果想使用我为showmarks打的补丁,请点击这里下载showmarks补丁.
用法:1.
保存该patch到某一目录,例如:/tmp/showmarks.
vim.
patch2.
cd到你的.
vim目录:cd~/.
vim3.
运行命令:cat/tmp/showmarks.
vim.
patch|patch-p0MarksBrowser插件可以显示出当前缓冲区中定义的小写标记的位置,在你无法对应上标记的名字和其位置时,非常有用.
下载后把它放到你的$HOME/.
vim/plugin目录即可,我为其定义了一个快捷键:"markbrowsersettingnmapmk:MarksBrowser这样,直接使用",mk"就可以打开MarkBrowser窗口了.
下图显示这两个插件工作时的效果.
我在文件中定义了三个标记,一个大写标记A,两个小写标记a和t.
最上面的窗口是MarkBrowser窗口,主编辑窗口中的高亮行及sign标记是ShowMarks插件放置的.
点击查看大图[折行]指随意动,移动如飞(二)66在文件比较大时,在文件中移动也许会比较费力.
这个时候,你可以根据自己的需要把暂时不会访问的文本折叠起来,既减少了对空间的占用,移动速度也会快很多.
vim提供了多种方法来进行折叠,既可以手动折叠,也可以根据缩进、语法,或使用表达式来进行折叠.
程序文件一般都具有良好的结构,所以根据语法进行折叠是一个不错的选择.
要启用折叠,首先要使能'foldenable'选项,这个选项是局部于窗口的选项,因此可以为每个窗口定义不同的折叠.
接下来,设置'foldmethod'选项,对于程序,我们可以选择根据语法高亮进行折叠.
需注意的,要根据语法高亮进行折叠,必须打开文件类型检测和语法高亮功能,请参见我前面的文章.
下面是我的vimrc中的设置,它使用了自动命令,如果发现文件类型为c或cpp,就启用折叠功能,并按语法进行折叠:autocmdFileTypec,cppsetlfdm=syntax|setlfen注意,vim的很多命令、选项名都有简写形式,在帮助手册中可以看到简写形式,也可以按简写形式来help,例如,要查看'foldmethod'选项的帮助,可以只输入":help'fdm'".
折叠后的效果见下图:点击查看大图图中以黑色背景显示的行就是被折叠起来的行,vim会显示这个fold中被折叠了多少行,以及起始行的内容.
留意一下左下方的"__Tag_List__"窗口,在这个窗口中也存在着折叠,我把macro,typedef,variable几项折叠起来了,而把function的折叠打开.
从该窗口最左边的折叠栏(:helpfold-foldcolumn)也可以看出不同:被折叠的文本前显示了"+",打开的折叠前显示的是"|".
折叠的背景色及显示文字等都可以修改,参阅帮助手册(:helpfolding).
下面的命令用来打开和关闭折叠:指随意动,移动如飞(二)67zo–打开光标下的折叠zO–循环打开光标下的折叠,也就是说,如果存在多级折叠,每一级都会被打开zc–关闭光标下的折叠zC–循环关闭光标下的折叠更多的命令,请参阅手册(:helpfolding).
vim提供了一些命令在折叠间快速移动:[z–到当前打开折叠的开始]z–到当前打开折叠的结束zj–向下移动到下一个折叠的开始处zk–向上移动到上一个折叠的结束处我通常不喜欢把文本折叠起来,因为我更喜欢一目了然的看到全部文本.
你可以根据自己的喜好来决定是否启用折叠.
多说一点,手动创建的折叠是可以保存在session文件中的,这样下次进入vim时可以载入之前创建的折叠,参见:help'sessionoptions'.
[在程序中移动]vim的作者是一个程序员,这就不难理解为什么vim提供了众多在程序中移动的命令.
这里面既包括我们前面的文章中介绍过的利用tag文件及cscope在标签间跳转,也包括众多在函数、注释、预处理指令、程序段,及其它程序元素中移动的命令.
本文不再详细介绍这些命令,作为程序员,一定要熟读usr_29.
txt!
这些命令,可以帮助你在程序中得心应手的移动.
在这里介绍两个插件,增强了在程序中移动的功能,一个是a.
vim,另外一个是matchit.
a.
vim的功能非常简单,它帮助你在源文件和头文件间进行切换,这个简单的功能,却非常实用,至少它为我节省了很多时间.
下载a.
vim后,把它放到你的.
vim/plugin目录就可以了.
假设你正在浏览C语言的源文件,这时想修改它对应的头文件,只需要输入":A"命令,就切换到头文件了(需要源文件和头文件在同一目录中).
a.
vim插件还定义了其它一些命令和快捷键,参见它的帮助手册.
在vim中,"%"命令跳转到与当前项目相匹配的项目.
例如,当光标位置在"{"时,按下%,光标就跳转到对应的"}"(:help%).
但vim提供的%命令,只能在括号,或者C注释的开始和结束(或者C编译预处理指令间进行跳转.
对于其它程序结构,例如HTML,%命令不能从标记,跳转到对应的标记.
Matchit插件则扩展了%命令的功能,使%命令可以对其它程序语言的开始和结束标记间进行跳转.
下载后,把这个插件放到你的.
vim/plugin目录,你就可以用%在各种开始/结束标记间跳转了,目前,它可以支持Ada,ASPwithVBS,Csh,DTD,Essbase,Fortran,HTML,JSP(sameasHTML),LaTeX,Lua,Pascal,SGML,Shell,Tcsh,Vim,XML等语言.
[插入模式下的移动]上面介绍的移动命令,都是在normal模式下使用的,如果想在insert模式下移动,阅读:helpins-special-special.
指随意动,移动如飞(二)68你真的需要在插入模式下移动吗我几乎不会!
通常我会先按ESC返回Normal模式,然后再移动,当你习惯了以后,你会发现效率会更高.
[小结]你会发现,本文的内容,和usr_03.
txt帮助文档很相似.
是的,只要你学会了usr_03.
txt中列出的命令,你就掌握了最常用最实用的vim移动命令(:helpusr_03.
txt).
如果你想了解更多的移动命令,请通篇阅读motion.
txt,记住你最有可能用到的那些键.
当你的手指能够不假思索的使用这些命令后,你在vim中就能做到指随意动、移动如飞了.
[参考文档]vim手册vim中文手册vim配置已经适合大多数人,但有些时候你可能需要一些额外的功能,这时就需要自己定制一下vim.
定制vim很简单,进入~/install/vim71/src文件,编辑Makefile文件.
这是一个注释很好的文档,根据注释来选择:如果你不想编译gvim,可以打开--disable-gui选项;如果你想把perl,python,tcl,ruby等接口编译进来的话,打开相应的选项,例如,我打开了--enable-tclinterp选项;如果你想在vim中使用cscope的话,打开--enable-cscope选项;我们刚才打的vimgdb补丁,自动在Makefile中加入了--enable-gdb选项;如果你希望在vim使用中文,使能--enable-multibyte和--enable-xim选项;可以通过--with-features=XXX选项来选择所编译的vim特性集,缺省是--with-features=normal;如果你没有root权限,可以把vim装在自己的home目录,这时需要打开prefix=$(HOME)选项;编辑好此文件后,就可以编辑安装vim了.
如果你需要更细致的定制vim,可以修改config.
h文件,打开/关闭你想要的特性.
[编译安装]编译和安装vim非常简单,使用下面两个命令:makemakeinstall你不需要手动运行.
/configure命令,make命令会自动调用configure命令.
上面的命令执行完后,vim就安装成功了.
我在编译时打开了"prefix=$(HOME)"选项,因此我的vim被安装在~/bin目录.
这时需要修改一下PATH变量,以使其找到我编辑好的vim.
在~/.
bashrc文件中加入下面这两句话:PATH=$HOME/bin:$PATHexportPATH退出再重新登录,现在再敲入vim命令,发现已经运行我们编译的vim了.
[安装vimgdb的runtime文件]运行下面的命令,解压vimgdb的runtime文件到你的~/.
vim/目录:cd~/install/vimgdb/tarzxfvimgdb_runtime.
tgz–C~/.
vim/现在启动vim,在vim中运行下面的命令以生成帮助文件索引::helptags~/.
vim/doc现在,你可以使用":helpvimgdb"命令查看vimgdb的帮助了.
在vim中使用gdb调试71至此,我们重新编译了vim,并为之打上了vimgdb补丁.
下面我以一个例子来说明如何在vim中完成"编码—编译—调试"一条龙服务.
[在vim中调试]首先确保你的计算机上安装了gdb,vimgdb支持5.
3以上的gdb版本,不过最好使用gdb6.
0以上的版本.
我使用下面这个简单的例子,来示例一下如何在vim中使用gdb调试.
先来看示例代码:文件~/tmp/sample.
c内容如下,这是主程序,调用函数计算某数的阶乘并打印:/*~/tmp/sample.
c*/#includeexternintfactor(intn,int*rt);intmain(intargc,char**argv){inti;intresult=1;for(i=1;i可以在按键的缺省定义和调试命令间切换.
好了,我们现在按空格键,在当前窗口下方会打开一个小窗口(command-line窗口),这就是vimgdb的命令窗口,可以在这个窗口中输入任何合法的gdb命令,输入的命令将被送到gdb执行.
现在,我们在这个窗口中输入"gdb",按回车后,command-line窗口自动关闭,而在当前窗口上方又打开一个窗口,这个窗口是gdb输出窗口.
现在vim的窗口布局如下(我又按空格打开了command-line窗口):点击查看大图小技巧:command-line窗口是一个特殊的窗口,在这种窗口中,你可以像编辑文本一样编辑命令,完成编辑后,按回车,就会执行此命令.
你要重复执行某条命令,可以把光标移到该命令所在的行,然后按回车即可;你也可以对历史命令进行修改后再执行.
详见":helpcmdline-window".
接下来,在command-line窗口中输入以下命令:cd~/tmpfilesample这两条命令切换gdb的当前工作目录,并加载我们编译的sample程序准备调试.
在vim中使用gdb调试73现在使用vim的移动命令,把光标移动到sample.
c的第7行和14行,按"CTRL-B"在这两处设置断点,然后按"R",使gdb运行到我们设置的第一个断点处("CTRL-B"和"R"都是gdb_mappings.
vim定义的键绑定,下面介绍的其它调试命令相同).
现在vim看起来是这样:点击查看大图断点所在的行被置以蓝色,并在行前显示标记1和2表明是第几个断点;程序当前运行到的行被置以黄色,行前以"=>"指示,表明这是程序执行的位置(显示的颜色用户可以调整).
数脉科技(shuhost)8月促销:香港独立服务器,自营BGP、CN2+BGP、阿里云线路,新客立减400港币/月,老用户按照优惠码减免!香港服务器带宽可选10Mbps、30Mbps、50Mbps、100Mbps带宽,支持中文本Windows、Linux等系统。数脉香港特价阿里云10MbpsCN2,e3-1230v2,16G内存,1T HDD 或 240G SSD,10Mbps带宽,IPv41个,...
官方网站:https://www.akkocloud.com/AkkoCloud新品英国伦敦CN2 GIA已上线三网回程CN2 GIA 国内速度优秀.电信去程CN2 GIALooking Glass:http://lonlg.akkocloud.com/Speedtest:http://lonlg.akkocloud.com/speedtest/新品上线刚好碰上国庆节 特此放上国庆专属九折循环优惠...
阿里云国际版注册认证教程-免绑卡-免实名买服务器安全、便宜、可靠、良心,支持人民币充值,提供代理折扣简介SunthyCloud成立于2015年,是阿里云国际版正规战略级渠道商,也是阿里云国际版最大的分销商,专业为全球企业客户提供阿里云国际版开户注册、认证、充值等服务,通过SunthyCloud开通阿里云国际版只需要一个邮箱,不需要PayPal信用卡就可以帮你开通、充值、新购、续费阿里云国际版,服务...