文件vim配置

vim配置  时间:2021-01-15  阅读:()

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表明是第几个断点;程序当前运行到的行被置以黄色,行前以"=>"指示,表明这是程序执行的位置(显示的颜色用户可以调整).

JUSTG提供俄罗斯和南非CN2 GIA主机年$49.99美元JUSTGgia南非cn2南非CN2justG

JUSTG,这个主机商第二个接触到,之前是有介绍到有提供俄罗斯CN2 GIA VPS主机活动的,商家成立时间不久看信息是2020年,公司隶属于一家叫AFRICA CLOUD LIMITED的公司,提供的产品为基于KVM架构VPS主机,数据中心在非洲(南非)、俄罗斯(莫斯科),国内访问双向CN2,线路质量不错。有很多服务商实际上都是国人背景的,有的用英文、繁体搭建的冒充老外,这个服务商不清楚是不是真...

2022年最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码

全新PHP短网址系统URL缩短器平台,它使您可以轻松地缩短链接,根据受众群体的位置或平台来定位受众,并为缩短的链接提供分析见解。系统使用了Laravel框架编写,前后台双语言使用,可以设置多域名,还可以开设套餐等诸多功能,值得使用。链接: https://pan.baidu.com/s/1ti6XqJ22tp1ULTJw7kYHog?pwd=sarg 提取码: sarg文件解压密码 www.wn7...

速云:广州移动/深圳移动/广东联通/香港HKT等VDS,9折优惠,最低月付9元;深圳独立服务器1050元/首月起

速云怎么样?速云,国人商家,提供广州移动、深圳移动、广州茂名联通、香港hkt等VDS和独立服务器。现在暑期限时特惠,力度大。广州移动/深圳移动/广东联通/香港HKT等9折优惠,最低月付9元;暑期特惠,带宽、流量翻倍,深港mplc免费试用!点击进入:速云官方网站地址速云优惠码:全场9折优惠码:summer速云优惠活动:活动期间,所有地区所有配置可享受9折优惠,深圳/广州地区流量计费VDS可选择流量翻...

vim配置为你推荐
国际域名国际域名和国内域名有什么不同,什么叫顶级域名?域名代理怎样通过卖域名赚钱?虚拟主机代理虚拟主机代理哪家好,应该选择哪个家?域名服务域名系统主要是什么?国内免费空间国内有没有好的免费空间啊空间域名服务器和空间域名什么意思php虚拟空间php虚拟主机空间如何连接mysql重庆网站空间重庆建网站选择哪家比较好,还有域名空间等,独立ip虚拟主机独立ip空间的虚拟主机一般多少钱虚拟主机评测网求推荐一些适合个人博客网站的虚拟主机的服务商
cn域名个人注册 net主机 亚洲大于500m jsp主机 mach5 韩国加速器 特价空间 好看的桌面背景大图 512m内存 网盘申请 台湾谷歌地址 jsp空间 静态空间 免费网页空间 linux使用教程 谷歌台湾 申请免费空间 测试网速命令 云服务是什么意思 阿里云邮箱申请 更多