在Vim(gvim)中使用cscope

之前已经详细的介绍了在vim中使用ctags,这篇文章我们就来详细介绍一下如何在vim中使用cscope。
首先,我们还是了解一下什么是cscope。简单来讲,cscope主要用来协助浏览C/C++语言,他的功能要强大于ctags,不仅支持变量/函数的定义查询,还记录了函数的调用处查询等功能,所以也有说法称cscope的诞生就是为了取代ctags。无论这个说法是否有据可依,对使用方来说,当然是希望功能越强大方便越好啦,所以这也是我们为什么讲ctags和cscope都装上的原因啦。

第二,我们来说一下vim的支持。cscope没有ctags那么幸运,cscope在大部分的linux下的vim中是没有提供支持的(但是在windows下的gvim都提供了支持),所以,如果你打算要在linux下面使用vim+cscope,那么1,你要下载安装cscope。2,你要重新编译vim,加上支持选项:
--enable-cscope
当然,cscope也提供了windows版(否则windows下gvim怎么和cscope搭配嘛……),分别下载地址如下:
cscope(linux):
http://cscope.sourceforge.net/
cscope(windows):http://sourceforge.net/projects/mslk/files/

当然,安装的最后一步就是,不要忘记讲cscope放进的环境变量里!

第三,好了,假设你已经搭建好了vim+cscope的环境,那么现在就是我们学习怎么用的时候了

function Do_CsTag()
    if(executable('cscope') && has("cscope") )
        if(g:iswindows!=1)
            silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -o -name '*.java' -o -name '*.cs' > cscope.files"
        else
            silent! execute "!dir /b *.c,*.cpp,*.h,*.java,*.cs >> cscope.files"
        endif
        silent! execute "!cscope -b"
        if filereadable("cscope.out")
            execute "cs add cscope.out"
        endif
    endif
endf

调用这个函数就可以用cscope生成数据库,并添加到vim中,具体每个命令意义如下:

if(g:iswindows!=1)
    silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -o -name '*.java' -o -name '*.cs' > cscope.files"
else
    silent! execute "!dir /s/b *.c,*.cpp,*.h,*.java,*.cs > cscope.files"
endif

上面的函数,通过操作系统的不同,用不同的命令实现,将当前目录的源码文件导入到一个叫做cscope.files的文件中。这个文件是cscope用来生成数据库时的默认存储文件列表的文件。
不理解dir命令?看看这篇文章吧

http://hi.baidu.com/moodmusic/blog/item/888856ed309605d7b21cb141.html

silent! execute "!cscope -b"

这个命令就是csope在生成数据库,你会发现生成了一个cscope.out的文件,这个就是生成数据库,实际上如果加上参数-q来加快索引速度的话,还会生成cscope.in.out, cscope.po.out这两个文件,各个参数意义如下:
-b : 默认情况下,cscope在生成数据库后,会进入cscope自己的界面,我们在vim中使用他,当然不希望有这样的界面,就可以用-b来屏蔽掉。

execute "cs add cscope.out"

最后这一步,就是在vim中添加了cscope.out这个数据库。

下面列出cscope的常用生成数据库选项:

-R: 在生成索引文件时,搜索子目录树中的代码,因为我们已经在cscope.files中把所有的文件都打印入了列表中,所以
-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,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

好了,到了这里,cscope的原理大家应该都清楚了,那么在vim中怎么使用呢?

"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
0 或 s    查找本 C 符号(可以跳过注释)
1 或 g    查找本定义
2 或 d    查找本函数调用的函数
3 或 c    查找调用本函数的函数
4 或 t    查找本字符串
6 或 e    查找本 egrep 模式
7 或 f    查找本文件
8 或 i    查找包含本文件的文件

但是谁也不想敲这么多命令吧,所以我在vimrc中建了这样一个映射:

nmap s :cs find s =expand(""):copen
nmap g :cs find g =expand("")
nmap c :cs find c =expand(""):copen
nmap t :cs find t =expand(""):copen
nmap e :cs find e =expand(""):copen
nmap f :cs find f =expand(""):copen
nmap i :cs find i ^=expand("")$:copen
nmap d :cs find d =expand(""):copen

实际上就是参考 cscope_maps.vim 这个文件,大家可以去下载他,然后直接放到plugin目录就行。

最后,我们来说一下cscope和ctags的兼容问题。我在vimrc中配置了一段代码:

if has("cscope")
    set cscopequickfix=s-,c-,d-,i-,t-,e-
    set csto=0
    set cst
    set csverb
endif

官方解释如下:
http://vimcdoc.sourceforge.net/doc/if_cscop.html
简单来说,主要功能就是同时搜索ctags和cscope的标签,并且cscope优先扫描。

好啦,在vim(gvim)中使用cscope的介绍就到这里啦,有兴趣的朋友可以赶紧试一下啦~~

转载自Vimer的程序世界 [ http://www.vimer.cn ]

原文链接地址: http://www.vimer.cn/2009/10/%e5%9c%a8vimgvim%e4%b8%ad%e4%bd%bf%e7%94%a8cscope.html

你可能感兴趣的:(在Vim(gvim)中使用cscope)