手把手教你将Vim改装成一个IDE编程环境(图文) 吴垠
By: 吴垠 1 写在前面 Linux下编程一直被诟病的一点是: 没有一个好用的IDE,但是听说Linux牛人,黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说,一个好用的IDE是何等的重要啊,估计很多人就是卡在这个门槛上了,"工欲善其事,必先利其器"嘛,我想如果有一个很好用的IDE,那些Linux牛人也会欢迎的. 这都是劳动人民的美好愿望罢了,我今天教大家把gvim改装成一个简易IDE,说它"简易"是界面上看起来"简易",但功能绝对不比一个好的IDE差,该有的功能都有,不该有的功能也有,你就自己没事偷着乐吧,下面我开始介绍今天的工作了. 本文会教你: 1. 中文帮助手册的安装 本文不会教你: 1. 如何使用vim. 本文不会从零开始教你如何使用vim,如果你是第一次接触vim, 我的工作环境是: Fedora Core 5 gvim是自己编译的7.0,如果你还没有安装gvim,请看我的这篇文章<在Redhat Linux 9中编译和配置gvim 7.0> 本文用的示范源码是vim7.1的源码,可以在www.vim.org下载到源码包:vim-7.1.tar.bz2,你也可以不用下载,就用你自己程序的源码,关系不大的. 我把源码解压在我的home目录下: ~/vim71 下面对文中的一些名字定义一下: 1. 文中用到的一些用<>括起来的符号比如<C-T>,<C-S-A>,之类的,你可以用下面的命令看看解释: :help keycodes 先给大家看张图片,我是vim的界面,解解馋先^_^
(--- 图1 ---)
2 中文帮助手册的安装 vim自带的帮助手册是英文的,对平时编程的人来说没有多大阅读困难,何况还有"星级译王"呢,可偏偏有一帮人将其翻译成了中文,可偏偏我又挡不住诱惑将它安装了,唉.......又痛失一个学习英文的好机会,下不为例. (--- 图2 ---) 下载的文件包应该是类似这样的: vimcdoc-1.5.0.tar.gz 建议先看看帮助手册中的下面章节,其中有关tags文件的部分你可以先跳过,在后面的章节中会讲到,到时候你在回来看看,就觉得很简单了: :help usr_29
4、语法高亮 写程序没有语法高亮将是一件多么痛苦的事情啊,幸亏vim的作者是个程序员(如果不是,那可NB大了),提供了语法高亮功能,在上面的图片中大家也可以看到那些注释,关键字,字符串等,都用不同颜色显示出来了,要做到这样,首先要在你的 ~/.vimrc 文件中增加下面几句话: 复制代码 代码如下: syntax enable syntax on 再重新启动vim,并打开一个c程序文件,是不是觉得眼前突然色彩缤纷了起来... 复制代码 代码如下: colorscheme desert desert是我喜欢的配色方案,你可以改成你的. 如果菜单中的配色方案你还不满意(你也太花了吧),没关系,在 vim.org 上跟你一样的人很多,他们做了各种各样的颜色主题,你可以下载下来一个一个的试,多地可以看到你眼花. 如果这样你还不满意(你还真是XXXX),vim的作者早想到会有你这种人了,你可以创建你自己的颜色主题,把下面的这篇文档好好学习一些一下吧: 复制代码 代码如下: :help syntax.txt 更炫的语法高亮: 主要的思路是新建一个语法文件,在文件中定义你要高亮的东东,想高亮什么就高亮什么,用vim就是这么自信. 所谓的语法文件就是vim用来高亮各种源文件的一个脚本,vim靠这个脚本的描述来使文件中的不同文本显示不同的颜色,比如C语言的语法文件放在类似于这样的一个路径中: "======================================================== " Highlight All Function "======================================================== syn match cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>[^()]*)("me=e-2 syn match cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>/s*("me=e-1 hi cFunction gui=NONE guifg=#B5A1FF "======================================================== " Highlight All Math Operator "======================================================== " C math operators syn match cMathOperator display "[-+/*/%=]" " C pointer operators syn match cPointerOperator display "->/|/." " C logical operators - boolean results syn match cLogicalOperator display "[!<>]=/=" syn match cLogicalOperator display "==" " C bit operators syn match cBinaryOperator display "/(&/||/|/^/|<</|>>/)=/=" syn match cBinaryOperator display "/~" syn match cBinaryOperatorError display "/~=" " More C logical operators - highlight in preference to binary syn match cLogicalOperator display "&&/|||" syn match cLogicalOperatorError display "/(&&/|||/)=" " Math Operator hi cMathOperator guifg=#3EFFE2 hi cPointerOperator guifg=#3EFFE2 hi cLogicalOperator guifg=#3EFFE2 hi cBinaryOperator guifg=#3EFFE2 hi cBinaryOperatorError guifg=#3EFFE2 hi cLogicalOperator guifg=#3EFFE2 hi cLogicalOperatorError guifg=#3EFFE2 再打开你的C文件看看,是不是又明亮了许多. 还有一个压箱底的要告诉你,如果你自己增加了一个类型或者结构之类的,怎么让它也象"int","void"这样高亮起来呢? 再在上面的文件~/.vim/syntax/c.vim中添加下面的东东: "======================================================== " My Own DataType "======================================================== syn keyword cType My_Type_1 My_Type_2 My_Type_3 这样你自己的类型My_Type_1,My_Type_2,My_Type_3就也可以向"int"一样高亮起来了,这样的缺点是每增加一个类型,就要手动在这里添加一下,如果有人知道更简单的方法请一定一定要告诉我,用下面的地址:
5、在程序中跳来跳去: Ctags 的使用 哇,这下可厉害了,Tag文件(标签文件)可是程序员的看家宝呀,你可以不用它,但你不能不知道它,因为Linux内核源码都提供了"make tags"这个选项. 下面我们就来介绍Tag文件. tags文件是由ctags程序产生的一个索引文件,ctags程序其是叫"Exuberant Ctags",是Unix上面ctags程序的替代品,并且比它功能强大,是大多数Linux发行版上默认的ctags程序. 那么tags文件是做什么用的呢? 如果你在读程序时看了一个函数调用,或者一个变量,或者一个宏等等,你想知道它们的定义在哪儿,怎么办呢? 用grep? 那会搜出很多不相干的地方. 现在流行用是的<C-]>,谁用谁知道呀,当光标在某个函数或变量上时,按下"Ctrl+]",光标会自动跳转到其定义处,够厉害吧,你不用再羡慕Visual Studio的程序员了,开始羡慕我吧~_~. 你现在先别急着去按<C-]>,你按没用的,要不要我干什么呀,你现在要做的是查查你电脑里有没有ctags这个程序,如果有,是什么版本的,如果是Ctags 5.5.4,就象我一样,你最好去装一个Ctags 5.6,这个在后面的自动补全章节中会用到. 在这个网站: http://ctags.sourceforge.net,下载一个类似 ctags-5.6.tar.gz 的文件下来(现在好像5.7版的也出来了,不过我还没用过): 用下面的命令解压安装: 复制代码 代码如下: $ tar -xzvf ctags-5.6.tar.gz $ cd ctags-5.6 $ make # make install // 需要root权限 然后去你的源码目录,如果你的源码是多层的目录,就去最上层的目录,在该目录下运行命令: ctags -R 复制代码 代码如下: $ cd /home/wooin/vim71 $ ctags -R 此时在/home/wooin/vim71目录下会生成一个 tags 文件,现在用vim打开 /home/wooin/vim71/src/main.c 复制代码 代码如下: $ vim /home/wooin/vim71/src/main.c 再在vim中运行命令: 复制代码 代码如下: :set tags=/home/wooin/vim71/tags 该命令将tags文件加入到vim中来,你也可以将这句话放到~/.vimrc中去,如果你经常在这个工程编程的话.
(--- 图3 ---) 此时按下<C-]>,光标会自动跳到setmouse()函数的定义处,见下图: (--- 图4 ---) 如果此时你还想再跳回刚才的位置,你还可以按<C-T>,这样又跳回到setmouse()函数被调用的地方了,变量,结构,宏,等等,都可以的,赶快试试吧..... 此时在回头学习一下第3节中说的vim手册吧 :help usr_29 不过还有一个小瑕疵,你修改程序后,比如增加了函数定义,删除了变量定义,tags文件不能自动rebuild,你必须手动再运行一下命令: $ ctags -R 6、教你高效地浏览源码 -- 插件: TagList
在Windows平台上用过Source Insight看程序的人肯定很熟悉代码窗口左边那个Symbol窗口,那里面列出了当前文件中的所有宏,全局变量,函数名等,在查看代码时用这个窗口总揽全局,切换位置相当方便,今天告诉你一个vim的插件: Taglist,可以同样实现这个功能. 上一节已经告诉你ctags的用法了,ctags的基本原理是将程序程序中的一些关键字(比如:函数名,变量名等)的名字,位置等信息通过一个窗口告诉你,如果你已经安装好taglist,则可以用下面的命令看看taglist自带的帮助文件: :help taglist.txt 下面是我翻译的其中的第一段"Overview",供大家现了解一下taglist,翻译的不好,请指教: 首先请先在你的~/.vimrc文件中添加下面两句: 复制代码 代码如下: let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1 此时用vim打开一个c源文件试试: 复制代码 代码如下: $ vim ~/vim/src/main.c 进入vim后用下面的命令打开taglist窗口,如图5: :Tlist (--- 图5 ---) TagList插件我就介绍到这里,其实它还有很多用法和设置,我没法一一地教你了,好在TagList有一份详细的帮助手册,用下面的命令打开手册,好好学习一下吧: :help taglist.txt
在图1中大家可以看到在图标2标识的地方是一个文件浏览器,里面列出了当前目录中的文件,可以通过这个浏览器来浏览工程中的源文件,是不是越来越像常见的IDE了,当光标停在某个文件或文件夹的时候,按下回车,可以打开该文件或文件夹. (--- 图6 ---)
我这里不是教你怎么用netrw.vim插件,而是要教你通过WinManager插件来将TagList窗口和netrw窗口整合起来,就像图1中的图标2和3组成的那个效果 复制代码 代码如下: let g:winManagerWindowLayout='FileExplorer|TagList' nmap wm :WMToggle<cr> 然后重启vim,打开~/vim71/src/main.c,在normal状态下输入"wm",你将看到图7的样子: (--- 图7 ---) WinManager的功能主要就是我介绍的这些,但是它还有其他一些高级功能,还可以支持其他几个插件,如果你觉得我介绍的还不够你用,建议你把它的帮助手册好好研究一下,用下面的命令可以调出帮助手册: 这下更厉害了,用Cscope自己的话说 - "你可以把它当做是超过频的ctags",其功能和强大程度可见一斑吧,关于它的介绍我就不详细说了,如果你安装好了前文介绍的中文帮助手册,用下面的命令看看介绍吧: :help if_cscop.txt 它被设计用来回答以下的问题: 安装Cscope: 复制代码 代码如下: # ./configure # make # make install // 需要root权限 先在~/vimrc中增加一句: :set cscopequickfix=s-,c-,d-,i-,t-,e- 跟Ctags一样,要使用其功能必须先为你的代码生成一个cscope的数据库,在项目的根目录运行下面的命令: $ cd /home/wooin/vim71/ :cs add /home/wooin/vim71/cscope.out /home/wooin/vim71 上面这条命令很重要,必须写全,不能只写前半句: :cs add /home/wooin/vim71/cscope.out 因为源码是多级目录的,如果这样写,cscope是无法在子目录中的源码中工作的,当然,如果你的源码都在同一级目录中就无所谓了. 如果你要经常用cscope的话,可以把上面那句加到~/.vimrc中去. 下面我们来操练一下,查找函数vim_strsave()的定义,用命令: :cs find g vim_strsave (--- 图8 ---) 按下回车后会自动跳转到vim_strsave()的定义处. 此时你肯定会说Ctags也可以做到这个呀,那么下面说的这个Ctags就无法做到了,我想查找vim_strsave()到底在那些地方被调用过了,用命令:
(--- 图9 ---) 如果自动跳转的位置你不满意,想看其他的结果,可以用下面的命令打开QuickFix窗口:
(--- 图10 ---) 这时你就可以慢慢挑选了^_^ cscope的主要功能是通过同的子命令"find"来实现的
如果每次查找都要输入一长串命令的话还真是件讨人厌的事情,Cscope的帮助手册中推荐了一些快捷键的用法,下面是其中一组,也是我用的,将下面的内容添加到~/.vimrc中,并重启vim: 复制代码 代码如下: nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR> nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> 当光标停在某个你要查找的词上时,按下<C-_>g,就是查找该对象的定义,其他的同理. 很奇怪,其中的这句: cscope的其他功能你可以通过帮助手册自己慢慢学习 reset : 重新初始化所有连接。 在上一节的图10中大家可以看到在窗口下面有一个显示查询结果的窗口,这个窗口中列出了查询命令的查询结果,用户可以从这个窗口中选择每个结果进行查看,这个窗口叫"QuickFix"窗口,以前也是一个vim的插件来的,只不过现在成了vim的标准插件,不用你在去安装了,QuickFix窗口的主要作用就是上面看到的那个功能: 输出一些供选择的结果,可以被很多命令调用,更详细的介绍和使用方法请用下面的命令打开QuickFix的手册来学习吧: :help quickfix (--- 图11 ---) 我们修改一下main.c,人为地造成几处错误,在第1019行增加了一个baobao_wu的没有任何定义的字符串,删除了第1020行最后的一个括号")",然后用下面的命令进行编译:
(--- 图12 ---) :cn // 切换到下一个结果 复制代码 代码如下: nmap <F6> :cn<cr> nmap <F7> :cp<cr> 其还有其他的命令/插件也会用到QuickFix窗口,但是用法基本上的都是类似的,本文后面还会用到QuickFix窗口,接着往下看吧. 10、 快速浏览和操作Buffer -- 插件: MiniBufExplorer
在编程的时候不可能永远只编辑一个文件,你肯定会打开很多源文件进行编辑,如果每个文件都打开一个vim进行编辑的话那操作起来将是多麻烦啊,所以vim有buffer(缓冲区)的概念,可以看vim的帮助: 使用方法: (--- 图13 ---)
以下的两个功能需要在~/.vimrc中增加: let g:miniBufExplMapCTabSwitchBufs = 1
如果在~/.vimrc中设置了下面这句: let g:miniBufExplMapWindowNavVim = 1 let g:miniBufExplMapWindowNavArrows = 1
下面介绍它的用法:
其他还有一些命令,你可以在它的网页上看看,我都没用过,其实也都是大同小异,找到自己最顺手的就行了. 我在~/.vimrc中增加了一句: nnoremap <silent> <F12> :A<CR>
下面介绍它的用法:
上面的命令是类似这样调用的:
但是我从来都不用敲上面那些命令的^_^,因为我在~/.vimrc中增加了下面这句: nnoremap <silent> <F3> :Grep<CR> (--- 图14 ---) 在最下面的命令行会显示:
(--- 图14 ---) Search for pattern: FEAT_QUICKFIX Search for pattern: /<FEAT_QUICKFIX/> (--- 图15 ---) Search in files: * Search in files: *.c *.h (--- 图16 ---) 其实还有一些其他功能和设置,但是我都没有用过,这些功能再加上正则表达式,已经够我用了,其他的你可以在网页上看看它的文档,如果有什么惊人发现记得跟我互通有无,共同进步哦....
下面介绍它的用法: :help Mark 按照上面的方法安装好Visual Mark后,你什么也不用设置,如果是gvim,直接在代码上按下Ctrl+F2,如果是vim,用"mm",怎么样,发现光标所在的行变高亮了吧,见下图: (--- 图17 ---) 如果你嫌书签的颜色不好看,你还可以自己定义,不过是修改这个插件脚本的的源码,在目录~/.vim/plugin/中找到并打开visualmark.vim,找到下面这段代码: 复制代码 代码如下: if &bg == "dark" // 根据你的背景色风格来设置不同的书签颜色 highlight SignColor ctermfg=white ctermbg=blue guifg=wheat guibg=peru else // 主要就是修改guibg的值来设置书签的颜色 highlight SignColor ctermbg=white ctermfg=blue guibg=grey guifg=RoyalBlue3 endif 我还有几个不满意的地方: 如果哪位朋友能解决这两个问题,请一定要告诉寡人啊 14、 自动补全 用过Microsoft Visual Studio的朋友一定知道代码补全功能,输入一个对象名后再输入"."或者"->",则其成员名都可以列出来,使Coding流畅了许多,实现很多懒人的梦想,现在我要告诉你,这不再是Microsoft Visual Studio的专利了,vim也可以做到! 下面由我来教你,该功能要tags文件的支持,并且是ctags 5.6版本,可以看看前文介绍tags文件的章节. 我这里要介绍的功能叫"new-omni-completion(全能补全)",你可以用下面的命令看看介绍: 复制代码 代码如下: :help new-omni-completion 你还需要在~/.vimrc文件中增加下面两句: 复制代码 代码如下: filetype plugin indent on 打开文件类型检测,加了这句才可以用智能补全 复制代码 代码如下: set completeopt=longest,menu 关掉智能补全时的预览窗口 请确定你的Ctags 5.6已经安装好,并且生成的tags文件已经可以用了,那么我们就要抄家伙开搞了. 复制代码 代码如下: $ vi /home/wooin/vim71/src/main.c 设置tags文件 复制代码 代码如下: :set tags=/home/wooin/vim71/tags 随便找一个有成员变量的对象,比如"parmp",进入Insert模式,将光标放在"->"后面, 然后按下"Ctrl+X Ctrl+O",此时会弹出一个下列菜单,显示所有匹配的标签,如下图: (--- 图18 ---)
如果你增加了一些成员变量,全能补全还不能马上将新成员补全,需要你重新生成一下tags文件,但是你不用重启vim,只是重新生成一下tags文件就行了,这时全能补全已经可以自动补全了,还真够"全能"吧. vim中的其他补全方式还有:
15、加速你的补全 -- 插件: SuperTab
在上面一节中你应该学会了自动补全代码的功能,按下"Ctrl+X Ctrl+O"就搞定了,如果你够懒的话肯定会说"这么麻烦啊,居然要按四个键",不必为此自责,因为Gergely Kontra 和 Eric Van Dewoestine也跟你差不多,只不过人家开发了supertab.vim这个插件,可以永远懒下去了,下面我来教你偷懒吧. 在你的~/.vimrc文件中加上这两句: 复制代码 代码如下: let g:SuperTabRetainCompletionType=2 let g:SuperTabDefaultCompletionType="<C-X><C-O>" 以后当你准备按"Ctrl+X Ctrl+O"的时候直接按<Tab>就好了,够爽吧 .... 我稍微再介绍一下上面那两句配置信息: 复制代码 代码如下: let g:SuperTabDefaultCompletionType="<C-X><C-O>" " 设置按下<Tab>后默认的补全方式,默认是<C-P>, " 现在改为<C-X><C-O>. 关于<C-P>的补全方式, " 还有其他的补全方式,你可以看看下面的一些帮助: " :help ins-completion " :help compl-omni 复制代码 代码如下: let g:SuperTabRetainCompletionType=2 " 0 - 不记录上次的补全方式 " 1 - 记住上次的补全方式,直到用其他的补全命令改变它 " 2 - 记住上次的补全方式,直到按ESC退出插入模式为止 问题: @ "帮助可怜的乌干达儿童" 1、捐助一个读小学的孩子:每月 17 欧元 (或更多)。 有条件的就资助一下,没条件的就像我一样帮助宣传一下吧,这也算是开源精神..... ====================================== ================== deathmual@gmail.com 发表于2007-10-31 11:55:36 IP: 192.168.3.* duyanning 发表于2007-10-31 12:02:19 IP: 202.117.10.* dlwxn 发表于2007-11-01 10:33:48 IP: 211.143.246.* 原文:http://blog.csdn.net/wooin/article/details/1858917 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |