我试图在我的Makefile中创建一个目标,以使用ctags自动创建tags
文件。
我有一个源文件(.cpp文件)列表,但没有所有头文件的列表(我使用g++ -MM
创建了头文件依赖项列表)。
我本来以为ctags会在生成标签时遵循.cpp文件中的所有#include
指令,但是看来我的假设是错误的。
如果我创建一个像这样的简单标签文件:
ctags --fields=+iaS --extra=+q myClass.cpp
然后进入vim并输入对象名称,后跟“。”。我收到错误“未找到模式”。
但是,如果我像这样编译标签文件:
ctags --fields=+iaS --extra=+q myClass.cpp myClass.h
并在vim中做同样的事情,我得到了一个漂亮的自动完成的成员变量/函数列表。
我的“myClass.cpp”文件中的第一行是
#include "myClass.h"
那么,为什么ctags也不使用它来解析头文件呢?
最佳答案
不。不幸/不幸的是。
遵循您自己的包含,不会有太多问题。问题开始于
幸运的是,您可以通过执行类似的操作轻松解决您自己的库的问题
ctags *.h *.cpp
ctags -R src/
您可以先将
cpp
和ctags
一起砍掉一些东西。它不会方便地工作。一种半感兴趣的方法是修补ctags以跟随#line
输出中的cpp
杂注,从而将所有标签关联到它们各自的源。但是,这种方法无法按您期望的任何预处理器符号/定义进行操作(宏已经扩展,因此您将无法通过ctags查找宏)。
解决此问题的常用方法是为您的外部库生成一个“标准”标签文件,并且
:se tags+=/home/me/libs/tags.stdc++
:se tags+=/home/me/libs/tags.libsox
等等。一些库提供了有关如何制作与其库一起使用的有用标记文件的教程(或假定特定文件夹布局的预构建标记文件)。
关于vim - 可以使ctag遵循#include指令吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7848911/