vim、ctags、cscope配置及使用

windows下流行的源码阅读软件是source insight,而linux则没有与其可匹敌图形化的源码阅读软件,现在日趋流行的eclipse开发软件,虽然可以较好的支持源码中符号之间相互跳转,但总体感觉不是十分强大和好用,可能因为eclipse是通过cdt插件的形式来支持c/c++项目,很多方面表现还有待提高。而且eclipse在终端下无法使用,而今天的主角vim+ctags+cscope可谓是无所不能,真真的强大之极。下面是关于这个组合配置和使用的简单介绍,更多的功能可以日后慢慢摸索。


组合介绍

vim是linux超强的文本编辑器。

ctags对源代码文件扫描生成交叉引用符号表,支持大多数主流语言,但相对功能简单,配合vim可以实现从变量和函数的调用点到定义点的跳转。

cscope可以理解为ctags的加强版,但支持语言的种类要少一些,完全支持c语言。它生成的源码符号引用表更加复杂,配合vim可以实现符号各引用点之间任意切换(比如从函数调用点到定义点,从定义点到调用点等)。

关于更多的vim,ctags和cscope的知识可以去它们的官网,也可以查看man手册了解一些基本的使用信息和帮助。

一、准备

1、下周地址vim ctags 在chinaunix下载
2、cscope在sourceforge.net中下载
3、下载后解压安装./configure;make;make install

二、配置

vim

为了使vim更好支持浏览和编写程序代码,可以启用一些默认没有启用vim的扩展功能,如显示行号,代码自动缩进等。

#vim /etc/vimrc

#增加此行默认将开启vim行号显示功能

set number
set sw=4
#自动缩进的时候, 缩进尺寸为 4 个空格。
set ts=4
#Tab 宽度为 4 个字符。
set sm
#显示括号配对情况。 打开这个选项后, 当输入后括号 (包括小括号、中括号、大括号) 的时候, 光标会跳回前括号片刻, 然后跳回来, 以此显示括号的配对情况。
set cin
#打开 C/C++ 风格的自动缩进。 打开了自动缩进后, 在编码的时候我们可以使用“V”命令选中一段文本后, 按“=”将这段文本重新调整缩进格式, 在一定程度上起到代码美化的作用。
#在粘贴的时候把所有自动缩进都关闭, 粘贴完毕之后再打开。 一个个手工关闭自动缩进未免过于繁琐, vim 为我们提供了一个很好用的命令,只要输入“:set paste”, 就可以关闭所有自动缩进。 粘贴完毕后再输入“:set nopaste”就可以重新打开原有的自动缩进设置了。



cscope

cscope需要一个配置文件才能和vim一起工作,在下面这个地址可以找到一份cscope官方的目标配置文件,下载或者拷贝该文件至/usr/share/vim/vimxx/plugin/目录。

cscope配置文件:http://vdisk.weibo.com/s/L9oeu


到此一个基于vim的源码阅读环境已经配置完成。


三、使用

现在你可以进入一个源码目录做一个测试,

进入源码项目根目录运行下面命令建符号立交叉引用文件:

#ctags -R . && cscope -Rqbk

命令成功执行后将在当前目录下生成四个文件,分别为cscope.in.out、cscope.out、cscope.po.out和tags,他们是ctags和cscope生成的索引文件。

如何使用这个功能,其实这个得看你有什么需求了,下面举例两个应用例子:

1 把编辑器定位到项目源码中main函数开始的位置上,操作如下:

#vim -t main

2 当前vim编辑器中,光标指在read函数上,这是该函数的一个调用,我相要查看它的定义:

操作:把光标定位到read上后,可以直接通过快键Ctrl+]实现跳转,Ctrl+t返回。

注:如上事例操作的前提是操作目录须和上面提到的4个索引文件所在的目录为同一目录。

推荐:把生成索引文件的命令写入一个脚本文件并放到/bin/目录,这样以后就可以通过运行该脚本便捷快速的生成项目源码文件的索引文件。


出错解决

