有更好的selectctags吗?

我刚刚发现了vim的taglist插件,并阅读了如何使用ctags 。

不过,令人失望的ctags是一个非常简单的parsing器。

有没有更完整的select?

具体而言,我正在寻找的东西:

  • 展开函数声明的#define(x, y) x ## y样式macros

  • 处理#include语句

  • 允许为依赖项指定包含path

我看到,铿锵提供了访问C AST的编程API,所以这当然不是很难做到?

有人已经做了吗?

编辑:

这些不会削减:

  • clang_indexer – 不编译; 当它(黑客之后),不工作(无尽的错误)。

  • clang_complete – 似乎没有比ctags更好的了。 没有上下文特定的build议,没有结构完成,没有函数参数,没有macros扩展; 只是一个符号列表和他们来自的文件。

我花了很多时间在这个问题上挣扎。

我所得到的最近的东西叫做gccsense 。 不幸的是,这个项目似乎被放弃了,而且因为英文不是作者的第一语言,所以很难设置它。

我从另一个angular度结束了这个问题。 我决定intellisense / autocomplete对我的代码更重要,而不是具有vim的所有可用function,所以我select了一个IDE,比如Eclipse,然后find了一个模拟Vim的Eclipse插件。 到目前为止,我发现的最好的插件是可行的 。

以下是我尝试过的选项的完整列表,发现不尽如人意:

  • 铛 – 要求你从gcc切换到另一个“更好”的编译器。 问题在于gcc更成熟了[ 编辑显然你不需要切换编译器就可以看到下面的评论,以后我可以再试一次]
  • gccsense – 伟大的想法(使用gcc给你的代码完成),但项目上的工作被放弃:(和版本是testing质量
  • xref是一个很好的独立工具,可以很好的parsingC.它可以在vim中使用vxref ,但是从我的经验来看 ,xref缺lessparsing当前的C ++代码,并且开发已经停止(以及开发在vxref。)
  • eclim – 对使用eclipse的Java支持来说似乎很有效,在分析C ++或C代码时非常缓慢且完全不可靠。 通常发生的事情是一切正常,但是突然之间,parsing器停止parsing你写的任何新的代码,没有什么短缺的加载日食本身和强迫日食重新分析项目似乎帮助。 另外,更重要的一点是,更重要的是eclim接pipe处理错误,所以vim通常会parsinggcc的错误,这意味着你无法访问令人讨厌的quickfix列表。
  • netbeans + jvi – 许多人都以此为荣,但是我对jvi有各种各样的问题。 我遇到的一个主要问题是jvi会说我处于正常模式,但实际上是在插入模式下,没有重启会有帮助。
  • eclipse + viplugin / vrapper – 这开始看起来像是最好的select; 每个人都有自己的缺陷+缺乏特点,但仍然是最有吸引力的,直到我发现可行,这似乎是最稳定和最具特色。

如果你find一个解决scheme,你很高兴,请分享它的评论,因为我会对它感兴趣。

我还没有尝试过,但clang_indexer似乎非常接近你正在寻找( 来源 )。 它仍然使用一个外部数据库(即不会自己动手编制索引),但它似乎提供了一个通常只能在cscopefind的function(它不能很好地支持C ++)。

对于自动完成,我使用了clang_complete 。 它不需要生成索引,大部分时间都工作得很好。 它也可以在vim中自动进行语法检查,所以有人会提出可能的问题。 它不会自动完成您给出的macros示例

 #define blah(x) blah__ ## x void blah_<TAB> 

尽pipebla__x (只有blah(x) )。 这将是很好的,这是更可configuration的,但我不会认为这是破碎的。

CScout版本2.8提供了一个命令行选项(-C),它将为将要处理的C源代码创build一个vim兼容的标签文件。 CScout是一个C程序集合的源代码分析器和重构浏览器。 它可以处理多个项目的工作空间,将由C预处理器引入的复杂性映射回原始的C源代码文件。 因此,生成的标签文件包含实体的正确信息,如通过预处理器macros创build的函数,variables和结构。 CScout将使用代码的项目configuration文件(相当于Makefile)中指定的包含文件path来处理包含文件。 要试用它,请下载与您的设置匹配的包,进入包含awk源代码的示例目录并运行

 ../bin/cscout -Cc awk.cs 

你可以看到CScout可以在这个页面中处理一些types的预处理器结构。 例如,如果您处理以下代码

 #define typefun(name, type, op) \ type type ## _ ## name(type a, type b) { return a op b; } typefun(add, int, +) typefun(sub, int, -) typefun(mul, int, *) typefun(div, int, /) typefun(add, double, +) typefun(sub, double, -) typefun(mul, double, *) typefun(div, double, /) main() { printf("%d\n", int_add(5, 4)); printf("%g\n", double_mul(3.14, 2.0)); } 

CScout将生成一个标签文件,其中包含以下条目。

 double_add test.c 8 ;" f double_div test.c 11 ;" f double_mul test.c 10 ;" f double_sub test.c 9 ;" f int_add test.c 4 ;" f int_div test.c 7 ;" f int_mul test.c 6 ;" f int_sub test.c 5 ;" f main test.c 13 ;" f typefun test.c 1 ;" d 

您可以通过在示例源代码中添加几个代码生成macros来查看CScout将创build的标签, 从而自行尝试

一种可能性是使用Eclim 。 这是一个可以在很多方面使用的强大的工具; 在你的情况下,你将不得不启动一个无头Eclipse服务器,基本上使用Eclipse的索引器等。我认为你需要把你的项目注册为Eclipse项目。

我使用“ 全球 ”系统。 安装完成后,您可以使用“全局”命令search代码和“gtags”进行索引。

我使用Linux内核,它有很多帮助:它定义更智能(但仍然不如我想要的),它知道函数原型,函数实现和代码中所有对函数的引用。

也可以将“全球”与VIM集成,有一个插件 :

祝你好运。