HTML版本停止更新,最新版仅提供PDF(https://code.google.com/p/yangyanggnu/downloads/list) 更新时间2012-9-5,最新版本0.3,更新记录: 完善“一键编译及运行”部分,增加如何查看链接错误。
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, OK,言归正传,说说vim用于代码编写提供了哪些直接和间接功能支撑。vim联机手册中,50%的例子都是在讲vim如何高效编写代码,由此可见,vim是一款面向程序员的编辑器,即使某些功能vim无法直接完成,借助其丰富的插件资源,必定可以达成目标(注,推荐两份vim入门资料:《vim用户手册中文版7.2》、《AByte of Vim v0.51 (for Vim version 7)》)。 我是个“目标驱动”的信奉者,本文内容,我会先给出优秀IDE应具备哪些功能,再去探索如何通过vim的操作或插件来达到目标。最终至少要像这个样子:
(图0:图形环境下IDE总揽)
(图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后宏无法保存,所以有人专门编写了一款插件,其中部分功能就是快速注释与反注释。
此外,有时需要asciiart风格注释,推荐如下插件:
(图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<XX>。
\p< #include<XX> \p” #include“XX” \pd #define \sd do{}-while \sfo for(){} \sif if(){} \sife if(){}else{} \se else{} \swh while(){} \ss switch(){} \cfu函数框架
第二类补全就真的智能了。实现智能补全的原理非常简单:代码中所有函数、结构、成员、变量、宏等对象的名字、所在文件路径、定义、类型等信息(称之为标签信息)保存到一个独立文件(称之为数据库文件)中,vim和智能补全插件根据数据库信息快速匹配输入的字符,若找到匹配的则以列表形式显示之。
D、需要进行函数名、变量名、结构名、结构成员补全时输入Ctrl+XCtrl+O,需要头文件名补全时输入Ctrl+XCtrl+I,需要文件路径补全时输入Ctrl+XCtrl+F。 具体效果如以下几图所示:
(图3:函数名补全)
(图4:结构成员补全)
(图5:文件路径补全)
前面提到过,智能补全是通过tags文件来实现的,如果代码中新增了函数或者调整了变量名,tags文件无法自动更新,那么调整部分函数名或变量名肯定无法实现智能补全了,除非你手动再次执行ctags-R.命令。要是能自动更新tags文件就好了!哈哈,有求必应,开源世界就是好,隆重推出自动生成并实时更新tags文件的插件——indexer。
[-系统函数调用参考-] 有过Win32SDK开发经验的朋友对MSDN或多或少有些迷恋吧,有些API多达7、8个参数,有套函数功能描述、参数讲解、返回值说明的文档那是很有必要滴。别急,vim也能做到。
(图6:库函数调用参考)
(图7:系统函数调用参考)
此外,如果你从事gnome开发,还可以安装独立软件devhelp,这是GTK版的MSDN。如下图所示:
(图8:devhelp)
[-快速查看定义-] 上面说了如何查看系统函数调用,自己写的函数又如何快速查看其函数定义了?单代码文件的项目倒是不麻烦,无非上下拖动下滚动条或者多按几次j、k键而已,对于动辄十多个代码文件的一般项目来说,准确、快速查找到函数定义对于提高开发效率非常有帮助。下面介绍如何快速跳转到函数定义、变量定义、结构定义、成员定义处。 快速跳转到函数定义处,也是通过标签来实现的,所以必须得有tags文件支持,如果你还没实现前面“智能补全”部分的功能,那请倒回去看看,成功后再继续这部分内容,如果已经实现,你可以随便找个自定义函数(注,一定要是自定义函数,因为ctags未对系统函数生成标签,对于系统函数,我一般只关注其功能、参数、返回值等信息,不会关注起实现或称为定义。前者通过“系统函数调用参考”部分已经实现,后者如果你的确需要,可将“ctags-R .”替换成“ctags-R --fields=+lS/usr/include”,“/usr/include”为系统函数头文件和实现文件所在目录),把光标移到上面,输入CTRL-],呵呵,是不是奇迹发生了呀。 比如,在hardinfo.c文件中调用函数parameters_init(),将光标移到该函数上,如下图所示:
(图9:准备跳转到函数定义处)
输入CTRL-]后,通过tags文件,vim找到parameters_init()定义在util.c文件的360行,并自动定位到该文件的正确行数上,如下图所示:
(图10:正确跳转到函数定义处)
OK,上面演示了如何快速跳转到函数定义处,变量、结构、成员也是类似的。另外,CTRL-]跳转到定义处后。如果此时你还想再跳回先前位置,按CTRL-O,前进按CTRL-I。 此外,有时我们在阅读代码时,希望有个窗口能将当前代码文件中所有函数名、变量名、结构名等以列表形式罗列出来,以便有针对的分析代码。呵呵,可以嘀~。
如下图左下子窗口所示:
(图11:标签列表)
[-语法高亮-] 现在已是千禧年后的十年了,早已告别上世纪六、七十年代黑底白字的时代,如果编码时没有语法高亮,肯定会让你的代码失去活力,即使在字符模式下编程(感谢伟大的fbterm),我也会开启语法高亮功能。 vim自身就支持语法高亮,只须打开相关设置即可。请将如下配置信息添加到.vimrc:
我选用内置的evening配色方案,灰底、白字、黄色关键字、蓝色注释......,效果还不错,比较适合我的审美观。如果不满意,vim还提供了10多种配色方案供你选择,GUI下,可以通过菜单(Edit–> ColorScheme)试用不同方案,字符模式下,需要你手工调整配置信息,再重启vim查看效果(推荐csExplorer.vim插件,可在字符模式下不用重启即可查看效果)。
[-多文档编辑-] 一个EXCEL文档可以有多个SHEET,你可以在不同SHEET间来回切换,同样,编程时也需要类似功能,即,同时打开多个文件,可以自由自在地在不同代码文件间游历。这种需求,vim是通过buffer来实现的。每打开一个文件vim就对应创建一个buffer,多个文件就有多个buffer。
编辑单个文档时,不会出现buffer列表,如下图所示:
(图12:编辑单个文档) 当前编辑的是hardinfo.c文件,该文件中有调用parameters_init()函数,但该函数定义在util.c文件中,当我在parameters_init()上输入CTRL-]后,vim新建util.c文件的buffer并自动定位到parameters_init(),这时,vim同时在编辑hardinfo.c和util.c两个文档,可从顶部的buffer列表中查看到。如下图所示:
(图13:同时编辑多个文档)
[-代码折叠-] 有时为了去除干扰,集中精力在某部分代码段上,我会把不关注部分代码折叠起来。vim自身支持多种折叠,包括:手动建立折叠(manual)、相同缩进距离的行构成折叠(indent)、'foldexpr'给出每行的折叠(expr)、标志用于指定折叠(marker)、语法高亮项目指定折叠(syntax)、没有改变的文本构成折叠(diff)。用于编程时的折叠当然就选“语法高亮项目指定折叠(syntax)”啦。
如,当前光标位于87行的if语句块内,该语句块处于正常展开的状态,占据从86到90处共计5行空间,如下:
(图14:正常展开的代码)
输入za后,这5行合并为一行,显示第一行的内容,如下所示:
(图15:折叠后的代码)
[-工程内查找与替换-] 有个名为iFoo的全局变量,被工程中10个文件引用过,由于你岳母觉得匈牙利命名法严重、异常、绝对以及十分万恶,为讨岳母欢心,不得不将该变量更名为foo,怎么办?依次打开每个文件,逐一查找后替换? vim既然被称为“编辑器之神”,这点请求还是可以满足嘀^_^。Vim自身支持全局替换:先选择要替换的文档:args1.c 2.c … 10.c,执行全局替换命令:argdo%s/\<iFoo\>/foo/ge |update,其中,iFoo将被foo替代,e表示忽略错误,update用于保存那些有被执行替换操作的文档。 此外,要进行工程内全局查找,可以借助插件实现。
比如,光标移到parameters_init下,输入;sp后,grep插件自动提取parameters_init为搜索关键字,并给出在哪些类型的文件中内搜索(默认为该目录下所有文件),最后搜索到4项匹配结果并显示在quickfix中,如下图所示:
(图16:工程内查找)
[-工程文件浏览-] 我通常将工程相关的文档放在同个目录下,通过NERDtree插件查看文件列表,要打开哪个文件,光标选中后回车即可在新buffer中打开。
键入”;fl”后,左边子窗口为工程项目文件列表,如下图所示:
(图17:项目文件列表)
[-一键编译链接-] vim再强大也只能是个优秀的编辑器而非编译器,它能高效地完成代码编辑工作,但不得不通过其他外部命令实现将代码转换为二进制可执行文件。对于只有单个代码文件的项目来说,无非是保存代码文件、shell中调用gcc编译、gcc链接这样的简单命令方式即可实现;但,对于有几十上百个文件的工程项目,采用这种方式只会把自己逼疯,必须要找到一个实现一键编译的方法。 工程项目一键编译有几个要点,工程自身的管理、编译、查看语法错误,逐一解决即可实现一键编译。linux有两种工程代码管理的方式——Makefile和非Makefile,采用Makefile方式的工程代码管理工具(准确地说,应称之为”构建系统”)常见的有GNU出品的老牌autotools、新生代的CMake(KDE采用的构建系统,非常易用,哭着推荐),采用非Makefile方式的构建系统最著名的要数SCons,我选用CMake,由他独立于vim生成工程的Makefile文件,解决第一个工程自身管理的问题;既然有了Makefile文件,要编译自然是执行make命令,呵呵,由于vim自身支持make命令,直接在vim中输入:make命令它会调用外部make程序读取当前目录中的Makefile文件,完成编译、链接操作,第二个问题也就解决了;一次性编译通过的可能性很小,难免有些语法错误,vim将编译器抛出的错误和警告信息输出在quickfix中,执行:cw命令即可显示quickfix,第三个问题搞定。编辑、重复以上三步直到编译通过。 说了这么多,概要之,先写好整个工程的Makefile,再在vim中执行:make,最后显示quickfix。要实现一键编译,无非是把这几步映射为vim的快捷键,即: nmap<Leader>m :wa<CR>:make<CR>:cw<CR><CR> 分解说明下,<Leader>m设定快捷键为;m(;由<Leader>指定),:wa<CR>保持所有打开的文档,:make<CR>执行make命令,:cw<CR>显示quickfix(如果有编译错误或警告时),最后的<CR>消除make命令执行完成屏幕上“PressENTER
or type command to continue”的输入等待提示信息。
[-暂未实现功能-] 好了,以上功能基本达到我对IDE的预期,满足了?没有,还有几个问题现在还没很好地解决,或者是有思路了,还没来得及实践,记录下来,空了继续探索。如果你清楚,麻烦写信告诉我(yangyang.gnu@gmail.com),多谢多谢@_@ 1、集成调试器,实现源码级调试。思路:Pyclewn插件 2、重启vim时恢复到上次编辑环境。包括打开的文件、BUFFER、光标位置等。思路:通过vim的会话文件实现。
[-附一:.vimrc信息汇总-] 以下信息源自我的~/.vimrc文件,主要对vim自身进行个性化配置、对各插件进行配置以及快捷键设置,每个配置项都有对应注释,可根据你自己情况按需择取。
[-附二:vim常用操作汇总-] 我常用的vim操作记录如下,备忘~_~
|
|