原文 : http://smilejay.com/2012/10/vim-for-linux-programmer/
在2年前,写过一篇文章“Vim:打造Linux C/C++程序员的编辑器”,先在根据这两年的Vim使用经验对其进行一些补充和完善,以便在使用Vim时(偶尔忘记配置或快捷键)作为参考。经过适当的配置,配合一些快捷键,VIM会成为Linux上一个代码阅读、编辑的强大工具。
所谓“工欲善其事,必先利其器”,所谓“磨刀不误砍柴工“。
在Linux下,vim是一种最常见的编辑器,很多linux的发行版就自带了(不过 Ubuntu目前时需要自己安装的,默认只带了vi)。今天搞了半天了Vim,通过几个插件来武装我的vim,使其能向传说中的一样成为C/C++程序员的利器。
通过配置和插件,实现的功能有:语法高亮+自动缩进+函数自动补全+变量/函数的跟踪+列出源代码中的函数/变量等
用到的工具有:Vim+.vimrc配置文件+code_complete+ctags+taglist+cscope
使用效果:http://files.myopera.com/mbbill/files/code_complete.gif (亦在本文末尾处)
PS:这个效果非常炫的!~
这里不详细介绍Vim的各个插件的快捷键使用,只是列举一下自己的常用用法,也算个笔记吧。后面会有转载几篇文章详细描述各个插件的详细情况(太多了,其实我也记不住)。
vim 下载地址:http://www.vim.org
code_complete.vim插件http://www.vim.org/scripts/script.php?script_id=1764
ctags 一般安装完vim后都会有,ubuntu中好像是没附带安装,需要下载:http://www.vim.org/scripts/script.php?script_id=610
taglist 下载:http://www.vim.org/scripts/script.php?script_id=273
cscope 到其主页下载:http://cscope.sourceforge.net/
Ubuntu下安装这些包的命令为:
1 2 3 |
sudo apt-get install vim sudo apt-get install ctags (exuberant-ctags) sudo apt-get install cscope |
一. vim 基本配置
1、配置文件的位置
在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录($HOME)下,都可以自己建立私有的配置文件(仅对这个用户有效),命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件。我就是在自己的$HOME目录下新建了了.vimrc文件来配置的。
2、设置语法高亮显示
1) 打开.vimrc,添加以下语句来使得语法高亮显示:
syntax on
2) 如果此时语法还是没有高亮显示,那么在/etc目录下的profile文件中添加以下语句:
export TERM=xterm-color
3、设置C/C++自动缩进(添加以下set语句到.vimrc中)
1)不讨论制表符宽度为8还是为4个空格较好,这里设置(软)制表符宽度为8(Linus在规定Linux kernel中C代码的风格):
set tabstop=8
set softtabstop=8
2)设置缩进的空格数为8
set shiftwidth=8
另外,“set expandtab”选项会将TAB展开(被替换)为对应个数的空格,我一般不推荐设置这个选项。
3)设置自动缩进:即每行的缩进值与上一行相等;使用 noautoindent 取消设置:
set autoindent
4)设置使用 C/C++ 语言的自动缩进方式:
set cindent
5)设置C/C++语言的具体缩进方式(如下设置,仅作参考):
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
6)如果想在左侧显示文本的行号,可以用以下语句:
set nu
PS:自动缩进有两个选项:”set autoindent” 与 “set cindent”.
autoindent 就是自动缩进的意思,当你在输入状态用回车键插入一个新行,或者在 normal 状态用 o 或者 O 插入一个新行时,autoindent 会自动地将当前行的缩进拷贝到新行,也就是“自动对齐”,当然了,如果你在新行没有输入任何字符,那么这个缩进将自动删除。
cindent 就不同了,它会按照 C 语言的语法,自动地调整缩进的长度,比如,当你输入了半条语句然后回车时,缩进会自动增加一个 TABSTOP 值,当你键入了一个右花括号时,会自动减少一个 TABSTOP 值。
二. code_complete 配置
把下载的code_complete.vim拷贝到plugin目录下,一般都在(我的是)/usr/share/vim/vim72/plugin下 (不同的vim版本vim72可能时其他,我的目前时7.2版本)
在vim中使用键就可以补全函数原型了。具体补全的快捷键的定义(如in代表#include ” “),见:code_complete.vim文件中的定义。
三. ctags的使用
用ctags命令生成tags文件,ctags -R –c-kinds=+p –fields=+S /usr/include 应该算是建立索引表(默认会在当前目录生成tags文件),然后把生成的tags文件拷贝到你编程的目录。
注意:ctags -R 后面不加上绝对路径,就时建立当前目录的下所有文件的索引,那么建立的索引文件中都是写的相对路径,你将tags文件拷贝到其他目录去用时,它就会找不到相应的函数/变量等。
注意:运行vim的时候,必须在”tags”文件所在的目录下运行。否则,运行vim的时候还要用”:set tags=”命令设定”tags”文件的路径,这样vim才能找到”tags”文件。
“-R”表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。
“tags”文件中包括这些对象的列表:
用#define定义的宏
枚举型变量的值
函数的定义、原型和声明
名字空间(namespace)
类型定义(typedefs)
变量(包括定义和声明)
类(class)、结构(struct)、枚举类型(enum)和联合(union)
类、结构和联合中成员变量或函数
VIM用这个”tags”文件来定位上面这些做了标记的对象,下面介绍一下定位这些对象的方法:
1) 用命令行。在运行vim的时候加上”-t”参数,例如:
[/home/admin/src]$ vim -t foo_bar
这个命令将打开定义”foo_bar”(变量或函数或其它)的文件,并把光标定位到这一行。
2) 在vim编辑器内用”:ta”命令(是”tag”命令的缩写),例如:
:ta foo_bar
3) 最方便的方法是把光标移到变量名或函数名上,然后按下”Ctrl-]”。用”Ctrl-o”退回原来的地方。
在Vim中运行“:help tags”可以查询到ctags的用法。
四. cscope的配置与使用
可以从http://cscope.sourceforge.net/下载最新的cscope源码,对其进行编译和安装是比较简单的,如下所示。
1 2 3 4 5 |
[root@jay-linux cscope-15.8a]# ./configure [root@jay-linux cscope-15.8a]# make [root@jay-linux cscope-15.8a]# make install [root@jay-linux cscope-15.8a]# /usr/local/bin/cscope --version /usr/local/bin/cscope: version 15.8a |
也许在“make”编译是可能会报一些语法的错误,比如curses.h文件没找到,就需要安装“ncurese-dev”这个软件包。
在需要建立cscope索引的源码目录下,运行“cscope -Rbq”(我常用的)命令即可生成cscope索引。
然后用Vim打开一个c源程序文件,在vim中运行命令“:cs add cscope.out”来加载索引文件(如果运行Vim时所在目录中就有cscope.out,则Vim会自动加载cscope索引)。使用“cs”开头的命令(如常见的“:cs fine XX YY)就可以使用强大的cscope功能了。
对于“cs find”支持的查询命令简单描述如下:
1 2 3 4 5 6 7 8 |
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方 g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能 d: 查找本函数调用的函数 c: 查找调用本函数的函数 t: 查找指定的字符串 e: 查找egrep模式,相当于egrep功能,但查找速度快多了 f: 查找并打开文件,类似vim的find功能 i: 查找包含本文件的文件 |
例如:”:cscope find s kvm_assign_device”、”:cs f g kvm_assign_device”、”:cs f d kvm_assign_device”等等(注:cscope命令缩写为cs,而fine缩写为f)。
在vim中,执行“:cs help”命令可以显示cscope的命令帮助手册。
ctags和cscope在Linux世界中是非常流行的,在Linux kernel中的Makefile就专门定义了“tags”和“cscope”这两个目标的,可以直接“make tags”生成tags文件,可以直接“make cscope”生成cscope索引文件,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@jay-linux linux.git]# make help | grep -E '(tags|cscope)' tags/TAGS - Generate tags file for editors cscope - Generate cscope index gtags - Generate GNU GLOBAL index [root@jay-linux linux.git]# make tags GEN tags [root@jay-linux linux.git]# ll tags -rw-r--r-- 1 root root 138602743 Oct 19 14:10 tags [root@jay-linux linux.git]# make cscope GEN cscope [root@jay-linux linux.git]# ll cscope.* -rw-r--r-- 1 root root 652930 Oct 19 14:10 cscope.files -rw-r--r-- 1 root root 267625646 Oct 19 14:11 cscope.out -rw-r--r-- 1 root root 53239808 Oct 19 14:11 cscope.out.in -rw-r--r-- 1 root root 384600480 Oct 19 14:11 cscope.out.po |
五. taglist的配置和使用
下载taglist压缩包,并解压,cp plugin/taglist.vim /usr/share/vim/vim72/plugin/ ; cp doc/taglist.txt /usr/share/vim/vim61/doc/
当然,如果仅对当前用户有效,则可以复制上面的文件到 $HOME/.vim/ 目录下。
启动vim,用 “:helptags .”来配置好帮助文件;重启vim,用“:TlistToggle”来打开和关闭taglist窗口(也可以用“:TlistOpen”命令打开并将输入焦点至于标签列表窗口,“:TlistClose”命令关闭标签列表窗口);可以用“:help taglist”来获得更多帮助信息。
另外,在左侧打开了标签列表窗口,可以用“ctrl-W + W”来进行源码窗口和标签窗口之间切换(其本质也是一个Vim的普通窗口)。
下图演示了一下VIM强大的C/C++程序代码编辑能力,动心了吗?马上开始使用VIM吧。
参考资料:
http://blog.chinaunix.net/u2/74761/showart_1096872.html
http://www.linuxsir.org/bbs/showthread.php?p=2095747#post2095747 (vim很强大功能的介绍)
http://linux.chinaunix.net/bbs/thread-1036769-1-1.html
http://blog.chinaunix.net/u/553/showart_288387.html
http://zhwen.org/?p=articles/cscope-tags
http://easwy.com/blog/archives/advanced-vim-skills-cscope/
http://blog.xuyu.org/?p=1147 (关于taglist)
=====================必不可少的实践=======================
不得不说ctag、cscope的强大。
下面总结一下遇到的问题:
1、E568: duplicate cscope database not added
这是因为有两处都 add cscope.out 了。
一处是 /etc/vimrc
另一出是 ~/.vim/plugin/cscope_maps.vim
参考:http://blog.chinaunix.net/uid-1877180-id-303357.html
other: easwy.com/blog/archives/vim-cscope-ctags/