再存在索引文件的目录运行vim时,程序提示添加了cscope数据库cscope.out,按回车可以确认。如果再此步中出现载入重复的数据库错误,那是因为vimrc文件和cscope.vim配置文件中出现两次重复的载入操作,可以通过修改vimrc(或者cscope.vim)文件修正,如下:

#vim /etc/vimrc

...

38 " add any database in current directory

39 if filereadable("cscope.out")

40 "cs add cscope.out

41 " else add database pointed to by environment

42 elseif $CSCOPE_DB != ""

43 " cs add $CSCOPE_DB

44 endif

可以像如下一样使用双引号注释掉40行和43行,甚至可以直接删除38到43行的代码,此段代码在cscope.vim文件中有一份完整的拷贝。


四、Cscope快键解析

在vim中cscope的功能可以通过一些快键操作实现,这些快键定义在cscope.vim配置文件中

查看该文件内容:

#vim /usr/share/vim/vimxx/plugin/cscope.vim

....

99 nmap <F5>s :cs find s <C-R>=expand("<cword>")<CR><CR>

100 nmap <F5>g :cs find g <C-R>=expand("<cword>")<CR><CR>

101 nmap <F5>c :cs find c <C-R>=expand("<cword>")<CR><CR>

102 nmap <F5>t :cs find t <C-R>=expand("<cword>")<CR><CR>

103 nmap <F5>e :cs find e <C-R>=expand("<cword>")<CR><CR>

104 nmap <F5>f :cs find f <C-R>=expand("<cfile>")<CR><CR>

105 nmap <F5>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>

106 nmap <F5>d :cs find d <C-R>=expand("<cword>")<CR><CR>

....

快捷配置行解析,nmap表示定义vim非编辑模式下快键关键字,<F5>s表示快键组合F5加s键,cs find c 表示前定义快键等效的命令组合,再后面的内容是实现快键发生时传递vim中当前光标所在的字符内容。cscope配置中默认的快键主键是Ctrl+/,但这组快键组合在我的机器却无法工作,所以我把默认组合键主键都换成了F5,如果你的情况类似,也可以仿照次方式另设一个主键。再运行的vim中如果想查看设置的快键是否生效,可以通过命令查询,如输入:nmap回车可以查看当前vim中已设置的所有非编辑模式下的快键。

下面是一条查找函数所有调用点的操作事例(已上面配置文件为例):

如果你想查询read函数的所有调用点,移动光标到read单词上,按F5+s快键组合后,将会在vim编辑界面的下部列出所有read符号引用条目。


s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文
使用cscope查找do_fork函数的定义:
在vim命令行下执行:

:cs f g do_fork

补充:

在~/.vimrc中增加如下两行:

 

filetype plugin indent on

set completeopt=longest,menu

 

打开文件检测和智能补全,并关闭智能补全时的预览窗口。

 

这样在结构体等,进行insert进行编辑时,将光标放到 "->"后,按下Ctrl+X CTRL-O 会弹出一个下拉菜单,

 

此时一些可用的快捷键:

 

Ctrl+P 向前切换成员
Ctrl+N 向后切换成员
Ctrl+E 表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y 表示退出下拉窗口, 并接受当前选项


如果你增加了一些成员变量, 全能补全还不能马上将新成员补全, 需要你重新生成一下tags文件, 但是你不用重启vim, 只是重新生成一下tags文件就行了, 这时全能补全已经可以自动补全了。

vim中的其他补全方式还有:

Ctrl+X Ctrl+L 整行补全
Ctrl+X Ctrl+N 根据当前文件里关键字补全
Ctrl+X Ctrl+K 根据字典补全
Ctrl+X Ctrl+T 根据同义词字典补全
Ctrl+X Ctrl+I 根据头文件内关键字补全
Ctrl+X Ctrl+] 根据标签补全
Ctrl+X Ctrl+F 补全文件名
Ctrl+X Ctrl+D 补全宏定义
Ctrl+X Ctrl+V 补全vim命令
Ctrl+X Ctrl+U 用户自定义补全方式
Ctrl+X Ctrl+S 拼写建议

你可能感兴趣的:(vim、ctags、cscope配置及使用)