为什么 YouCompleteMe 在 dot 之后不起作用?

Why YouCompleteMe does not work after dot?

我已经按照安装指南安装了YouCompleteMe。我在 Windows 机器上使用 gVim。基本的符号完成工作正常,但我无法从我的 headers.

自动完成

如果我有:

#include <vector>
using namespace std;
vector<int> myVector;

那么将找不到 myVector.<smth like push_back etc...>

的完成

Vim 状态栏显示:

--User defined completion (^U^N^P) Pattern not found

--Omni completion (^O^N^P) Pattern not found

诊断

我开始诊断问题。 :YcmDiags 命令给出了来自 header 个文件的错误列表。由于 YouCompleteMe 使用 clang 不断编译源代码,我尝试用 clang 编译我的文件。我也知道我应该在 .ycm_extra_conf.py 的标志中为 clang 指定命令行选项。我不知道 YCM 是否运行 clang.execlang-cl.exe 但我实际上成功编译了我的 .cpp 文件从命令行在 运行 vsvars32.bat 之后手动使用 clang-cl.exe。我使用clang.exe.

编译没有成功

这是我的 .ycm_extra_conf.py 文件标志部分:

flags = [ 
'-std=c++11',
'-x', 'c++',
'-I', 'C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include',
'-I', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.10150.0/ucrt',
'-I', 'C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/atlmfc/include',
'-I', 'C:/Program Files (x86)/Windows Kits/NETFXSDK/4.6/include/um',
'-I', 'C:/Program Files (x86)/Windows Kits/8.1/Include/um',
'-I', 'C:/Program Files (x86)/Windows Kits/8.1/Include/shared',
'-I', 'C:/Program Files (x86)/Windows Kits/8.1/Include/winrt',
'/link', '/LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib" /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\lib" /LIBPATH:"C:\Program Files (x86)\Windows Kits\lib.0.10150.0\ucrt\x86" /LIBPATH:"C:\Program Files (x86)\Windows Kits.1\lib\winv6.3\um\x86"',
'/EHsc']

micbou 给了我一个 answer 这个问题。

On Windows, Clang uses i686-pc-windows-gnu on 32-bit and x86_64-w64-windows-gnu on 64-bit as its default target. You need to change it to MSVC by adding the following flag:

flags = [ '--target=<arch>-pc-windows-msvc<xx.yy.zzzzz>' ] where is i686 on 32-bit, x86_64 on 64-bit and <xx.yy.zzzzz> is the version of MSVC. You can found it by running the VC++ compiler cl.exe. In your case, since you are using MSVC 14 on 32-bit, the target should be i686-pc-windows-msvc19.00.23506.

With the include flags you already added, you should get completions from the headers.

在我的特殊情况下 --target=x86_64-pc-windows-msvc19.00.23026 标记解决了问题。

这与 YCM 无关,只是回答普通方法。

我通常在 linux 上做的是扩展 path 以包含标准库 headers,例如:

set path+=/usr/include/**

那么,我们可以使用Ctrl-p或者Ctrl-n.