撤销 C 语法修改宏以使 exctags 能够创建原型标签

撤销 C 语法修改宏以使 exctags 能够创建原型标签

我可以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

相关内容