我刚刚发现了vim的taglist插件,并阅读了how to use it with ctags。
然而,令人失望的是ctags是一个非常简单的解析器。
是否有更完整的替代方案?
具体来说,我正在寻找以下内容:
扩展函数声明的#define(x, y) x ## y
样式宏
处理#include
语句
允许为依赖项指定包含路径
我看到clang为访问c AST提供了一个程序api,所以这肯定不是很难吗?
有人已经完成了吗?
-
编辑:
这些不会削减它:
clang_indexer - 不编译;什么时候(黑客攻击后),不起作用(无休止的错误)。
clang_complete - 似乎没有比ctags好。没有特定于上下文的建议,没有结构完成,没有函数参数,没有宏扩展;只是一个符号列表和它们来自的文件。
答案 0 :(得分:23)
我花了很多时间自己努力解决这个问题。
我得到的最接近的是gccsense。不幸的是,这个项目似乎已经被放弃了,而且很难设置它,因为英语不是作者的第一语言。
我最后从另一个角度解决了这个问题。我决定智能感知/自动完成对于我的编码比拥有vim的所有可用功能更重要,所以我选择了像Eclipse这样的IDE,然后找到了一个模拟Vim的Eclipse插件。到目前为止,我发现的最好的插件类型是Viable。
以下是我尝试过但发现不满意的完整选项列表:
如果您确实找到了您满意的解决方案,请在评论中分享,因为我会对此感兴趣。
答案 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:
祝你好运。