类型推断ctags在vim中可能跳转吗?

时间:2011-09-12 19:24:00

标签: vim syntax

给出以下代码:

// MyClass.h
class A {
    void foo();
}

class B {
    void foo();
}

// MyClass.cpp
void main() {
    A a();
    a.foo();
}

鉴于我正在使用vim并生成了我的ctags,如果我将光标放在foo()中的main()并点击ctrl+],我将获得一个实现列表foo,因为不止一个。如果只有一个,那么它会立即跳转到该实现。

在vim中是否有一种方式可以推断a的类型,这样当我点击ctrl+]时,它会立即跳转到A::foo()的实现,而不是向我提供选择清单?看起来这样的插件应该存在,而我却无法找到它。

更新:目前似乎没有解决此问题的方法,所以我在下面选择了exclipy的答案。如果解决方案出现并提供新答案,我将更新此问题的答案。

1 个答案:

答案 0 :(得分:4)

除非Vim能够像C ++编译器那样实际解析整个C ++翻译单元,否则你不可能做什么。这远远超出了ctags的范围,ctags使用非常简单的启发式方法来仅仅标记化光标附近。

所以明显的解决方案是......将C ++解析器插入Vim!实际上有一个名为clang_complete的插件,它已经完成了对Clang C ++解析器挂钩的大部分工作。从这个基础来看,扩展它以使用Clang API实现跳转到定义应该是一件简单的事情。

事实上,我已经开始研究这样一个功能,通过两个项目:clang_indexer,它抓取源树以在磁盘上构建索引,以及我的clang_complete分叉,它增加了查询光标下符号用法索引的功能。这实际上比您所追求的要多一些,因为我的目标是“查找所有引用”功能(可以选择将结果过滤为定义)。

这是在一个非常早期的阶段,我只为自己做,所以不要指望它是非常精致的解决方案。