如何为Linux C开发设置ctags?

时间:2018-12-21 15:28:16

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

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

但是,这些年来,我觉得某个地方必须有人提出更好的解决方案。那么,通常如何做?

1 个答案:

答案 0 :(得分:1)

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

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

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

我通常为单个ANSI C标头(或C ++,如果使用的是C ++)有一个标签文件,该文件适合于特定标准(通常是c99。如果使用C ++,则为c ++ 11),这通常是我的“其他所有东西” “标记文件。

最困难的部分是将忽略列表提供给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的标头的大量输出,则可能是这种情况。直到我想通了,这让我发疯。那些使ctag不受欺骗。

对于输入到ctags中的标头,您有正确的想法。不要忘记特定于编译器的系统头文件,这些文件头通常位于/ usr / include / x86_64-linux-gnu之类的其他位置。这些将在必要时帮助您深入研究系统常数。