使用cscope发现了一个重大的缺点,就是它包含了太多的输出,比如你要查找platform_driver结构体的定义,它会输出platform_driver的声明,很多变量等。真正的定义被淹没在输出中。因此又回过头来学习ctags。
ctags只能生成数据库,本身不能查询。
支持的语言,可以使用--list-languages列出来。根据文件自动映射到语言,可以使用--list-maps查看这个映射关系,如下是部分输出:
1 2 3 4 5 6 7 8 | $ ctags --list-maps Ant *.build.xml Asm *.asm *.ASM *.s *.S *.A51 *.29[kK] *.[68][68][kKsSxX] *.[xX][68][68] Asp *.asp *.asa Awk *. awk *. gawk *.mawk Basic *.bas *.bi *.bb *.pb BETA *.bet C *.c |
使用--language-force强制使用某种语言。
-f file,指定数据库文件的文件名,如果没有这个选项,默认是tags。如果file为-,则输出到标准输出。
-L file,指定一个源文件列表。
-R,如果不是通过-L选项指定源文件列表,而是通过命令行参数指定一个目录,这个选项会搜索目录下所有的源文件。
--list-kinds显示,每种语言支持的符号类型,以及默认是否包含该类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $ 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] 。。。 |
建立数据库时,可以指定想要的类型:
--c-kinds=+p-m
表示c语言,支持p类型,去掉m类型。
典型的命令:
1 | $ ctags --c-kinds=+p -R . |
如果当前目录有tags文件,vim启动时会自动添加。也可以手动添加:
1 | : set tags+=/path/to/tags |
如果只有一个tags使用=代替+=也是可以的。
当然set语句,也可以直接放在.vimrc中,这样所有的vim,在启动时,都添加。
查询
Ctrl + ] 查询光标处的引用
命令查询
: tag name
: ta name