1.cscope简介
cscope是加强版的ctags,不仅支持变量/函数的定义查询,还记录了函数的调用/查询等功能,有说其诞生是为了取代ctags,但是无从考究,直觉的好用就可以了
它被设计用来回答以下的问题: 49 什么地方用到了这个符号?---------------symbol 50 这是在什么地方定义的?-----------------definition 51 这个变量在哪里被赋值? 52 这个全局符号的定义在哪里? 53 这个函数在源文件中的哪个地方? 54 哪些函数调用了这个函数?---------------call 55 这个函数调用了哪些函数?--------------- 56 信息 "out of space" 从哪来? 57 这个源文件在整个目录结构中处于什么位置? 58 哪些文件包含这个头文件?
2.cscope使用
1.建立cscope索引目录:
原理跟ctags是类似的,可以说cscope>ctags,同样是生成一个数据库,这个可以直接进入工程项目(假如在VIM74的源码中)的根目录执行
cscope -Rbq 执行该命令以后会生从三个文件 -rw-rw-r-- 1 thinkpad thinkpad 958464 2月 12 22:50 cscope.in.out -rw-rw-r-- 1 thinkpad thinkpad 7618461 2月 12 22:50 cscope.out -rw-rw-r-- 1 thinkpad thinkpad 5977128 2月 12 22:50 cscope.po.out 2.在源码根目录下打开任意文件,使用下面的命令:(在这里说一下为何是根目录下,打开文件(即.c等文件),因为cscope在根目录下面生有的索引目录,子菜单无法实现检索,如果你在子菜单进行下面的命令,都会提示cscope无法连接。)
thinkpad@thinkpad:cd ~/Files/vim74/src && vi main.c如此打开,然后运行:cs find g vim_main2 结果如下E567:没有cscope连接
thinkpad@thinkpad:cd ~/Files/vim74 && vi src/main.c正确连接
: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 ----查找包含本文件的文
映射如下:
:set cscopequickfix=s-,c-,d-,i-,t-,e-
3.vimrc如下设置
"config cscope
44 if has("cscope")
45 set csprg=/usr/bin/cscope
46 set csto=1
47 set cst
48 set nocsverb
49 " add any database in current directory
50 if filereadable("cscope.out")
51 cs add cscope.out
52 endif
53 set csverb
54 endif
55 :set cscopequickfix=s-,c-,d-,i-,t-,e-
56 nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>
57 nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>
58 nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>
59 nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>
60 nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR>
61 nmap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
62 nmap <C-\>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
63 nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>