有没有替代ctags更好的?

时间:2011-10-13 01:33:35

标签: vim ctags

我刚刚发现了vim的taglist插件,并阅读了how to use it with ctags

然而,令人失望的是ctags是一个非常简单的解析器。

是否有更完整的替代方案?

具体来说,我正在寻找以下内容:

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

  • 处理#include语句

  • 允许为依赖项指定包含路径

我看到clang为访问c AST提供了一个程序api,所以这肯定不是很难吗?

有人已经完成了吗?

-

编辑:

这些不会削减它:

  • clang_indexer - 不编译;什么时候(黑客攻击后),不起作用(无休止的错误)。

  • clang_complete - 似乎没有比ctags好。没有特定于上下文的建议,没有结构完成,没有函数参数,没有宏扩展;只是一个符号列表和它们来自的文件。

5 个答案:

答案 0 :(得分:23)

我花了很多时间自己努力解决这个问题。

我得到的最接近的是gccsense。不幸的是,这个项目似乎已经被放弃了,而且很难设置它,因为英语不是作者的第一语言。

我最后从另一个角度解决了这个问题。我决定智能感知/自动完成对于我的编码比拥有vim的所有可用功能更重要,所以我选择了像Eclipse这样的IDE,然后找到了一个模拟Vim的Eclipse插件。到目前为止,我发现的最好的插件类型是Viable

以下是我尝试过但发现不满意的完整选项列表:

  • clang - 要求您从gcc切换到另一个“更好”的编译器。问题是gcc更成熟[编辑显然你不需要切换编译器看下面的评论,我可能会在将来再试一次。]
  • gccsense - 很棒的主意(使用gcc为你完成代码)然而,该项目的工作被放弃了:(而且版本是beta版本
  • vim中的
  • xref - xref是一个很棒的独立工具,非常适合解析C.它可以在vim中使用vxref,但是根据我的经验,xref缺乏解析当前的C ++代码并且它的开发已经停止(以及在vxref上的开发。)
  • eclim - 使用eclipse似乎非常适合Java支持,在解析C ++或C代码时非常慢且完全不可靠。通常发生的事情是一切都工作了很长一段时间,但突然间,解析器停止解析你编写的任何新代码,并且没有任何东西加载eclipse本身并迫使eclipse重新解析项目似乎有所帮助。此外,不是一个重要的事实,但更令人烦恼的是eclim接管处理错误,因此它搞砸了vim通常从gcc解析错误的方式,这意味着你无法访问令人讨厌的quickfix列表。
  • netbeans + jvi - 很多人发誓这个,但我有各种各样的jvi问题。我遇到的一个主要问题是jvi会说我处于正常模式,但实际上处于插入模式,没有任何重启会有所帮助。
  • eclipse + viplugin / vrapper - 这开始看起来像是最好的选择;每个都有自己的一组错误+缺乏功能,但仍然是最有吸引力的,直到我发现它似乎是最稳定和最具特色的可行。

如果您确实找到了您满意的解决方案,请在评论中分享,因为我会对此感兴趣。

答案 1 :(得分:7)

我自己还没试过,但clang_indexer似乎非常接近你所寻找的(sources)。它仍然使用外部数据库(即本身不进行索引),但它似乎提供了通常只能在cscope中找到的功能(它不能很好地支持C ++)。

对于自动填充,我使用clang_complete。它不需要生成索引,并且大部分时间都可以正常工作。它还可以在vim中进行自动语法检查,以便警告可能出现的问题。它不会自动完成您提供的宏示例

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

尽管bla__x(仅作为blah(x))。如果能够更好地配置它会很好,但我也不认为这会破坏。

答案 2 :(得分:3)

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

../bin/cscout -Cc awk.cs

您可以在this page中看到 CScout 可以处理的某些类型的预处理器构造。例如,如果您处理以下代码

#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

您可以通过在示例源代码中添加一些代码生成宏来自行尝试,以查看 CScout 将创建的标记。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我使用'global'系统。安装后,您可以使用'global'命令搜索代码,使用'gtags'进行索引编制。

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

也可以将'global'与VIM集成,有a plugin for it

祝你好运。