在上一篇博文 将Vim配置成为一款强大的编辑工具之 ctags的安装和使用 详细介绍了ctags的使用;在配合介绍一下cscope的安装和使用。
在使用cscope之前,要确认vim是否支持cscope,确认方式如下:
:version 查看cscope表之前是否有+号,有+号表示支持cscope,反之不支持
这里需要注意set csprg=~/bin/cscope 该行指定了cscope文件的位置;通常情况是不需要指定的。
"-- Cscope setting --
" 添加cscope数据库到当前vim
if has("cscope")
set csprg=~/bin/cscope " 指定用来执行cscope的命令
set csto=0 " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库
set cst " 同时搜索cscope数据库和标签文件
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口来显示cscope查找结果
set nocsverb
if filereadable("cscope.out") " 若当前目录下存在cscope数据库,添加该数据库到vim
cs add cscope.out
"elseif $CSCOPE_DB != "" " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
" cs add $CSCOPE_DB
endif
set csverb
endif
我们在添加这段配置文件之后,若出现了了如下错误:
我们需要将该配置文件注释掉,因为系统已经自动为我们添加了cscope的相关文件
通常情况,我们可以通过cscope的帮助信息查看cscope的使用方法;但是使用起来相当的不方便,当我们要搜索某个函数的时候需要手动的输入。例如:
查看aFunc() 函数调用了哪些函数需要输入:cs find c aFunc
cscope帮助信息:
cscope commands:
add : Add a new database (Usage: add file|dir [pre-path] [flags])
find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name)
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 this text string
help : Show this message (Usage: help)
kill : Kill a connection (Usage: kill #)
reset: Reinit all connections (Usage: reset)
show : Show connections (Usage: show)
我们可以使用键盘映射来解决这个问题,当要针对某个函数/变量进行搜索的时候,将光标移动到当前函数/变量上;在按下对应的按键即可。
添加按键映射;网上常见的映射是
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-@>s :scs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>g :scs find g <C-R>=expand("<cword>")<CR><CR>
将Ctrl +@或者Ctrl+\等按键映射起来;但是Ctrl+\按起来在按下sgc等。但是这样比较不方便。。
这里我参照cscope的帮助信息,做到见名知意的原则,进行如下映射:
nmap css :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap csg :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap csc :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap cst :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap cse :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap csf :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap csi :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap csd :cs find d <C-R>=expand("<cword>")<CR><CR>
同事设置按键的timeout信息,这里设置为3s
set timeoutlen=3000
详细的信息可以参考http://blog.csdn.net/peng_cao/article/details/48522383#高效的ctags使用方法
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -L ${OUT_PATH}/names.file -f ${OUT_PATH}/tags
echo "for create cscope databases.."
cscope -Rbq -i names.file
csc –> 搜索哪里调用getWebViewPackageName()这个函数
csd –> 搜索getWebViewPackageName这个函数调用了哪些函数!
cst –> 搜索getWebViewPackageName这个字符串