ctags与cscope的区别: ctags是跳转到标签定义的地方,但是如果查找函数在哪里定义过或标签在哪里出现过那么ctags就无能为力了。这时就需要功能强大的cscope了。
如何查看有没有安装cscope:打开vim然后输入: cs show
如果显示:no cscope connections 则表示你装了cscope,只是没有添加cscope的数据库。
所以一般你要先建立自己的cscope的数据库:一般用find命令:
find . -name ”*.h” -o -name ”*.c” -o -name ”*.cc” > cscope.files
cscope -bkq -i cscope.files
以下是我在工作中常用到的,比如可执行程序由cleartool的make命令编译而成,那么用一下命令就可以找出这个程序要用到所有的相关文件:
c catcr -rec TEST | sed 's/^ *//g'| sed 's/^[0-9]*//g' | awk'(/\.c/||/\.C/||/\.cpp/||/\.h/||/\.inl/||/\.cc/||/\.CC/||/\.H/||/\.hpp/)&&\!/\.common/&&\!/\.HPUX/{print $1;}' | sed -e 's/@@\/[a-zA-Z\/_0-9\.\-]*//g' -e 's/@@[a-zA-Z\/_0-9\:\.\-]*//g'|sort -u > cscope.txt
cscope -bkq -i cscope.txt
在vim中使用cscope非常简单,首先启动vim,调用以下命令添加一个cscope数据库
:cs add cscope.out
这时你输入cs show则会显示你设置的cscope数据库
但是这种方法,每次打开一个文件就要设置一下,比较麻烦。
建议的使用方法
将下面的设定加入到你的 .vimrc 里 (根据你的情况调整文件路径): >
if has("cscope")
setcsprg=/usr/local/bin/cscope
set csto=1
set cst
setnocsverb
" addany database in current directory
iffilereadable("cscope.out")
cs add cscope.out
" elseadd database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
下表中列出了cscope的常用选项:
-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件时,不搜索/usr/include目录
-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用”–“,表示由标准输入获得文件列表。
-Idir: 在-I项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-Ppath: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。
:cs find g function_name //这个是用来找函数定义的地方
:cs find c function_name //这个是用来找函数调用的地方
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件
如果找到函数定义的地方如何在跳回原来的地方:
ctrl + t