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

Jen*_*ens 4 header-file macro ctags

我可以tags使用 exctags ( Exuberant Ctags )成功地为 vim创建一个文件。

但是,创建允许跳转到函数原型的标签不起作用,因为系统标头使用了表单的语法修改宏

#define _EXFUN(name, proto)     name proto
Run Code Online (Sandbox Code Playgroud)

并在,例如string.h使用

char    *_EXFUN(strchr,(const char *, int));
Run Code Online (Sandbox Code Playgroud)

它为_EXFUN而不是创建了一个标签strchr

_EXFUN  /somedir/include/string.h   /^char  *_EXFUN(strchr,(const char *, int));$/;"    p
Run Code Online (Sandbox Code Playgroud)

我用这个命令创建标签:

exctags -f tags.p --language-force=c --c-kinds=p file1 file2 ...
Run Code Online (Sandbox Code Playgroud)

我上下阅读了 exctags 手册页,尝试了各种-I选项来影响宏扩展,但无济于事。有没有人解决过这个问题?

Kus*_*nda 5

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
Run Code Online (Sandbox Code Playgroud)

示例 C 文件:

#define _EXFUN(name, proto)     name proto

char    *_EXFUN(strchr,(const char *, int));
Run Code Online (Sandbox Code Playgroud)

结果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  /dhiebert@users.sourceforge.net/
!_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:
Run Code Online (Sandbox Code Playgroud)

如您所见, 的原型strchr被列为出现在 中的第 3 行prog.c

这样做的缺点是您不会获得任何用于预处理宏的标记条目。

您可以通过ectags在预处理和原始文件上运行来解决这个问题:

ectags --line-directives=yes --language-force=c --c-kinds=pd -n -I _EXFUN prog.p prog.c
Run Code Online (Sandbox Code Playgroud)

产生

[...]
_EXFUN  prog.c  1;"     d       file:
strchr  prog.c  3;"     p       file:
Run Code Online (Sandbox Code Playgroud)