【问题标题】:How to setup ctags for linux C development?如何为 linux C 开发设置 ctags?
【发布时间】:2018-12-21 15:28:15
【问题描述】:

我开始在 Linux 下进行 C 开发。但是,我正在努力正确设置 ctags 以使用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/...)。所以我添加了这些。

但我觉得这么多年过去了,总得有人想出更好的解决方案。那么,这通常是怎么做的呢?

【问题讨论】:

  • /usr/include/bits 是一个 internalcompiler private 目录。您永远不需要从那里包含文件,或使用这些头文件中的符号。
  • O_RDONLY 在那里定义...所以我不应该使用O_RDONLY 而是直接写0(或1 for O_WRONLY)?
  • 只要有“/usr/include”,让递归处理?
  • 好吧,看来我错了。或者更确切地说,我认为 libc 在需要由外部工具引用的内部头文件中定义这些符号是错误的。也许只索引/usr/include 而不是列出特定文件和子目录会更容易?
  • 我猜...看来 vim 可以很好地处理生成的 34 MB 文件。

标签: c linux ctags exuberant-ctags universal-ctags


【解决方案1】:

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

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

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

我通常有一个用于 ANSI C 标头(或 C++,如果您使用它)的单个标签文件,适用于特定标准(通常是 c99.c++11,如果您使用 C++),这通常是我的“其他一切” " 标签文件。

最困难的部分是将忽略列表中的内容提供给 ctags。由于您使用的是 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

这是最重要的部分。如果您在运行 ctags 的标头上没有看到太多输出,那可能就是正在发生的事情。它让我发疯,直到我弄清楚这一点。这些可以防止 ctags 被愚弄。

就输入到 ctags 中的标题而言,您的想法是正确的。不要忘记编译器特定的系统头文件,它们通常位于 /usr/include/x86_64-linux-gnu 等其他地方。如有必要,这些将帮助您深入了解系统的常量。

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 2010-10-05
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多