@会网络的老鼠

涂飞平的博客空间

将VI打造成你的IDE [转]

4 年前 0

//=========================================================
//版本信息:0.1
//作者姓名:杨新涛
//电子邮件:yangyang.gnu@gmail.com
//博客地址:http://hi.csdn.net/yangyang_gnu
//更新时间:2011年7月28日21点25分
//版权信息:本文版权归杨新涛所有。非商业转载,请保留文档信息;商业转载,须经得本人同意
//=========================================================

KenThompson告诉我们——“一个程序只实现一个功能,且做到极致,多个程序协作实现复杂任务”——这是unix。是嘀,这种哲学在linux上随处可见,比如,vim与她的插件们(白雪公主与她的小矮人们 -_-$)。下面开始我们的vim之IDE进化之旅吧。
这个时代,上规模的软件项目已不可能用简单的文本编辑器完成,IDE是必然选择。linux下IDE大致分为两类:“品牌机”和“组装机”。“品牌机”中有些(开源)产品还不错,比如:codeblocks、netbeans、eclipse、anjuta等等,对于初涉linux开发的朋友而言是个不错的选择(我指的是codeblocks),但对于老鸟来说总有这样那样的欠缺。听闻linustorvalds这类大牛用的是类emacs(准确的说是microemacs)和一堆插件拼装而成的IDE,为向大牛致敬,加之我那颗“喜欢折腾”的心,我也选择“组装机”方式。首要任务,选择编辑器。
linux上存在两种编辑器:神之编辑器—emacs,编辑器之神—vim。关于emacs与vim孰轻谁重之争已是世纪话题,我无意参与其中,在我眼里,二者都是创世纪的优秀编辑器,至少在这个领域作到了极致,它们让世人重新认识了编辑操作的本质——用命令而非键盘——去完成编辑任务。好了,如果你不是emacs控,不要浪费时间再去比较,选择学习曲线相较平滑的那个直接啃man吧——vim不会让你失望的。
对于vim的喜爱,我无法用言语表述,献上一首vi的湿哥哥(-_-#)以表景仰之情:
我心之禅如同vi之大道,
vi之漫路即为禅修,
vi之命令如禅之心印,
未得此道者视之怪诞,
与之为伴者洞其真谛,
长修此道者巨变人生。
——作者:reddy@lion.austin.com,
译作:yangyang.gnu@gmail.com
OK,言归正传,说说vim用于代码编写提供了哪些直接和间接功能支撑。vim联机手册中,50%的例子都是在讲vim如何高效编写代码,由此可见,vim是一款面向程序员的编辑器,即使某些功能vim无法直接完成,借助其丰富的插件资源,必定可以达成目标(注,推荐两份vim入门资料:《vim用户手册中文版7.2》、《AByte of Vim v0.51 (for Vim version 7)》)。
我是个“目标驱动”的信奉者,本文内容,我会先给出优秀IDE应具备哪些功能,再去探索如何通过vim的操作或插件来达到目标。最终至少要像这个样子:
vi1.gif(图0:图形环境下IDE总揽)
vi2.gif
(图1:纯字符模式下IDE总揽)
在介绍功能IDE应具备的功能之前,先说说vim插件相关事宜。vim有一套自己的脚本语言,通过这种脚本语言可以实现与vim交互的,达到功能扩展的目的。一组vim脚本就是一个vim插件,vim的很多功能都是通过其插件实现,在官网上有丰富的插件资源,任何你想得到的功能,如果vim无法直接支持,那一般都有对应的插件为你服务,有需求时可以去逛逛。
vim插件目前分为两类:*.vim和*.vba。前者是传统格式的插件,实际上就是一个文本文件,通常someplugin.vim(插件脚本)与someplugin.txt(插件帮助文件)并存在一个打包文件中,解包后将someplugin.vim拷贝到~/.vim/plugin/目录,someplugin.txt拷贝到~/.vim/doc/目录即可完成安装,重启vim后刚安装的插件就已经生效,但帮助文件需执行helptags~/.vim/doc/才能生效。传统格式插件需要解包和两次拷贝才能完成安装,相对较繁琐,所以后来又出现了*.vba格式插件,安装更便捷,只需在shell中依次执行如下命令即可:

vimsomeplugin.vba
:so%
:q
另外,后面涉及到的各类插件,只介绍了我常用的操作,有时间,建议看看它们的帮组文档(:hsomeplugin)。
[-注释与反注释-]
注释时到每行代码前输入//,取消注释时再删除//,这种方式不是现代人的行为。IDE应该支持对选中文本块批量(每行)添加注释符号,反之,可批量取消。本来vim通过宏方式可以支持该功能,但每次注释时要自己录制宏,关闭vim后宏无法保存,所以有人专门编写了一款插件,其中部分功能就是快速注释与反注释。
插件名:c-support.vim
常用操作:
\cc,用CPP语法风格注释掉选中文本块或当前行
\co,取消选中文本块或当前行的CPP语法风格注释
注意:由于C风格注释有“嵌套注释”风险,我都用CPP风格注释。
此外,有时需要asciiart风格注释,推荐如下插件:
插件名:DrawIt.vim
常用操作:
:DIstart,开始绘制结构化字符图形
:Distop,停止绘制结构化字符图形
空格,绘制或擦出字符

vi3.gif
(图2:asciiart风格注释)
[-全能补全-]
提升编码效率的王牌功能就是智能补全。试想下,有个函数叫get_count_and_size_from_remotefile(),当你输入“get_”后IDE自动帮你输入完整的函数名,又有个文件~yangyang.gnu/this/is/a/deep/dir/myfile.txt,就像在shell中一样,类似tab键的东东自动补全文件路径那是何等的惬意啊!以上两个例子仅是我需要的补全功能的一部分,完整的补全应具备:1)预处理语句、语法语句、函数框架补全;2)函数名、变量名、结构名、结构成员、头文件名、文件路径。
对于第一类补全,也可以借助c-support.vim实现。严格地说,这不叫智能补全,仅是c-support.vim是对预处理语句、语法语句、函数框架等设定了快捷键而已,如,要写do-while语句只需简单的输入“\sd”,要包括头文件输入“\p<”即可出现#include

