有更好的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
似乎非常接近你正在寻找( 来源 )。 它仍然使用一个外部数据库(即不会自己动手编制索引),但它似乎提供了一个通常只能在cscope
find的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集成,有一个插件 :
祝你好运。