0

考虑这个简单的代码:

#include <vector>
#include <string>

using namespace std;
vector<string> vec1;
//vec1.  //completion does not work AND break the completion that used to work if left without semicolon.

int main(){

    vector<string> vec2;
    vec2.push_back("sometext"); //completion works
    vec1.push_back("sometext"); //works here too

    return 0;
}

当我输入“vec2”时。或“vec1”。在我键入点后,我会立即看到字符串类型的所有方法的下拉列表。所以它在这里工作。

这是它变得奇怪的方式:

1)当我做“vec1”时。在 main 之前的全局范围内,我在下拉菜单中看到了错误的选项(命名空间、使用、asm、typedef、using、static_assert、extern 等)。而且它根本找不到'push_back'(“找不到用户定义的完成(^U^P^N)模式)

2)现在,如果我没有完成这一行并且忘记放一个分号,那么我就不能像以前那样在 main() 中正确地自动完成!

只有我运行的插件是 clang_complete 和 supertab。我尝试不使用 supertab 并使用各种 _vimrc 和 .clang_complete 设置,但没有任何好处。我在win7上,llvm/libclang来自官方网站。出现这样的错误是正常的吗?

4

1 回答 1

0

该插件完全依赖 libclang 来完成补全,这反过来只完成或多或少有效的代码(我认为它可以原谅解析器能够从中恢复的光标之前的一些错误,而光标之后的代码可以包含更严重的错误)。

全局范围的语句不在 C++ 的有效语法结构中。这可能会混淆 clang 的解析,使其返回一些与当前上下文无关的通用完成列表。

我认为任何使用 clang 的补全系统都会出现这种行为,除非它以某种方式明确解决。

于 2018-06-29T14:27:25.667 回答