vim + cscope

linux下使用 vim + cscope 查看代码

先备份一下,还没有弄好。

1. vim的准备
首先 vim --version | grpe cscope,看看vim是否支持cscope,如果不支持需要重新安装vim。最简单的是在./configure 后加上-enable-cscope,当然可以在Makefile文件(./src/Makefile)中修改(把原来的注释去掉),这是最根本的:
CONF_OPT_CSCOPE = --enable-cscope
然后安装:make && make install

2. cscope的准备
安装cscope(我的版本15.6),由于是非root用户,需要./configure --prefix=$HOME/local/cscope指可执行定文件和man文件的地址。

3. 生成所需的文件
前两样都具备了,现在可以在vim中用cscope来看代码了。怎么看?? 如同sourceingight一样,cscope需要一些数据文件(数据库&索引)来查找代码的相关关键字信息。
这些文件需要手工生成:
格式: cscope [options]
下面是cscope的常用选项:

现在进入代码的根目录然后:cscope -Rbq。这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。
cscope缺省只解析C文件(.c和.h)、lex文件(.l)和yacc文件(.y),虽然它也可以支持C++以及Java,但它在扫描目录时会跳
过C++及Java后缀的文件。如果你希望cscope解析C++或Java文件,需要把这些文件的名字和路径保存在一个名为cscope.files的文件。当cscope发现在当前目录中存在cscope.files时,就会为cscope.files中列出的所有文件生成索引数据库。
一般用如下命令生成包含cpp文件的cscope.files:
find ./ -name "*.h" -o -name "*.c" -o -name "*.cpp" > cscope.files
在cscope.files生成以后,就可以cscope -bq来得到索引(.out)文件了。

-R: 在生成索引文件时,搜索子目录树中的代码
-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,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

4. 在vim中使用cscope

在VIM中使用cscope非常简单,首先调用“cscope add”命令添加一个cscope数据库,然后就可以调用“cscope find”命令进行查找了。VIM支持8种cscope的查询功能,如下:例如,我们想在代码中查找调用work()函数的函数,我们可以输入:“:cs find c work”,回车后发现没有找到匹配的功能,可能并没有函数调用work()。我们再输入“:cs find s work”,查找这个符号出现的位置,现在vim列出了这个符号出现的所有位置。我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能。

s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文

可以看到,想查找一个关键词要输入不少命令,降低了效率,其实可以通过快捷键实现快速查找。下面是从网上找到的一个.vimrc中进行cscope选项和键盘映射的脚本段:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
       set csprg=/usr/bin/cscope
       set csto=1
       set cst
       set nocsverb
       " add any database in current directory
       if filereadable("cscope.out")
           cs add cscope.out
       endif
       set csverb
endif

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("<cfile>")<CR><CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

初次使用可能会觉得恨不适应,慢慢习惯了就好。在VIM的网站上有很多与cscope相关的插件:http://www.vim.org/scripts/script_search_results.php?keywords=cscope&script_type=&order_by=rating&direction=descending&search=search,还有cscope的主页:http://cscope.sourceforge.net/



Vim + Cscope打造Linux下的Source Insight

  Source Insight是Windows下最方便浏览代码的工具。但是Source Insight是没有Linux版本的。为了方便在Linux下浏览代码并进行学习,可以利用Vim配合Cscope来打造Linux下的Source Insight。

  Cscope是Vim适用的工具和插件,通过Cscope可以方便地获知某个函数的定义以及被哪些函数调用。

 

Cscope安装

  可以在http://cscope.sourceforge.net/下载源码包,然后解压,编译安装。

./configure

make

make install

 

生成Cscope数据库

  使用cscope前,必须为代码生成一个cscope数据库。假设当前代码在/usr/src/linux目录下,则运行下列命令。

cd /usr/src/linux

cscope –Rbq

  然后会生成3个文件:cscope.in.out,cscope.out,cscope.po.out。

  用vim打开代码文件,将刚才生成的cscope文件导入到vim中。

vim init/main.c

:cs add /usr/src/linux/cscope.out /usr/src/linux

  也可以将下面语句添加到vim的配置文件.vimrc中。

if fileradable("cscope.out")
    cs add csope.out
elseif $CSCOPE_DB  != ""
    cs add $CSCOPE_DB
endif

 

Cscope的功能

  Cscope的功能通过它的子命令“find”来实现。

cs find c|d|e|g|f|i|s|t name

  • s:查找C代码符号
  • g:查找本定义
  • d:查找本函数调用的函数
  • c:查找调用本函数的函数
  • t:查找本字符串
  • e:查找本egrep模式
  • f:查找本文件
  • i:查找包含本文件的文件

  可以在.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>

  使用时,将光标停留在要查找的对象上,按下<C-@>g,即先按“Ctrl+@”,然后很快再按“g”,将会查找该对象的定义。


linux下cscope的使用

在fcd的项目中,使用vim作为ide。那么cscope可以帮助vim扩展类似于函数、对象的查找、交叉引用查询等功能。

 

命令行为:

cscope -Rbkq 
生成当前目录下cscope.out文件信息,保存着交叉引用的信息。

 

vim中,cscoup使用:

cs add cscope.out

 

然后查找:

cs find s 要查找的名称

 

其中s处可以是:

0 或 s: 查找本 C 符号
1 或 g: 查找本定义
2 或 d: 查找本函数调用的函数
3 或 c: 查找调用本函数的函数
4 或 t: 查找本字符串
6 或 e: 查找本 egrep 模式
7 或 f: 查找本文件
8 或 i: 查找包含本文件的文件

 

Ctrl+] 跳转 Ctrl+t 跳回

gf 跳转入指定文件 Ctrl+o 跳转回来


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值