Cygwin下cscope的配置

来源:互联网 发布:燃气管道绘图软件 编辑:程序博客网 时间:2024/05/17 08:17

法1  使用mlcscope


vim当中默认使用cs或者cscope命令

但是cygwin当中的cscope不是使用cscope调用的,而是mlcscope

所以查看本地是否有mlcscope,如有则做软链接

ls /usr/bin/mlcscope

ln -s /usr/bin/mlcscope /usr/bin/cscope

ls /usr/bin/cscope

(如果没有则在Cygwin安装管理器中安装  vim   cscope  ctags,再做软链接)

 

cygwin上使用vim+cscope+ctags阅读源码 
From: http://blog.csdn.net/linwhwylb/article/details/6526637

1.需要安装的东西

vim

cscope

ctags

在cygwin更新管理中输入上面三个关键词进行搜索即可。

 

vim当中默认是使用cs或者cscope命令的,但是cygwin当中的cscope不是使用cscope调用的,而是mlcscope。

创建一个软连接即可。

$ ln -s /usr/bin/mlcscope /usr/bin/cscope

 

进入到源码的目录,执行下面的命令

$ cscope

$ ctags *

生成cscope.out以及tags文件,进入vim,然后执行:cs add cscope.out即可,接下来就可以使用:cs find g 符号

之类的命令进行符号定义搜索了。Ctrl + T返回,Ctrl + ]跳转到目标定义处。



法2 使用cscope for win32 

From: http://www.vimer.cn/2009/10/%E5%9C%A8vimgvim%E4%B8%AD%E4%BD%BF%E7%94%A8cscope.html


vim --version | grep cscope确保vim支持cscope 

不支持的话要重新编译vim,加上支持选项:

--enable-cscope


下载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 <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>:copen<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>:copen<CR>
nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>:copen<CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>:copen<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>:copen<CR>

实际上就是参考 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优先扫描。



 

Tips:

1  windows下的cscope需要设置TMPDIR的环境变量,否则不能cscope -b

2  cscope.files尽量用find生成,应该个人需求不同,譬如.svn不索引,.cxx不索引等等

3  如果生成了cscope.out 但是在其他目录中直接cs add,会不能jump。

   解决方法是加上pre-dir    

    cscope add   PATH1/cscope.out   PATH2
     其中PATH1是cscope.out的pathPATH2是当前目录下可以正确jump到索引处的pre-path



常规的cscope 使用方法:

进入到源码的目录

cscope -Rbq

生成cscope.out以及tags文件 cscope.out, cscope.in.out, cscope.po.out

其中cscope.out是基本的符号索引

后两个文件是使用”-q“选项生成的,可以加快cscope的索引速度

进入vim,然后执行:cs add cscope.out

接下来就可以使用cscope

cscope add 'PATH'    (注意 PATH要加引号 否则在vimrc中可能会报错)

同时可以在vimrc中设立键位绑定



cscope
的常用选项:

-R: 在生成索引文件时,搜索子目录树中的代码(递归搜索)

-b: 只生成索引文件,不进入cscope的界面

-q: 生成cscope.in.outcscope.po.out文件,加快cscope的索引速度

-k: 在生成索引文件时,不搜索/usr/include目录

-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用”-“,表示由标准输入获得文件列表。

-Idir-I选项指出的目录中查找头文件

-u: 扫描所有文件,重新生成交叉索引文件

-C: 在搜索时忽略大小写

-Ppath以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。