插件名:c-support.vim
操作:
\p< #include\p” #include“XX”
\pd #define
\sd do{}-while
\sfo for(){}
\sif if(){}
\sife if(){}else{}
\se else{}
\swh while(){}
\ss switch(){}
\cfu函数框架
注意:所有模板位于$HOME/.vim/c-support/templates/目录,可按个人偏好更新。
第二类补全就真的智能了。实现智能补全的原理非常简单:代码中所有函数、结构、成员、变量、宏等对象的名字、所在文件路径、定义、类型等信息(称之为标签信息)保存到一个独立文件(称之为数据库文件)中,vim和智能补全插件根据数据库信息快速匹配输入的字符,若找到匹配的则以列表形式显示之。
软件:ctags
插件:new-omni-completion(内置)
操作:A、生成标签数据库文件。在你项目所在目录的顶层执行ctags-R,该目录下会多出个tags文件;
B、在vim中引入标签数据库文件。在vim中执行命令:settags=/home/your_proj/tags
C、在.vimrc中增加如下配置信息:

"开启文件类型侦测
filetype on
"根据侦测到的不同类型加载对应的插件
filetype plugin on
"根据侦测到的不同类型采用不同的缩进格式
filetype indent on
"取消补全内容以分割子窗口形式出现,只显示补全列表
setcompleteopt=longest,menu
D、需要进行函数名、变量名、结构名、结构成员补全时输入Ctrl+XCtrl+O,需要头文件名补全时输入Ctrl+XCtrl+I,需要文件路径补全时输入Ctrl+XCtrl+F。
具体效果如以下几图所示:
vi4.gif
(图3:函数名补全)

vi5.gif
(图4:结构成员补全)

vi6.gif(图5:文件路径补全)
前面提到过,智能补全是通过tags文件来实现的,如果代码中新增了函数或者调整了变量名,tags文件无法自动更新,那么调整部分函数名或变量名肯定无法实现智能补全了,除非你手动再次执行ctags-R.命令。要是能自动更新tags文件就好了!哈哈,有求必应,开源世界就是好,隆重推出自动生成并实时更新tags文件的插件——indexer。
插件名:indexer
操作:必须先创建名为.indexer_files的配置文件且必须位于$HOME,指定要被ctags处理的文件类型及项目根目录,配置文件大致如下:
---------------------~/.indexer_files -----------------------
[PROJECTS_PARENTfilter="*.c *.h *.cpp"]
~/workspace

这样,从~/workspace(及其子目录)打开任何代码文件时,indexer插件便对整个目录及子目录生成tags文件,若代码文件有更新并保存时,indexer插件自动更新项目的tags文件(indexer插件生成的tags文件并未放在你工程目录下,而是在~/.indexer_files_tags目录下,并以工程目录名命名tags文件)
注意:要使用该插件必须得让ctags软件达到5.8.1版本,ctags官网上并无该版本,可在http://dfrank.ru/ctags581/en.html下载,安装后可用ctags--version确认下版本是否正确。
[-系统函数调用参考-]
有过Win32SDK开发经验的朋友对MSDN或多或少有些迷恋吧,有些API多达7、8个参数,有套函数功能描述、参数讲解、返回值说明的文档那是很有必要滴。别急,vim也能做到。
插件名:man.vim(内置)
操作:先在vim中启动该插件:source$VIMRUNTIME/ftplugin/man.vim(可以加入.vimrc中自动启动该插件),需要查看系统函数参考时输入:Mansys_api即可在新建分割子窗口中查看到sys_api()函数参考信息
注意:要使用该功能,系统中必须先安装man-pages和man-pages-posix两套帮助手册。
vi7.gif
(图6:库函数调用参考)
vi8.gif
(图7:系统函数调用参考)
此外,如果你从事gnome开发,还可以安装独立软件devhelp,这是GTK版的MSDN。如下图所示:

vi9.gif [-快速查看定义-]
上面说了如何查看系统函数调用,自己写的函数又如何快速查看其函数定义了?单代码文件的项目倒是不麻烦,无非上下拖动下滚动条或者多按几次j、k键而已,对于动辄十多个代码文件的一般项目来说,准确、快速查找到函数定义对于提高开发效率非常有帮助。下面介绍如何快速跳转到函数定义、变量定义、结构定义、成员定义处。
快速跳转到函数定义处,也是通过标签来实现的,所以必须得有tags文件支持,如果你还没实现前面“智能补全”部分的功能,那请倒回去看看,成功后再继续这部分内容,如果已经实现,你可以随便找个自定义函数(注,一定要是自定义函数,因为ctags未对系统函数生成标签,对于系统函数,我一般只关注其功能、参数、返回值等信息,不会关注起实现或称为定义。前者通过“系统函数调用参考”部分已经实现,后者如果你的确需要,可将“ctags-R .”替换成“ctags-R --fields=+lS/usr/include”,“/usr/include”为系统函数头文件和实现文件所在目录),把光标移到上面,输入CTRL-],呵呵,是不是奇迹发生了呀。

太多了,详细可以下载该pdf文件
附件:拼装的艺术:vim之IDE进化实录.pdf 点击下载

编写评论