我可以tags
使用 exctags 成功创建 vim 文件(旺盛的C标签)。
然而,创建标签允许跳转到原型函数的功能不起作用,因为系统标头使用以下形式的语法修改宏
#define _EXFUN(name, proto) name proto
并在例如string.h
使用
char *_EXFUN(strchr,(const char *, int));
它创建一个标签_EXFUN
而不是strchr
:
_EXFUN /somedir/include/string.h /^char *_EXFUN(strchr,(const char *, int));$/;" p
我使用以下命令创建标签:
exctags -f tags.p --language-force=c --c-kinds=p file1 file2 ...
我已经仔细阅读了 exctags 手册页,尝试了各种-I
选项来影响宏扩展,但无济于事。有人解决这个问题了吗?
答案1
运行ectags
预处理的文件,并要求它查看预处理器的注释 ( --line-directives=yes
) 并将行号写入tags
文件 (-n
或--excmd=numbers
)。
cc -E prog.c >prog.p
ectags --line-directives=yes --language-force=c --c-kinds=p -n prog.p
示例 C 文件:
#define _EXFUN(name, proto) name proto
char *_EXFUN(strchr,(const char *, int));
结果tags
文件:
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/
!_TAG_PROGRAM_NAME Exuberant Ctags //
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
!_TAG_PROGRAM_VERSION 5.8 //
strchr prog.c 3;" p file:
正如您所看到的, 的原型strchr
被列为出现在 中的第 3 行prog.c
。
这缺点这是因为您没有获得任何用于预处理宏的标记条目。
您可以通过运行ectags
预处理文件和原始文件来解决这个问题:
ectags --line-directives=yes --language-force=c --c-kinds=pd -n -I _EXFUN prog.p prog.c
产生
[...]
_EXFUN prog.c 1;" d file:
strchr prog.c 3;" p file:
答案2
要处理该特定宏,您可以使用以下--regex-<LANG>
选项:
ctags --regex-c='/^[^#]*_EXFUN *\( *([^ ,]+),.*/\1/p/' ...
它生成一个tags
文件:
_EXFUN test.c 1;" d file:
strchr test.c /^char *_EXFUN(strchr,(const char *, int));$/;" p