Ctags简介
Ctags(Generate tag files for sourcecode)产生标记(/索引)文件以帮助在源文件中定位对象。Ctags最初支持C语言,现在已经支持C/C++/Java/JS/Python等41种语言。Vim/Emacs/SublimeText/UltraEdit等编辑器或工具都支持Ctags生成的标记文件。 对于C/C++语言来说,其生成的标记文件tags中包括这些对象的列表:
- 用#define定义的宏
- 枚举型变量的值
- 函数的定义、原型和声明
- 名字空间(namespace)
- 类型定义(typedefs)
- 变量(包括定义和声明)
- 类(class)、结构(struct)、枚举类型(enum)和联合(union)
- 类、结构和联合中成员变量或函数
安装
下载ctags58.zip,将其中的ctags.exe解压缩到系统环境变量path包含的路径即可。
使用选项
如果没有指定−−language−force选项,每个源文件的语言基于文件名和语言的映射进行自动选择。该映射可用−−list−maps选项显示,它可能会被−−langmap选项改变。对于操作系统所支持的文件,如果文件名无法映射到某种语言且该文件可被执行,则会对文件第一行检查是为"#!“公认的语言脚本。默认情况下,所有其他文件名都会被忽略。由于仅文件名可匹配某种语言的文件会被扫描,这使得在单个目录对所有文件(例如"ctags*")或对目录树的所有文件(例如"ctags −R”)执行ctags成为可能。.h扩展名即用于C++也用于C,所以Ctags将.h映射为C++,这样做不会有不良后果。
-R
:等同于–recurse,递归子目录遍历-L
:从文件读取Ctags待处理文件列表并对其执行ctagsfind . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.bld" -o -name "*.blt" > prj.files ctags -L prj.files
--list−maps
:显示文件名和语言的映射--list−languanges
:显示所有支持的语言--langmap
:设置文件名和语言的映射 如果程序中有的.c文件其实是C++程序,这该怎么办?答案是使用ctags –langmap=c++:+.c。−−language−force
:强制使用特定语言,而不是通过文件名和语言的映射进行自动选择 像C++标准库stl中文件名没有后缀,怎么办? 使用ctags−−language−force=C++这样就把所有文件当成C++来处理了。−−fields
:指定标记文件中条目的可用扩展字段(没有指明的默认关闭)a
类成员的访问属性
f
文件限制范围 [enabled]
i
继承信息
k
单字符形式的标记类型 [enabled]
K
全名称形式的标记类型
l
包含该标记的源文件语言
m
实现信息
n
标记定义行号
s
标记定义范围 [enabled]
S
函数签名(例如原型或参数类表)
z
包含kind字段中包含"kind:"的关键字
t
变量的类型和名称,或typedef的"typeref:"字段。 [enabled]
--{language}-kinds
:指定输出中需包含的特定语言标记列表 使用ctags –list-kinds=c++可以查看选项:c
classes
d
macro definitions
e
enumerators (values inside an enumeration)
f
function definitions
g
enumeration names
l
local variables [off]
m
class, struct, and union members
n
namespaces
p
function prototypes [off]
s
structure names
t
typedefs
u
union names
v
variable definitions
x
external and forward variable declarations[off]
--extra
:用于增加额外的标记条目f
为每个源文件包含一个用于基本文件名(除去路径的文件名,例如"example.c")的条目,用于定位文件首行。
q
(对C++、Eiffel和Java这些支持全类名语言)为类成员标记包含一个额外的全类名条目,其形式取决于特定语言。对于C++,形式为"class::member";对于Eiffel和Java,形式为"class.member"。
OmniCppComplete 提供的ctags生成语句示例:
ctags -R –c++-kinds=+px –fields=+iaS –extra=+q .
通过Vim使用标记文件
|命令|介绍 |— |vi -t tag|启动Vim并定位到标记所定义的文件和代码行上。 |:ta tag|查找一个标记。 |Ctrl-]|跳到光标所在函数或者结构体的定义处。 |Ctrl-T|返回到跳转标记之前的位置。 |:ts|:tselect, 列出一个列表供用户选标记。 |:tp|:tprevious,上一个tag标记文件。 |:tn|:tnext,下一个tag标记文件。 |:tfirst|第一个tag标记文件。 |:tlast|最后一个tag标记文件。
Ctags局限性
Ctags生成的标记文件包含了类、函数和变量等的定义信息,而没有包含使用信息。如果要知道一个函数都在什么地方使用过,需要使用cscope工具。
参考
Exuberant Ctags网站
SourceForge:Exuberant Ctags项目
Ctags手册
ctags 小记