您的位置:首页 > 运维架构 > Linux

转 Linux C语言开发平台 VIM+CSCOPE+CTAGS

2009-07-16 17:06 330 查看
Linux C语言开发平台 VIM+CSCOPE+CTAGS

(转自 : http://blog.csdn.net/petsatan/archive/2007/12/02/1911447.aspx)

usage: $ctags [-R] inc_dir/*.h include_dir/*.hpp src_dir/*.c
example: $ ctags -R `find . -name "*.c"` `find . -name "*.h"`
su; cd /usr/include; ctags --c-types=+p+x -sort -R
生成非常完整,巨大而有序的tags

各用户在 ~/.vimrc中添加set tags= ./tags, tags, /usr/include/tags即可使用
[注1]+p开关会跳到变量声明的地方而不是它的实现,所以还是采用缺省值,
不要--c-types这个选项,或者只要+x(推荐),其它无所谓。
还有/usr/include并不是/usr/src/linux/include的一个符号链接,
所以如果是看内核中一些变量的定义的话应该到/usr/src/linux上面用ctags

ctags浏览代码 (有的命令说明可能不准确)
:set tags=/Dir/tags 设置需要的tags文件,
可以多个:set tags=/dir1/tags, /dir2/tags
:tag xxx 转到满足查找代码的定义处,简写为 :ta xxx
:tag /^xxx 转到以xxx为起始的tag处
other find tags :stag/ptag/ts/tj/pts/ptj /<pat>
:tag /xxx 列出所有包含xxx的tag
:tag 转到前一个浏览过的tag处
vi -t xxx 直接定位到xxx的定义处
:tn / :tp 转到下/上一个tag代码处,可以使用:5tn的形式
:tr / :tl 转到首/尾tag代码处
<C-]>, <C-左键> 转到光标所在函数或者变量的定义处 g+左键 (GUI) [注2]
<C-T>, <C-右键> 回到跳转前的代码处(适用于任何跳转) g+右键 (GUI)
:tags 列出当前tag栈的内容
:ts xxx 列出所有匹配的代码及其所属文件,并提供选择浏览
:sts xxx 列出匹配处提供选择在新窗口中打开文件
:tj xxx 类似 :ts xxx,当只有一个匹配时直接转到代码处
g] 与 :ts xxx 功能相同(tag为光标下的标识符)
<C-w> g] 等价于 :sts xxx
g <C-]> 等价于 :tj xxx
:pt? xxx 提供上述命令(?为j,s)的预览功能,退出窗口 :q!
:t?! xxx 当前文件的修改被丢弃转到目标文件中
<C-w> } 在预览窗口中显示当前光标下的tag
:ptl / ptf / ptn /ptp 类似于 tl,tf,tn,tp
:che 察看没有找到的头文件(checkpath)
makeprg :set makeprg=gcc/ yourfile.c 为在线编译设置
:make 在线编译
:cn / :cN 移动到编译的 下/上 一个error处
:stag xxx 查找xxx的声明处并在新窗口中打开
:ta {ident} 跳转到标识符定义处
gd 跳转到局部标识符定义处

[注2] Ctrl-]碰巧是telnet的终端符,如果远程编辑文件可能会遇到一些问题,
请参考在线帮助:h ^]。多数telnet都允许使用命令telnet -E hostname来打开
或关闭该脱字符,或者用telnet -e escape hostname来指定另外一个脱字符
来代替^],请man telnet参看-E -e的帮助。

本节所用命令的帮助入口:

在前面的文章中介绍了利用ctags生成的tag文件,跳转到标签定义的地方。但如果想查找函数在哪里被调用,或者标签在哪些地方出现过,ctags就无能为力了,这时需要使用更为强大的cscope。

Cscope具有纯正的Unix血统,它最早是由贝尔实验室为PDP-11计算机开发的,后来成为商用的AT&T Unix发行版的组成部分。直到2000年4月,这个工具才由SCO公司以BSD license开源发行。

Cscope的主页在http://cscope.sourceforge.net/,如果你的计算机上没有cscope,你可以在此处下载它,在写本文时,它的最新版本是15.6。安装它非常简单,你只需要在cscope的源代码目录中执行下面三条命令:

在windows上也可以使用cscope,在cscope的主页上可以下载到由DJGPP编译器编译的windows版的cscope,不过这个版本不能和VIM一起工作。或者你可以下载cygwin工具包(http://www.cygwin.com/),这个工具包中也包含了cscope。

http://iamphet.nm.ru/cscope/有Sergey Khorev预编译的一个Win32版本的cscope,这个版本的cscope可以很好的与windows版本的VIM搭配使用。

要使用cscope的强大功能,首先需要为你的代码生成一个cscope数据库。生成数据库很简单,在你的项目根目录运行下面的命令:

这些选项的含义见后面。这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。

在缺省情况下,cscope在生成数据库后就会进入它自己的查询界面,我们一般不用这个界面,所以使用了“-b”选项。如果你已经进入了这个界面,按CTRL-D退出。

Cscope在生成数据库中,在你的项目目录中未找到的头文件,会自动到/usr/include目录中查找。如果你想阻止它这样做,使用“-k”选项。

Cscope缺省只解析C文件(.c和.h)、lex文件(.l)和yacc文件(.y),虽然它也可以支持C++以及Java,但它在扫描目录时会跳过C++及Java后缀的文件。如果你希望cscope解析C++或Java文件,需要把这些文件的名字和路径保存在一个名为cscope.files的文件。当cscope发现在当前目录中存在cscope.files时,就会为cscope.files中列出的所有文件生成索引数据库。通常我们使用find来生成cscope.files文件,仍以VIM 7.0的源代码为例:

这条命令把~src/vim70目录下的所有普通文件都加入了cscope.files,这样,cscope会解析该目录下的每一个文件。上面的cscope命令并没有使用“-R”参数,因为在cscope.files中已经包含了子目录中的文件。

注意:find命令输出的文件以相对路径表示,所以cscope.out的索引也相对于当前路径。如果你要在其它路径中使用当前的cscope.out,需要使用下面介绍的-P选项。

Cscope只在第一次解析时扫描全部文件,以后再调用cscope,它只扫描那些改动过的文件,这大大提高了cscope生成索引的速度。

下表中列出了cscope的常用选项:

要在VIM中使用cscope的功能,需要在编译VIM时选择“+cscope”。VIM的cscope接口先会调用cscope的命令行接口,然后分析其输出结果找到匹配处显示给用户。

在VIM中使用cscope非常简单,首先调用“cscope add”命令添加一个cscope数据库,然后就可以调用“cscope find”命令进行查找了。VIM支持8种cscope的查询功能,如下:

例如,我们想在VIM 7.0的源代码中查找调用do_cscope()函数的函数,我们可以输入:“:cs find c do_cscope”,回车后发现没有找到匹配的功能,可能并没有函数调用do_cscope()。我们再输入“:cs find s do_cscope”,查找这个C符号出现的位置,现在VIM列出了这个符号出现的所有位置。

我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能,但它是在交叉索引数据库中查找,速度要快得多。

VIM提供了一些选项可以调整它的cscope功能:

<!--[if !supportLists]-->- <!--[endif]-->cscopeprg选项用于设置cscope程序的位置。

<!--[if !supportLists]-->- <!--[endif]-->cscopequickfix设定是否使用quickfix窗口来显示cscope的结果,详情请“:help cscopequickfix”;

<!--[if !supportLists]-->- <!--[endif]-->如果你想VIM同时搜索tag文件以及cscope数据库,设置cscopetag选项;

<!--[if !supportLists]-->- <!--[endif]-->cscopetagorder选项决定是先查找tag文件还是先查找cscope数据库。设置为0则先查找cscope数据库,设置为1先查找tag文件。我通常设置为1,因为在tag文件中查找到的结果,会把最佳匹配列在第一位。

VIM的帮助页中给出了使用cscope的建议方法,使用命令“:help cscope-suggestions”查看。

下面是我的vimrc中关于cscope接口的设置:

下面的两个链接是cscope主页提供的cscope使用方法,也可以作为参考:

VIM/cscope指导:http://cscope.sourceforge.net/cscope_vim_tutorial.html

在大项目中使用cscope:http://cscope.sourceforge.net/large_projects.html

在VIM的网站上有很多与cscope相关的插件,有兴趣可以去看一下。这里是搜索结果:点这里。

我以前写的一篇关于VIM/ctag/cscope的文章:

http://blog.csdn.net/easwy/archive/2006/08/31/1150909.aspx

[参考文档]

<!--[if !supportLists]-->1. <!--[endif]-->VIM帮助文件

<!--[if !supportLists]-->2. <!--[endif]-->http://vimcdoc.sourceforge.net/

<!--[if !supportLists]-->3. <!--[endif]-->http://cscope.sourceforge.net/

<!--[if !supportLists]-->4. <!--[endif]-->http://iamphet.nm.ru/cscope/

<!--[if !supportLists]-->5. <!--[endif]-->cscope手册

[尾记]

本文可以自由应用于非商业用途。转载请注明出处。

原文链接:http://blog.csdn.net/easwy

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 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>s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文-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,这样,你不用切换到你数据库文件所在的目录也可以使用它了。cd ~/src/vim70
find . –type f > cscope.files
cscope -bqcscope -Rbq./configure
make
make install:help cscope
========================================================================
========================================================================
vi中结合ctag查找函数声明

本人以前做windows方面开发,在windows下面写代码大多依靠功能强大的集成开发环境IDE,如微软的Visual studio 系列,IBM的Eclipse, Borland的JBuilder,Delphi等等。现在突然转到Linux下,使用vi的感觉很不自在,比如一个*.c文件中引入一大堆的.h文件,在这个*.c文件中,使用的某个函数function(param1,param2),不知道是哪个文件中声明的。此时如果是在windows平台下,使用任何一款IDE都能很方便的跳转到函数原型处,但在Linux下就不是那样的方便了,此时虽然也可以使用grep,但还是有点烦人。
请教同事,他们用的是Ctag,从网上下载exuberant-ctags,安装后,首先,在源码根目录处建立tags文件,指令如下:Ctag -R
此时在当前目录下就创建了一个叫tags的文件。
第二.使用vi打开*.c文件,如果想查看function(param1,param2)在多少地方引用了或者在什么地方声明的,可将光标移到上说的函数处,在vi的命令符状态输入:tag function(或者直接按 CTL+}),vi将跳转到找到第一个function的*.c文件或*.h文件中。
第三.如想看看到底有多少文件引用了该函数,可在vi命令符状态输入:ts,就可以看见有多少地方使用了该函数。
第四.按CTL+T键将返回到原来地方。

vi+indent+ctag编辑c

vim结合ctag,indent是比较好的用于编辑,查看c语言源程序的方法。
ctag完成文件间元素交叉关联。
ctag -R *
:ta 标志符
ctrl+]
ctrl+o
ctrl+t
vi -t 标志符
indent为源代码进行格式化。
:%!indent

说说在fedora上使用ctags和cscope看代码

我装的fedora6上的vim版本是7.0,带有 ctags-5.6和 cscope-15.5的支持。我选择了工作机使用linux fedora6,系统自带的word和看pdf文件的软件都有,收发邮件的软件也有,挺方便的,好用,就是看代码的软件需要自己配一下,麻烦一点,不过配好了以后从速度和使用习惯上比sourceinsight好使。参考了网上一些人的经验,实践了一下,写这个文档总结也许对想了解了解ctags和 cscope的人有帮助。

有很多程序员在linux上习惯使用vi编辑器,也有一些人喜欢使用emacs,不过我个人还是倾向于vi,其实用惯了vi就不喜欢用windows上的编辑器了,其实原因很简单:使用键盘完成查找和替换比用鼠标准确和快,而vi都使用键盘操作实现功能。目前vim是类似于vi的编辑器,它是开源项目而且功能更多,而ctags和 cscope就是它的插件,下面针对vim 来谈谈配置使用ctags 和cscope看代码。

1。需要下载安装

taglist是vim的插件,用来在屏幕左边开窗口显示代码的全局变量、函数名称

下载地址:http://www.vim.org/scripts/script.php?script_id=273

我下载的是taglist-43.zip

安装的方法是将这个包在/usr/share/vim/vim70下展开

2。对应需要看的代码生成cscope的数据库,这个过程也叫训练

我需要看的代码有三部分一部分是linux内核,另外两个部分是库和应用层代码。

Linux内核代码针对我需要的部分整理出数据库,而不相关的部分不参加整理

先建路径:

mkdir $HOME/readcode

mkdir $HOME/readcode/cscope-kernel

mkdir $HOME/readcode/cscope-app

进入路径:

cd readcode

建立生成cscope 数据库的文件文件名是create-kernel.sh

LNX=$HOME/build/linux-2.4.22

find $LNX /

-path "$LNX/arch/*" ! -path "$LNX/arch/arm*" -prune -o /

-path "$LNX/include/asm-*" ! -path "$LNX/include/asm-arm*" -prune -o /

-path "$LNX/tmp*" -prune -o /

-path "$LNX/Documentation*" -prune -o /

-path "$LNX/scripts*" -prune -o /

-name "*.[chxsS]" -print >$HOME/readcode/cscope-kernel/cscope.files

cd $HOME/readcode/cscope-kernel

cscope -b -q -k

cd $HOME/readcode

执行 source create-kernel.sh

会在目录$HOME/readcode/cscope-kernel下生成cscope.out文件

对应用层代码生成cscope的数据库要简单地多

它的生成脚本:

APP=$HOME/build/App

find $APP -name "*.cpp" -print >$HOME/readcode/cscope-app/cscope.files

find $APP -name "*.[ch]" -print >>$HOME/readcode/cscope-app/cscope.files

cd $HOME/readcode/cscope-app

cscope -b -q -k

cd $HOME/readcode

应用程序代码有一些是c++的,所以将.cpp格式的代码列出来生成cscope数据库

3。配置.vimrc文件

.vimrc内容如下:

set cst

set csto=1

set cscopequickfix=s-,c-,d-,i-,t-,e-,f-

cs add /home/yangxl/readcode/cscope-kernel/cscope.out

cs add /home/yangxl/readcode/cscope-app/cscope.out

let Tlist_Enable_Fold_Column = 0

let Tlist_WinWidth = 30

let Tlist_Show_One_File = 1

set tabstop=4

nmap <silent> <F2> :cs find d <C-R>=expand("<cword>")<CR><CR>

nmap <silent> <F3> :cs find c <C-R>=expand("<cword>")<CR><CR>

nmap <silent> <F4> :cs find t <C-R>=expand("<cword>")<CR><CR>

nmap <silent> <F6> :cs find e <C-R>=expand("<cword>")<CR><CR>

nmap <silent> <F7> :cs find f <C-R>=expand("<cword>")<CR><CR>

nmap <silent> <F8> :cs find i <C-R>=expand("<cword>")<CR><CR>

nnoremap <silent> <F9> :TlistToggle<CR><CR>

最下面这几行定义了F2-F9功能的快捷键

F9是打开关闭左边taglist窗口的快捷键

具体它的语法解释在vi中通过键入

:help cscope

学习和理解

4。使用方法

用vi打开参加训练的代码,将光标停留在调用的方法上按ctrl-], 是不是出现了这个方法的原型代码,按F9键多出左边窗口,显示方法名列表和宏定义和全局变量,再按一次F9左边窗口消失。

显示加载的数据库

:cs show

能看到加载了两个cscope.out文件

:cs find 2 方法名 或 :cs find d 方法名 对应快捷键F2

完成找到被这个方法调用的方法名

:cs find 3 方法名 或 :cs find c 方法名 对应快捷键F3

完成找到调用这个方法的方法名

:cs find 4 字符串名称 或 :cs find t 字符串名称 对应快捷键F4

找到出现的字符串

:cs find 7 文件名 或 :cs find f 文件名 对应快捷键F7

找到文件

:cs find 8 文件名 或 :cs find i 文件名 对应快捷

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/petsatan/archive/2007/12/02/1911447.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: