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

标签 vim syntax

给出以下代码:

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

class B {
    void foo();
}

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

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

vim 中是否有一种方法可以推断 a 的类型,这样当我按下 ctrl+] 时,它会立即跳转到 A 的实现::foo() 而不是给我提供一个选择列表?看来应该有这样的插件,只是我找不到它。

更新:目前看来这个问题还没有解决办法,所以我选择了下面exlipy的答案。如果出现解决方案并提供新答案,我将更新此问题的答案。

最佳答案

除非 Vim 能够像 C++ 编译器那样真正解析整个 C++ 翻译单元,否则您想要做的事情是不可能的。这远远超出了 ctags 的范围,它使用非常简单的启发式方法仅标记光标附近的区域。

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

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

它还处于非常早期的阶段,我只是为自己做的,所以不要指望它是一个非常完美的解决方案。

关于vim - vim 中类型推断的 ctags 跳转可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7392886/

相关文章:

vim - 通过:history option in VIM重新执行命令

ruby - 为什么 ctags 对我不起作用?

java - 为什么它总是返回原始值?

objective-c - Objective-C 中一行中的多个逗号分隔调用

c++ - 为什么将函数名用作函数指针等同于将寻址运算符应用于函数名?

vim - 如何使用 Latex-Suite 在 vi​​m 中键入两个左大括号?

Vim 符号栏切换

Vim 删除从字符开始到行尾

syntax - 如何在 SystemVerilog 中以十六进制显示/打印解压类型?

c# - 在 Windows 8.1 的 C# XAML 中,如何将样式绑定(bind)到变量?