cscope
安装
原谅我的懒惰
sudo apt-get install cscope
使用
1. 先建立数据库
相当于source insight(之后简称为SI)的同步
转到目录里面 cscope -Rbq
参数解释:
R recursively
b 只建立数据库(cscope.out),不进入cscope
q 建立数据库的同时,同时建立加速文件,使用这个选项,会在当前目录下产生多个cscope的文件
k 不分析/usr/include下面的文件,用户态程序一定不要加上这个符号,否则没法知道这个函数到底是不是一个系统库函数
-b Build the cross-reference only.
-C Ignore letter case when searching.
-c Use only ASCII characters in the cross-ref file (don't compress).
-d Do not update the cross-reference.
-e Suppress the <Ctrl>-e command prompt between files.
-F symfile Read symbol reference lines from symfile.
-f reffile Use reffile as cross-ref file name instead of cscope.out.
-h This help screen.
-I incdir Look in incdir for any #include files.
-i namefile Browse through files listed in namefile, instead of cscope.files
-k Kernel Mode - don't use /usr/include for #include files.
-L Do a single search with line-oriented output.
-l Line-oriented interface.
-num pattern Go to input field num (counting from 0) and find pattern.
-P path Prepend path to relative file names in pre-built cross-ref file.
-p n Display the last n file path components.
-q Build an inverted index for quick symbol searching.
-R Recurse directories for files.
-s dir Look in dir for additional source files.
-T Use only the first eight characters to match against C symbols.
-U Check file time stamps.
-u Unconditionally build the cross-reference file.
-v Be more verbose in line mode.
-V Print the version number.
TIPS:
建立完毕数据库之后,如果在当前目录再次执行cscope,会使得重新建立数据库,除非两次执行cscope的参数一致!
2. 直接使用使用cscope
当前目录下执行cscope -Rq(k) 不加-b 参数即可进入cscope
3. vim下使用cscope
3.1 vim中添加cscope数据库文件
cs add /path/to/cscope.out [prepend path ] -C
-C 指的是查找的时候忽略大消息
[prepend path] 作用不确定
cs show
可以查看已经加入的数据库文件
cs kill
删除一个数据库
3.2 vim中搜索符号
cs find * symbol
等同于 cs f g symbol
查找symbol,
其中 * 可以是一下选项之一:
c: Find functions calling this function
d: Find functions called by this function
e: Find this egrep pattern
f: Find this file
g: Find this definition
i: Find files #including this file
s: Find this C symbol
t: Find assignments to
3.3 vim中使用快捷键
如果每次我没都输入"cs f g symbol",岂不是会累死?
cscope能不能像SI那样 ctrl + 鼠标左键 直接到达符号定义的地方?
cscope提供了一组快捷键,将下面的配置写入~/.vimrc文件下就可以了
nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>f :cs find f <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cword>")<CR>$<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>
使用上面的快捷键的方法是,将光标定位到你要查找的变量,函数名或者宏定义名处。先按下Ctrl+@
,松开后快速按下相应的键,比如按下g,表示查找该函数或者变量的定义;按下c表示查找本函数被调用的地方。功能很强大。
3.4 vim中的跳转
ctrl+]
:在函数调用的地方跳转到函数定义的地方
ctrl+t
:返回上一个查找的地方
3.5 cscope的vim建议配置
if has("cscope")
set csprg=/usr/local/bin/cscope
set csto=0
"find cscope db prior
set cst
" use cstags
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
这里面有很多vim的技巧
http://easwy.com/blog/archives/automatically_update_ctags_tag_cscope_database/
在 vim 中使用 cscope 时, : cs f s symbol-name 或相应的快捷键执行后当前窗口就跳转到引用该符号的位置。
如果想跳转的同时打开一个新的窗口,可以使用如下命令:
: scs f s symbol-name
这里的 scs 应该是 split 的意思。
另外,上面这个命令是将窗口横向分割,如果要纵向分割的话,可以使用如下命令:
: vert scs f s symbol-name
另外可以在 .vimrc 里追加对应的快捷键:
参考 help cscope: