如何为 linux C 开发设置 ctags?

How to setup ctags for linux C development?

我正在 Linux 下进行 C 语言开发。但是,我正在努力正确设置 ctags 以使用 vim。它正确地注册了 tags 文件并根据它提供补全。

我不确定获取“必要”包括的正确方法是什么。目前我有一些 "hand-picked" headers:

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

第一步,我只是把 headers 和 #include ... 一样,但是漏掉了一些东西(比如 /usr/include/bits/...)。所以我添加了这些。

但我觉得经过这么多年,某个地方的某个人必须想出更好的解决方案。那么,这通常是如何完成的呢?

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

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

  1. 为您的系统使用的逻辑组件生成一个标签文件。逻辑组件通常是您可能认为是其他语言的导入(即我正在使用 OpenGL 或某些声音库)。
  2. 对于给定的逻辑组件,您可能不得不忽略 header 文件中的某些文本。这是为了防止 ctags 程序误解某些结构,从而在生成的文件中歪曲那些特定的标签(想想预处理器宏或编译器指令)或者根本不将它们放入输出文件 .
  3. 修改您的路径 Vim 变量以按顺序指向您生成的文件。我选择 innermost-out 模式。首先是项目代码本身,然后是项目中的库,然后是单独的系统库,最后是表示 "everything else".
  4. 的最终标记文件

我通常有一个适用于特定标准的 ANSI C headers(或 C++,如果你使用它)的标签文件(如果你使用 C++,通常是 c99.c++11),这通常是我的 "everything else" 标签文件。

最难的部分是将忽略列表提供给 ctags。由于您使用的是 C,我假设您使用系统中的 C headers(只是该语言应该可用的 compiler-standard)。我在生成这些时使用以下忽略列表(在 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

这是最重要的部分。如果你没有看到你有 运行 ctags 的 headers 的很多输出,这可能就是正在发生的事情。在我弄清楚这一点之前,它让我发疯。这些可以防止 ctags 被愚弄。

就 ctags 中的 headers 输入而言,您的想法是正确的。不要忘记通常位于其他地方的 compiler-specific 系统 header,例如 /usr/include/x86_64-linux-gnu。如有必要,这些将帮助您深入了解系统的常量。