法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 + ]跳转到目标定义处。
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(windows): http://sourceforge.net/projects/mslk/files/
最后把cscope放进环境变量
搭建好了vim+cscope的环境之后,那么现在就是我们学习怎么用的时候了
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中,具体每个命令意义如下:
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
这个命令就是csope在生成数据库,你会发现生成了一个cscope.out的文件,这个就是生成数据库,实际上如果加上参数-q来加快索引速度的话,还会生成cscope.in.out, cscope.po.out这两个文件,各个参数意义如下:
-b : 默认情况下,cscope在生成数据库后,会进入cscope自己的界面,我们在vim中使用他,当然不希望有这样的界面,就可以用-b来屏蔽掉。
最后这一步,就是在vim中添加了cscope.out这个数据库。
下面列出cscope的常用生成数据库选项:
-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中怎么使用呢?
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-@>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中配置了一段代码:
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.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件时,不搜索/usr/include目录
-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用”-“,表示由标准输入获得文件列表。
-Idir: 在-I选项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-Ppath: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。