ctargs使用
ctargs为源码的变量/对象、结构体/类、函数/接口、宏等产生索引文件,以便快速定位。目前支持41种语言,这里仅以C/C++为例:ctags可以产生c/c++语言所有类型的索引文件,具体如下:
- -> class names(类名)
- -> macro definitions(宏定义)
- -> enumeration names(枚举名)
- -> enumerators(枚举变量)
- -> function definitions(函数定义)
- -> function prototypes/declarations(函数定义/声明)
- -> class, interface, struct, and union data members(类,接口,结构体,联合体)
- -> structure names(结构体名)
- -> typedefs(别名)
- -> union names(联合体名)
- -> variables (definitions and external declarations)变量
【ctags的安装】
1)在线安装:
sudo apt-get install ctags (ubuntu)
(RedHat系列使用:yum install ctags)
若不成功,可能是因为源的问题,换一下软件源update后重新执行上述命令即可。
2)手动下载安装:
下载地址
Official site: http://ctags.sourceforge.net/
VIM online: http://www.vim.org/scripts/script.php?script_id=610
参考步骤(以5.8版本ctags-5.8.tar.gz为例)
解压后
$ cd ctags-5.8
$ ./configure
$ make
# make install
安装结束后,使用ctags命令测试是否成功
或whatis ctags, whereis ctags等
【生成tags文件】
安装成功后,要为源码文件生成tags文件,才可享受ctags为阅读代码带来的便利。
$ ctags -R
递归的为当前目录及子目录下的所有代码文件生成tags文件
为某些源码生成tags文件,使用如下命令
$ ctags filename.c filename1.c file.h
或
$ ctags *.c *.h
为了使得字段补全有效,在生成tags时需要一些额外的参数,推荐的c++参数主要是:
ctags -R --c++-kinds=+px --fields=+iaS --extra=+q
其中:
选项c++-kinds 用于指定C++语言的 tags记录类型, --c-kinds用于指定c语言的, 通用格式是 --{language}-kinds
选项 fileds 用于指定每条标记的扩展字段域
extra 选项用于增加额外的条目: f表示为每个文件增加一个条目, q为每个类增加一个条目
【使用方法】
在vim打开源码时,指定tags文件,才可正常使用,通常手动指定,在vim命令行输入:
:set tags=./tags(当前路径下的tags文件)
若要引用多个不同目录的tags文件,可以用逗号隔开
或者,设置 ~/.vimrc,加入一行,则不用手动设置tags路径:
set tags=~/path/tags
若要加入系统函数或全局变量的tag标签,则需执行:
ctags -I __THROW –file-scope=yes –langmap=c:+.h –languages=c,c++
–links=yes –c-kinds=+p --fields=+S -R -f ~/.vim/systags /usr/include
/usr/local/include
并且在~/.vimrc中添加(亦可用上面描述的手动加入的方式):
set tags+=~/.vim/systags
这样,便可以享受系统库函数名补全、原型预览等功能了。
如果经常在不同工程里查阅代码,那么可以在~/.vimrc中添加:
set tags=tags;
set autochdir
设置好了tags文件,在定位变量/函数的定义时,最常用的快捷键是:
Ctrl + ]
跳转到变量或函数的定义处,或者用命令
:ta name
而使用快捷组合键
Ctrl + o/t
返回到跳转前的位置。
另外,ctags不会生成局部变量的索引,不过可以使用gd组合键(对光标所在处的word进行快捷查找定位)来定位,也是相当快捷的。
$ vim -t myAdd
用vim打开文件时,添加参数-t funcName会自动打开定义该函数的文件并定位到定义首行,上面这句就是找到myAdd定义的文件打开并将光标置于定义的第一行处。
:tags
会列出查找/跳转过程(经过的标签列表)
另外,附上vim环境中其他较为好用的快捷键:
* 定位至当前光光标所指单词的下一次出现的地方
# 定位至当前光光标所指单词的上一次出现的地方
n 定位至跳至已被标记出的单词下一次出现的地方
shift+n 定位至跳至已被标记出的单词上一次出现的地方
关于更详细的ctags用法,vim中使用
:help tags
1. 在Android源码顶层目录下运行ctags -R 生成tags文件
2. 在Android源码顶层目录运行cscope -Rbq,生成cscope.out文件
3.修改~/.vimrc使之可以自动加载tags和cscope.out文件,注意要使用ctags和cscope数据库,必须在android源码顶层运行vim程序
我的.vimrc如下:
"开关tag窗口 nnoremap <silent> <F8> :TlistToggle<CR> "使用右侧tag窗口 "let Tlist_Use_Right_Window=1 "一般设置. "set nocompatible "VIM而不是VI set history= "历史记录50条 set fenc=utf- "设置默认语言为8位unicode "man Q gq "屏蔽Q, 以免进入Ex模式 filetype on "打开文件类型检测 " ""颜色设置. colorscheme delek "主题 "colorscheme evening "主题 syntax on "语法高亮 "set hls " 查找文本高亮 "界面设置. set ruler "显示当前位置 set number "显示行号 ""set nonumber "不显示行号 "格式设置. set autoindent "自动缩进 set smartindent "智能缩进 set cindent "C缩进 set tabstop= "硬TAB set softtabstop= "软TAB set shiftwidth= "缩进空格数 set expandtab "空格替换TAB "set smarttab "智能TAB "
set showmatch "显示匹配 "set matchtime=5 "/10秒延迟 "set hlsearch "高亮搜索 "set incsearch "搜索中匹配 set tags=tags; "ctags "set autochdir "ctags
4.但是这样有个问题就是每次必须从android顶层运行vim,从子目录中运行ctags和cscope无法正常使用。因此我写了一个脚本,用来解决这个问题
#! /bin/bash
i=`pwd`
cd ~/source/unicore_src
vim $i/$1 $2 $3
cd $i
保存成mvim可执行文件,放到PATH环境变量中,就可以在子目录中通过mvim来打开android源码,并进行各种跳转了。
使用cscope的最大好处是可以替代source insight的功能,并可以快速定位某个函数在哪些地方被调用,非常方便
使用Vim+Ctags+Cscope阅读源代码
代码阅读工具简介
对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是
以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能
够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight
、lxr、Cscope、Kscope等。
• &quot;Source Navigator&quot;是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。
• &quot;Source Insight&quot;目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者
从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟
是Windows平台的东西,并不能很自由的使用。
• lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态
生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还
有速度。
• &quot;Cscope&quot;[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人
,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把
Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。
Vim+Ctags+Cscope
cscope的工作需要vim、ctags的配合,它们都是基于命令行的。在Ubuntu下,用户只需执
行“sudo apt-get install cscope cscope-indexer ctags vim-full”即可完成软件安装。
下面只是给出了三种工具的常用方法,更多功能可查看man手册,或者官方文档。
Vim
vim被看作是专门为程序员打造的文本编辑器,其丰富的编辑命令都是常用的简单字符,用
户很容易上手。vim可对180多种语言的语法高亮,对C语言自动缩进,真则表达式字符匹配
查找,功能强大,并支持多个操作系统平台。关于vim的使用,这里不做讲解。vim中文文
档[5]。
在Ubuntu下默认安装的vim,没有语法加亮功能。所以需要安装vim-full,并在vim 配置
文件 ~/.vimrc中添加一行 &quot;syntax on&quot; 这样在vim中打开的源码就有了语法高亮显示。
vim自带了很多颜色主题,可以直接选取下面一行添加到vim配置文件当中,重新打开vim即
可生效。
colorscheme elflord &quot;我使用这个
colorscheme darkblue
colorscheme evening
colorscheme murphy
colorscheme torte
colorscheme desert
Ctags
在源代码根目录下执行 ctags -r 命令用来为程序源代码生成标签文件,其-r选项表示递
归操作,同时为子目录也生成标签文件。vim利用生成的标签文件,可以进行相应检索、并
在不同的文件C语言元素之间来回切换。
在vim中ctags的简单使用
1) 跳转到指定的函数进入vim后,用 “:tag func_name“ 跳到函数func_name处。使用tag
命令时,可以使用TAB键进行匹配查找,继续按TAB键向下切换。
某个函数有多个定义时
:tag
跳到第一个定义处,优先跳转到当前文件
:tnext
跳到第一个
:tfirst
跳到前count个
:[count]tprevious
跳到后count个
:[count]tnext
跳到最后一个
:tlast
你也可以在所有tagname中选择:
:tselect tagname
如果想跳到包含block的标识符:“tag /block” 然后用TAB键来选择。这里'/'就是告诉vim
'block'是一个语句块标签。
2)用“CTRL + ]“快捷键,跳转到光标所在函数标识符的定义处。
3)使用“CTRL + T”退回上层。如果想在以write_开头的标识符中选择一下, :tselect /^
write_ 这里,'^'表示开头,同理,'$'表示末尾。多个同名的标识符
Cscope
运行cscope命令,出现两个面板,上方是一个查找结果的显示面板,下方是一个查找条件
指定面板。使用TAB键在两个面板间切换,也可使用上下左右方向件和翻页键在同一面板内
贴换位置。选中显示面板的某个项,回车即可进入该文件,这是调用vim打开文件,这时就
可以结合ctags使用了。当然也可以直接使用vim打开文件,结合ctags阅读源码。
使用前,必须现使用“cscope-indexer -r”命令递归生成索引信息文件。特殊情况下,还需
要用户使用find命令,主动生成索引信息文件,并指定给cscope工具。 cscope提供了如下
九种查询方式:
Find this C symbol:
#查找指定的C符号
Find this global definition:
#查找指定的全局定义
Find functions called by this function:
#查找指定函数调用的函数
Find functions calling this function:
#查找调用指定函数的函数
Find this text string:
#查找字符串
Change this text string:
#修改指定字符串
Find this egrep pattern:
#查找匹配字符
Find this file:
#查找指定文件
Find files #including this file:
#指定引用头文件进行查找
在对应某一项中输入查找条件,回车即可进行查询,并将结果显示在显示面板。
应用实例
下面以使用cscope阅读内核源代码为例:
$ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.6.tar.bz2
#从Linux内核官网下载内核源代码
$ tar xvfj linux-2.6.27.6.tar.bz2
#解压文件
$ cd linux-2.6.27.6
#进入源代码根目录
$ ctags -R
#递归生成标签文件
$ cscope-indexer -r
#递归生成索引信息文件
$ cscope
#使用cscope阅读源码
标签文件、索引信息文件只需要第一次或者代码发生变动时生成,以后使用直接运行
cscope即可。
ctargs使用的更多相关文章
随机推荐
- 为mongodb数据库添加安全账户
最近的数据库服务器有些不稳定,遇到了黑客的骚扰,mongodb的安全存在一些漏洞.首要任务是给数据库添加账号.之前大家都习惯于mongodb的不加安全账号和密码来连接数据库,那么问题是添加了安全账户后 ...
- shiro realm 注解失败问题解决过程
做为一名在.net混了八九年的老兵油子,转战java时间并不长,刚开始做项目完全是凭借对C#的认识来做,虽然遇到一些问题,但实际结果显示C#在语言上和java还是有很大相似度,而且微软的MVC与Spr ...
- Git安装图解
msysgit是Windows版的Git,提供了命令行操作 下载地址:http://msysgit.github.io/
- css知多少(7)——盒子模型
1. 引言 从这一节开始,我们就进入本系列的第三部分——css呈现.本部分将描述css在页面的几种布局和呈现的特性.包括两类:文字.块. 第一类——文字.这部分相对比较简单一些,例如设置字号.字体.颜 ...
- i++,++i,Math.max,hasOwnPrototype.ajax,indexOf(),firefox的一些东西,jquery的contains函数,window.open
一.i++与++i的区别 1 var i=0;3 console.log(i++)5 0 1 var j=0; 2 3 console.log(++j) 4 1 a=++i;相当于i=i+1;a=i; ...
- knockout源码分析之订阅
一.主类关系图 二.类职责 2.1.observable(普通监控对象类) observable(他其是一个function)的内部实现:1.首先声明一个名为observable的fn(这个可以说是一 ...
- 开发中可能会用到的几个 jQuery 小提示和技巧
今天,我们将分享一些很有用的技巧和窍门给 jQuery 开发人员.jQuery 是最好的 JavaScript 库之一,用于简化动画,事件处理,支持 Ajax 和 HTML 的客户端脚本.网络中有大量 ...
- Unsplash.it - 实用的图片占位符,支持个性化设置
Unsplash.it 是一个使用漂亮的图像作为占位符的工具.只要把你的图像尺寸(宽与高)放到网址后面的参数中,你会得到一个占位符.你可以很容易地得到一个随机图像或者是一个模糊图像.也支持获取灰度图像 ...
- apache EnableMMAP指令
官方说明地址:http://httpd.apache.org/docs/2.4/mod/core.html#enablemmap Use memory-mapping to read files du ...
- xmpp整理笔记:发送图片信息和声音信息
图片和音频文件发送的基本思路就是: 先将图片转化成二进制文件,然后将二进制文件进行base64编码,编码后成字符串.在即将发送的message内添加一个子节点,节点的stringValue(节点的值) ...