ctags可以遵循#include指令吗?

Lee*_*ton 4 vim ctags

我试图在我的Makefile中创建一个目标,tags使用ctags 自动创建一个文件.

我有一个源文件列表(.cpp文件),但我没有所有头文件g++ -MM的列表(我用来创建头依赖项列表).

我会假设ctags #include在生成标签时会遵循.cpp文件中的任何指令,但似乎我的假设是错误的.

如果我创建一个这样的简单标签文件:

ctags  --fields=+iaS --extra=+q myClass.cpp
Run Code Online (Sandbox Code Playgroud)

然后进入vim并输入一个对象的名称,后跟一个'.' 我收到错误"Pattern not found".

但是,如果我像这样编译标签文件:

ctags  --fields=+iaS --extra=+q myClass.cpp myClass.h
Run Code Online (Sandbox Code Playgroud)

并在vim中做同样的事情我得到一个可爱的自动完成的成员变量/函数列表.

我的'myClass.cpp'文件中的第一行是

#include "myClass.h"
Run Code Online (Sandbox Code Playgroud)

那么为什么ctags也没有使用它来解析头文件呢?

seh*_*ehe 6

不.不幸/幸运.

您自己的包含后不会有太多问题.问题始于

  • 条件编译
  • 外部(系统)库.

幸运的是,通过执行类似的操作可以轻松解决您自己库的问题

ctags *.h *.cpp
ctags -R src/
Run Code Online (Sandbox Code Playgroud)

你可以砍的东西连同cpp然后ctags.这不方便.一个有趣的方法是修补ctags以跟随#line编译指示的cpp输出,从而将所有标记与其各自的源相关联.

但是,这种方法不会像您期望的任何预处理器符号/定义那样工作(宏已经扩展,因此您将无法通过ctags找到宏).

解决此问题的常用方法是为外部库生成"标准"标记文件,以及

:se tags+=/home/me/libs/tags.stdc++
:se tags+=/home/me/libs/tags.libsox
Run Code Online (Sandbox Code Playgroud)

几个库有关于如何制作有用的标签文件以供其库使用的教程(或假设某个文件夹布局的预构建标签文件)

  • 感谢您的回答。在玩了一会儿之后,我决定使用 `ctags -R .` 选项。很遗憾,我希望有一个 `--follow-includes` 选项(也许加上一个 `--include-depth=X` 选项)。但是就像你说的,有条件的`#include`s 的能力让这变得很棘手。 (2认同)