ctags用于为源代码文件生成一个索引或标签文件,以便使这个文件里的代码可被文本编辑器快速定位,如Vim,使得Vim这么个简陋的编辑器也能变成神器。
ctags能为多种语言源文件生成交叉索引表,通过--list-languages和--list-kinds选项能看到其支持的语言。ctags默认以文件名的后缀来判断源文件的语言类型,进而采用相应的映射生成标签,--list-maps选项可展示语言类型与文件的后缀名的对应情况。--language-force=language选项可强制采用某种语言类型。若文件是可执行的又没有后缀,则ctag会查看文件的第一行(如脚本文件的#!),判断其语言类型。
ctags选项的缺省值适合多数情况,由于其对文件类型的判断机制,它将忽略那些它不能识别的源文件,故可不用带任何选项就为当前目录下可识别的源文件生成一个标签文件(如 ctags *或ctags -R)。
下面是网络上对man ctags的选项翻译,粘贴一下
需注意,用来分隔单字母选项和它们参数的空格是可选的。
同样需注意,长格式选项的布尔型参数 (那些以 "--" 开头并且带 "[=yes|no]" 参数的选项) 可以被省
略,在这种情况下隐含为 "=yes" ,而 "=0" 和 "=off" 被认为是 "=no" 。
某些选项在以 etags 模式运行时或被忽略,或会起作用 (见 -e 选项)。这样的选项会特殊注明。
绝大多数选项可以出现在命令行的任意位置,只影响在该选项后面的文件。然而,少数选项必须出现在第
一个文件名之前,这样的选项也会特殊注明。
带程序语言名字的选项允许名字是大写或小写。见 --list-languages 选项,以获得内建程序语言名的完
整列表。
-a 等同于 --append
-B 使用向上查找的模式 (例如 ?pattern?)。 [在 etags 模式中忽略]
-e 使能 etags 模式,这将创建 Emacs 编辑器使用的标签文件。可选的,如果包含 "etags" 调用
ctags 时 (通过重命名,或者创建符号链接到可执行文件的方式),会使能 etags 模式。这个选项
必须出现在第一个文件名之前。
-f tagfile
使用所指定的 tagfile 做为标签文件的名字 (缺省是 "tags",或 "TAGS" 当以etags模式运行时)。
如果 tagfile 被定义成 "-",那么标签文件被输出到标准输出。如果 tagfile 存在并且它的第一
行不是有效的标签行时,ctags 将拒绝执行。如果你错误的输入了 "ctags -f *.c",这会救你一命,
不然它会把其它文件所产生的标签覆盖到你的第一个 C 文件! ctags 也会拒绝接受以一个 "-" (减
号)开头的文件名,因为这很可能是你忘记输入标签文件的名字,而本选项试图把它后面的选项做为
文件名。如果你真的想把你的输出标签文件名命名为 "-ugly",把它定义成 "./-ugly"。这个选项
必须出现在第一个文件名之前。如果这个选项出现多次,只有最后一个生效。
-F 使用向下查找的模式 (例如 /pattern/) (缺省)。 [在 etags 模式中忽略]
-h list
定义一个文件扩展名列表,以句号分隔,这些文件将做为包含文件(或头文件)被解析。要指定没有
扩展名的文件,用一个句号,后面不跟句号以外的字符 (例如,".","..x",".x.")。这个选项只
影响如何解析一种特定类型的标签的作用域 (也就是说,这些标签是全局可见,还是这些标签只在
定义它们的文件中可见);它并不把这些扩展名映射到任何特定的程序语言。任何位于非头文件中的
标签,如果不能被另外一个文件可见 (例如,链接到另外一个文件),那么它的作用域被认为局限于
该文件 (例如,static)。在头文件中的所有类型的标签,它的作用域都不会被认为局限于该文件。
如果列表中的第一个字符是加号,那么该列表中的扩展名将被加到现有列表之后;否则,该列表将
替换现有列表。另外,参见 --file-scope 选项。缺省的列表是 ".h.H.hh.hpp.hxx.h++.inc.def"。
要恢复缺省列表,使用 -h default。注意,如果此选项指定的一个扩展名还没有被映射到一种特定
的程序语言 (见上面的 SOURCE FILES),你也需要使用 --langmap 或 --language-force 选项。
-I identifier-list
定义一个标识符列表,在解析 C 和 C++ 源文件时会对这些标识符进行特殊的处理。这个选项主要
用来处理由于编译预处理宏的使用而引发的特殊情况。当列出的标识符是简单的标识符时,这些标
识符在解析源文件时会被忽略。如果一个标识符以 "+" 字符做为结尾,ctags 将忽略源文件中紧跟
在此标识符后的被括号括起来的参数列表。如果两个标识符以 "=" 字符分隔,在解析时,第一个标
识符将被第二个标识符所替代。标识符列表可以直接在命令行上提供,也可以从一个单独的文件中
读出。如果 identifier-list 的第一个字符是 "@",".",或目录分隔符 ("/" 或 "\"), 或前两个
字符是驱动器的盘符 (例如,"C:"),identifier-list 参数将被解释为一个文件名,从这个文件中
读取标识符列表,每行一个标识符。否则,identifier-list 是需要被特殊处理的标识符的列表
(或一组标识符对的列表),每一个标识符被逗号或空格分开,(如果以空格分隔,需要用引号把整个
列表括起来,以使整个列表做为一个命令行参数)。可以使用多个 -I 选项。要清除已定义的标识符
列表,以 "-" 做为 identifier-list 参数。
这个特性在编译预处理宏的出现会导致句法混淆的时候非常有用。实际上,这是解决源文件中干扰
语法的宏所引发的问题的最好办法 (见下面的 CAVEATS)。下面的例子详细描述这点。
int foo ARGDECL4(void *, ptr, long int, nbytes)
在上面的例子中,宏 "ARGDECL4" 将被错误的解释为函数的名字,而不是正确的名字 "foo"。定义
-I ARGDECL4 会获得正确的结果。
/* creates an RCS version string in module */
MODULE_VERSION("$Revision: 1.41 ___FCKpd___0quot;)
在上面的例子,宏定义看起来非常像一个函数的定义,因为它没有以分号结尾 (实际上,它后面甚
至还可以跟一个全局变量定义,这样看起来更像一个 K&R 风格的函数参数定义)。实际上,在试图
完成这个看起来像函数的定义时,可能会导致文件的其它部分被跳过。定义 -I MODULE_VERSION+
可以避免这样的问题。
CLASS Example {
// your content here
};
上面的例子使用了 "CLASS" 做为预处理宏,它在不同的平台上被扩展为不同的东西。例如,在
Win32 平台上它可能被定义为 "class __declspec(dllexport)",而在 UNIX 上简单的被定义为
"class"。通常,没有 C++ 的 "class" 关键字将导致源文件被错误的解析。定义 -I CLASS=class
能够得到正确的结果。
-L file
在文件 file 中读取需要产生标签文件的文件列表。如果 file 被指定为 "-",那么文件列表由标
准输入上读取。通过这个选项读到的文件将在命令行上给出的文件之后被处理。输入中的选项也会
被接受 (*1)。如果此选项被定义多次,只使用最后一个。注意:file 以行的方式被读取,只以换
行符做为分隔符,空格被认为是有意义的,这是为了支持文件名中包含空格的情况;如果输入中包
含选项,这会影响选项如何被解析 (*2)。