由于全部设计思想、内部机制都是
以代码的形式实现,全部的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能
够提升阅读的效率和效果。
• "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操做的人
,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要缘由。也有人把
Cscope和Emasc绑定阅读源码。固然工具的选取,也取决于我的习惯。 php
Vim+Ctags+Cscope 正则表达式
cscope的工做须要vim、ctags的配合,它们都是基于命令行的。
下面只是给出了三种工具的经常使用方法,更多功能可查看man手册,或者官方文档。 数据库
1、Vim
参考:http://oss.lzu.edu.cn/modules/lifetype/index.php?op=ViewArticle&articleId=1014&blogId=1 vim
2、Ctags
安装: 函数
aptitude install ctags
在源代码根目录下执行 ctags -r 命令用来为程序源代码生成标签文件,其-r选项表示递
归操做,同时为子目录也生成标签文件。vim利用生成的标签文件,能够进行相应检索、并
在不一样的文件C语言元素之间来回切换。 工具
在vim中ctags的简单使用
1) 跳转到指定的函数进入vim后,用 “:tag func_name“ 跳到函数func_name处。使用tag
命令时,可使用TAB键进行匹配查找,继续按TAB键向下切换。
某个函数有多个定义时 this
:tag
跳到第一个定义处,优先跳转到当前文件
:tnext
跳到第一个
:tfirst
跳到前count个
:[count]tprevious
跳到后count个
:[count]tnext
跳到最后一个
:tlast
你也能够在全部tagname中选择:
:tselect tagname spa
若是想跳到包含block的标识符:“tag /block” 而后用TAB键来选择。这里'/'就是告诉vim
'block'是一个语句块标签。
2)用“CTRL + ]“快捷键,跳转到光标所在函数标识符的定义处。
3)使用“CTRL + T”退回上层。若是想在以write_开头的标识符中选择一下, :tselect /^
write_ 这里,'^'表示开头,同理,'$'表示末尾。多个同名的标识符 命令行
3、debian默认没有安装cscope 设计
1、安装:atp-get install 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:
#指定引用头文件进行查找
在对应某一项中输入查找条件,回车便可进行查询,并将结果显示在显示面板。
K跳转到函数的man页
gg=G 按indent缩进格式化整个文件
== 格式化整行
=a{格式化当前{}程序块
gf 查找文件,在.vimrc中用set path=/u/infdev/**/**/** 来设置搜索路径
/* 折行功能能够将一节浓缩为一行, 只显示其大概. */
zo 打开折行
zc 关闭折叠
在编辑模式下用ctrl+o能够暂时进行命令模式
[{ 命令跳转到当前代码块的开头,
]} 会跳转到当前代码块的末尾.
[[ 向前查找一个函数的开始
]] 向后查找一个函数的开始
][ 向前查找一个函数的结尾,
[] 向后查找一个函数的结尾,
{ 到前一个空行上
} 到下一个空行上
# 到与当前单词相同的上一个单词上
* 到与当前单词相同的下一个单词上
% 可让光标从它当前所在的括号跳转到与它相匹配的括号上去,
CTRL+] 跳转tags定义的地方= ctrl+t返回调用tag的地方
gD 查询变量,只在本文件中
gd 查询变量, 只在本函数中
[i 查询变量的定义
[<Tab> 跳到变量定义的地方
set makeprg=nmake 后面nmake可本身定义,通常不用定义
:make 编译程序
:cnext 跳到下一个编译错误
:cc 看完整的错误信息
:clist 看全部错误信息
:e b<tab>在命令行用tab能够补全 按ctrl+d列出全部匹配
q: 列出命令窗口
Vim有一种记录宏的机制。你键入"qa"开始把一段宏记录入寄存器变量`a'中。按下来你能够象日常同样键入你要的操做, 只是这些操做都会被Vim记录进它命名为`a'的宏中, 再次再下"q"键, 就结束了宏`a'的录制。当你要重复执行你刚才记录的那些操做时只要使用"@a"命令。共有26个可用的寄存器供你记录宏。
二为代码生成数据库
二、首先须要为你的代码生成一个cscope数据库。生成数据库很简单,在你的项目根目录运行下面的命令:
cscope -Rbq
若是不是c代码,使用:
$ find ./ -name "*.c" -or -name "*.h" -or -name "*.cpp" -or -name "*.S" | cscope -Rbq
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,能够加快cscope的索引速度。
具体的参数的含义能够经过:man cscope 获得。-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件时,不搜索/usr/include目录
-i: 若是保存文件列表的文件名不是cscope.files时,须要加此选项告诉cscope到哪儿去找源文件列表。可使用“-”,表示由标准输入得到文件列表。
-I dir: 在-I选项指出的目录中查找头文件
-u: 扫描全部文件,从新生成交叉索引文件
三在VIM中使用cscope
1 、用vim编辑的时候:
vim FILENAME.c
2 把生成的cscope文件导入到vim中来
:cs add /路径/cscope.out 代码所在目录
我习惯现切换到代码所在目录再操做,因此直接使用:
:cs add cscope.out 就能够了。
3 查看是否已经链接到对应数据库
:cs s
4 cs f s xxxx 查找xxxx出现的地方,它能详细列出哪些文件的哪行的哪一个函数引用,以及该行的内容.
,首先调用“cscope add”命令添加一个cscope数据库,而后就能够调用“cscope find”命令进行查找了。VIM支持8种cscope的查询功能,以下:例如,咱们想在代码中查找调用work()函数的函数,咱们能够输入:“:cs find c work”,回车后发现没有找到匹配的功能,可能并无函数调用work()。咱们再输入“:cs find s work”,查找这个符号出现的位置,如今vim列出了这个符号出现的全部位置。咱们还能够进行字符串查找,它会双引号或单引号括起来的内容中查找。还可 以输入一个正则表达式,这相似于egrep程序的功能。
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置。
cs f g main 光标跳到main函数的位置
d: 查找本函数调用的函数
cs f d main 列出main函数调用的函数,输入函数所对应的数字,就能够调到相应掉用的函数
c: 查找调用本函数的函数
cs f c main 会输出找到没有匹配的结果,由于没有函数调用main函数
t: 查找指定的字符串
cs f t STRING
f: 查找并打开文件