如何为linux C开发设置CTAG?

如何为linux C开发设置CTAG?,c,linux,ctags,exuberant-ctags,universal-ctags,C,Linux,Ctags,Exuberant Ctags,Universal Ctags,我正在学习Linux下的C开发。但是,我正在努力正确设置CTAG以使用vim。它正确地注册了标记文件,并基于该文件提供完成 我不确定什么是获得“必要”包含的正确方法。目前我有一些“手工挑选”的标题: 在第一步中,我只放置了与#include…相同的标题,但遗漏了一些内容(比如/usr/include/bits/…)。所以我添加了这些 但我觉得这么多年后,某个地方的某个人不得不想出更好的解决办法。那么,这通常是如何做到的呢?这是一个很好的问题,灰狼 我多年来一直在使用这种方法,下面是我如何使用它的

我正在学习Linux下的C开发。但是,我正在努力正确设置CTAG以使用
vim
。它正确地注册了
标记
文件,并基于该文件提供完成

我不确定什么是获得“必要”包含的正确方法。目前我有一些“手工挑选”的标题:

在第一步中,我只放置了与
#include…
相同的标题,但遗漏了一些内容(比如
/usr/include/bits/…
)。所以我添加了这些


但我觉得这么多年后,某个地方的某个人不得不想出更好的解决办法。那么,这通常是如何做到的呢?

这是一个很好的问题,灰狼

我多年来一直在使用这种方法,下面是我如何使用它的:

  • 为系统使用的逻辑组件生成标记文件。逻辑组件通常是您在其他语言中认为的导入(即,我使用的是OpenGL或某些声音库)
  • 对于给定的逻辑组件,您可能必须忽略头文件中的某些文本。这是为了防止ctags程序误解某些结构,从而在生成的文件中误报这些特定标记(想想预处理器宏或编译器指令)或根本不将它们放入输出文件中
  • 修改path Vim变量,使其按顺序指向已生成的文件。我选择一个最里面的模式。首先是项目代码本身,然后是项目中的库,然后是单独的系统库,最后是表示“其他一切”的最终标记文件
  • <>我通常有一个用于ANSI C头的标签文件(或者C++,如果你使用它)适合特定的标准(通常是c99,C++ 11,如果你使用C++),这通常是我的“其他所有”标签文件。 最困难的部分是将忽略列表馈送给CTAG。因为您使用的是C,所以我假设您使用的是系统中的C头(只是该语言应该提供的编译器标准头)。我在生成这些时使用以下忽略列表(在Ubuntu 14.04上):

    \u属性__
    __属性_已弃用__
    __属性\格式\参数__+
    __属性\格式\ strfmon__+
    __属性_malloc__
    __属性线__
    __纯属性__
    __使用的属性__
    __属性\u警告\u未使用\u结果__
    __属性分配大小__+
    __属性常数__
    __人工属性__
    __乌尔
    __扔
    __THROWNL
    __开始
    __十二月底
    __开始\u名称空间\u标准
    __结束\u名称空间\u标准
    __使用名称空间+
    __开始\u命名空间\u C99
    __结束\u命名空间\u C99
    __使用_名称空间_C99+
    __华代克+
    __沃纳特+
    __错误的+
    __flexarr=[]
    __强化功能
    __重新更正+
    __重定向+
    __重定向+
    __ASMNAME+
    __ASMNAME2+
    __非空+
    __始终在线
    __extern\u inline=extern
    __extern\u始终\u内联=extern
    __延伸__
    __限制
    
    __restrict\u arr
    /usr/include/bits
    是一个内部和编译器专用目录。您不应该需要包含其中的文件,或使用这些头文件中的符号。
    O_RDONLY
    在其中定义。。。因此,我不应该使用
    O_RDONLY
    ,而是直接为
    O_WRONLY
    编写
    0
    (或
    1
    )?只需使用“/usr/include”并让递归处理事情?好吧,看来我错了。或者,我认为libc在内部头文件中定义那些需要外部工具引用的符号是错误的。也许仅仅索引
    /usr/include
    而不是列出特定的文件和子目录会更容易些?我想。。。看起来vim可以很好地处理生成的34 MB文件。
    AM_CTAGSFLAGS =             \
        --recurse=yes           \
        --tag-relative=yes      \
        --extras=*              \
        --fields=*              \
        --c-kinds=*             \
        --language-force=C      \
        /usr/include/bits       \
        /usr/include/fcntl.h    \
        /usr/include/stdio.h    \
        /usr/include/stdlib.h   \
        /usr/include/string.h   \
        /usr/include/sys        \
        /usr/include/unistd.h