ctags可以遵循#include指令吗?

时间:2011-10-21 11:43:32

标签: vim ctags

我正在尝试在Makefile中创建一个目标,以使用ctags自动创建tags文件。

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

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

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

ctags  --fields=+iaS --extra=+q myClass.cpp

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

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

ctags  --fields=+iaS --extra=+q myClass.cpp myClass.h

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

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

#include "myClass.h"

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

1 个答案:

答案 0 :(得分:6)

没了。不幸/幸运。

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

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

幸运的是,通过执行类似

的操作可以轻松解决您自己的库的问题
ctags *.h *.cpp
ctags -R src/

您可以与cpp然后ctags一起破解某些内容。这不方便。一个有趣的方法是修补ctags以跟随#line输出中的cpp编译指示,从而将所有标记与其各自的来源相关联。

但是,这种方法正如您对任何预处理程序符号/定义所期望的那样(宏已经扩展,因此您将无法通过ctags找到宏)。 / p>

解决此问题的常用方法是为外部库生成“标准”代码文件,

:se tags+=/home/me/libs/tags.stdc++
:se tags+=/home/me/libs/tags.libsox

等。有几个库提供了有关如何制作有用的标记文件以供其库使用的教程(或假定某个文件夹布局的预构建标记文件)