vim中cscope工具安装与使用

本文详细介绍了如何在Vim编辑器中利用Cscope进行代码索引和快速跳转,包括安装配置、索引文件创建、常用查询命令及解决常见问题,提升代码导航效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:
Cscope是类似于ctags一样的工具,但可以认为她是ctags的增强版,因为她比ctags能够做更多的事。在Vim中,通过cscope的查询,跳转到指定的地方就像跳转到任何标签;她能够保存标签栈,所以通过合适的键盘映射绑定,你能够在函数向后或向前跳转,就像通常使用的tags一样。


1 安装
yum -y install cscope  


2 添加需要索引的文件(*.php,*.js,*.css.*.sh)
$ cd /home/test/myWork
$ find /home/test/myWork -name "*.js" -o -name "*.sh" -o -name "*.php"   > /home/test/myWork/cscope.files


3 建立索引文件(会生成cscope.out文件)


$ cd /home/test/myWork
$ cscope -b 


4 使用


4.1 手动加载cscope.out库
:cs add /home/test/myWork/cscope.out


4.2 ~/.vimrc中加载
$ vim ~/.vimrc


if has("cscope") && filereadable("/usr/bin/cscope")
   set csprg=/usr/bin/cscope
   set csto=0
   set cst 
   set nocsverb
   " add any database in current directory
   if filereadable("/home/test/myWork/cscope.out")
      cs add /home/test/myWork/cscope.out
   endif
endif


4.3 查看库
:cs show


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


6 跳转
 Ctrl+] 将跳到光标所在变量或函数的定义处 
 Ctrl+T 返回
 
:set csto=0
‘csto’的值决定了|:cstag|执行查找的顺序。假如’csto’被设置为0,那么cscope数据将会被优先查找,假如cscope没有返回匹配项,然后才会查找tag文件。反之,则查找顺序相反。默认值是0。

7 cscope查询技巧
有时候cscope查询的结构非常多。可以使用:cs f e ---- 查找egrep模式。进行筛选。

7.1 查询类文件。正则匹配 class Mytest。
:cs f e class Mytest

正则表达式为:class Mytest。会搜索包含class Mytest的文件。

7.2 查询函数。正则匹配 n addUser。
:cs f e n addUser

正则表达式为:n addUser。会搜索包含n addUser的文件。

 

使用cscope碰到的问题

1. E568: duplicate cscope database not added

根据提示,cscope数据库重复添加了,我使用的是vim7.2版本,而这个版本在已经支持cscope,并在它的配置文件中开启了cscope功能

$ vi /etc/vimrc 

32 if has("cscope") && filereadable("/usr/bin/cscope")

33    set csprg=/usr/bin/cscope

34    set csto=0

35    set cst

36    set nocsverb

37    " add any database in current directory

38    if filereadable("cscope.out")

39       cs add cscope.out

40    " else add database pointed to by environment

41    elseif $CSCOPE_DB != ""

42       cs add $CSCOPE_DB

43    endif

44    set csverb

45 endif

然后,我们给vim添加了一个插件,cscope_maps.vim, 这个文件主要作用是作一些快捷键映射,免去了输入命令的麻烦,但文件一直没有更新,里面只提及vim7以下的配置方法,在里面有如上所示相同的代码,所以导致了重复添加数据库的冲突

$ vi ~/.vim/plugin/cscope_maps.vim 

1

2

3

4

5

6

7

40     " add any cscope database in current directory

41     if filereadable("cscope.out")

42         cs add cscope.out 

43     " else add the database pointed to by environment variable

44     elseif $CSCOPE_DB != ""

45         cs add $CSCOPE_DB

46     endif

解决冲突的方法很简单,注释掉这些行便可以了

 

 

 

#!/bin/sh
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
find ./ -name "*.h" -o -name "*.c" -o -name "*.cc" -o -name "*.cpp" > cscope.files
cscope -bkq -i cscope.files
ctags -R


这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。
其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。
这个脚本,首先使用find命令,查找当前目录及子目录中所有后缀名为".h", ".c"和".c"的文件,并把查找结果重定向到文件cscope.files中。然后cscope根据cscope.files中的所有文件,生成符号索引文件。最后一条命令使用ctags命令,生成一个tags文件,在vim中执行":help tags"命令查询它的用法。它可以和cscope一起使用。上面所用到的命令参数,含义如下:
-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件时,不搜索/usr/include目录
-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用“-”,表示由标准输入获得文件列表。
-I dir: 在-I选项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

 

 

2. 在源码根目录下打开任意.c文件,使用如下命令:
1. Ctrl+]将跳到光标所在变量或函数的定义处 Ctrl+T返回
2. :cs find s ---- 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
:cs find g ---- 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
:cs find d ---- 查找本函数调用的函数
:cs find c ---- 查找调用本函数的函数
:cs find t: ---- 查找指定的字符串
:cs find e ---- 查找egrep模式,相当于egrep功能,但查找速度快多了
:cs find f ---- 查找并打开文件,类似vim的find功能
:cs find i ---- 查找包含本文件的文
3. 2的所以命令也可以且按銉来实现:
1. Ctrl+\\ 再按 s 表示:cs find s命令
2. 同理实现cs find + g,d,c,t,e,f,i命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值