代码之家  ›  专栏  ›  技术社区  ›  graywolf

如何为linux c开发设置ctag?

  •  1
  • graywolf  · 技术社区  · 6 年前

    我正在进入linux下的c开发阶段,但是我需要正确地设置ctag来与vim一起工作。VIM正确记录 tags 并提供基于它的完成。

    然而,我不知道什么样的方式才能得到“必要”的包括。目前我有一些“精选”标题:

    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
    

    一开始我只是放了和我一样的标题 #include ... 但是漏掉了一些东西 /usr/include/bits/... )所以我加了这些。

    但我觉得这么多年之后,总得有人想出更好的解决办法。那么,这通常是怎么做的呢?

    0 回复  |  直到 6 年前
        1
  •  1
  •   David Harrison    6 年前

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

    我已经使用这种方法很多年了,下面是我的使用方法:

    1. 为系统使用的逻辑组件生成标记文件。逻辑组件通常是您可能认为是其他语言中的导入(即,我正在使用opengl或某个声音库)。
    2. 对于给定的逻辑组件,可能必须忽略头文件中的某些文本。这是为了防止ctags程序曲解某些结构,从而在生成的文件中曲解那些特定的标记(想想预处理器宏或编译器指令) 或者根本不把它们放到输出文件中 .
    3. 修改path vim变量以指向您生成的文件。我选择一个最里面最外面的模式。首先是项目代码本身,然后是项目中的库,接着是单独的系统库,最后是表示“其他所有内容”的最终标记文件。

    我通常有一个用于ANSI C头文件的标签文件(或者C++,如果您使用它)适合特定的标准(通常是C99)。C++ 11如果你使用C++,它通常是我的“其他一切”标签文件。

    最困难的部分是将忽略列表中的内容提供给ctag。因为您使用的是c,所以我假设您使用的是系统中的c头(只是编译器标准的头,应该可以与该语言一起使用)。当我生成这些文件时(在ubuntu 14.04上),我使用以下忽略列表:

    __attribute__
    __attribute_deprecated__
    __attribute_format_arg__+
    __attribute_format_strfmon__+
    __attribute_malloc__
    __attribute_noinline__
    __attribute_pure__
    __attribute_used__
    __attribute_warn_unused_result__
    __attribute_alloc_size__+
    __attribute_const__
    __attribute_artificial__
    __wur
    __THROW
    __THROWNL
    __BEGIN_DECLS
    __END_DECLS
    __BEGIN_NAMESPACE_STD
    __END_NAMESPACE_STD
    __USING_NAMESPACE_STD+
    __BEGIN_NAMESPACE_C99
    __END_NAMESPACE_C99
    __USING_NAMESPACE_C99+
    __warndecl+
    __warnattr+
    __errordecl+
    __flexarr=[]
    __fortify_function
    __REDICRECT+
    __REDIRECT_NTH+
    __REDIRECT_NTHNL+
    __ASMNAME+
    __ASMNAME2+
    __nonnull+
    __always_inline
    __extern_inline=extern
    __extern_always_inline=extern
    __extension__
    __restrict
    __restrict_arr

    这是最重要的部分。如果您没有看到运行ctag的头的很多输出,那可能就是问题所在。这让我发疯,直到我弄明白。那些能防止CTAG上当受骗。

    至于输入到ctag中的头,您有正确的想法。不要忘记编译器特定的系统头,它们通常位于其他地方,比如/usr/include/x86_64-linux-gnu。如果需要的话,这些将帮助您深入到系统的常量。