为什么 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.exe 或 clang-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.
我已经按照安装指南安装了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.exe 或 clang-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 andx86_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 isi686
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++ compilercl.exe
. In your case, since you are using MSVC 14 on 32-bit, the target should bei686-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.