clang_complete
感谢您使用Windows 版 Vim,希望您喜欢。
要解决您的问题,您必须使用.clang_complete
文件。阅读更多关于它的信息:h clang_complete
。简而言之,您可以将此文件放入任何项目的根目录中(即,对于每个项目,此文件可能不同,这是完全有意义的,因为不同的项目具有不同的工具链配置)。这是 MinGW-w64 工具链的示例:
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/x86_64-w64-mingw32
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/backward
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include
-ID:/Toolchains/x64/MinGW-w64/4.8.1/lib/gcc/x86_64-w64-mingw32/4.8.1/include-fixed
-ID:/Toolchains/x64/MinGW-w64/4.8.1/x86_64-w64-mingw32/include
-ID:/Libraries/x64/MinGW-w64/4.8.1/Boost/1.54.0/include
-ID:/Libraries/x64/MinGW-w64/4.8.1/Qt/4.8.5/include
-ID:/Libraries/x64/MinGW-w64/4.8.1/Eigen/3.1.3/include
"-ID:/Libraries/x64/MinGW-w64/4.8.1/Example with Spaces/0.0.1/include"
-std=c++11
-DUNICODE
当您使用 Vim 编辑项目中的某个文件时,会clang_complete
向后遍历已编辑文件的所有父目录,直到它偶然发现.clang_complete
要读取的第一个文件。然后它读取所有这些标志/开关/定义并在调用libclang
完成期间使用它们。
你完成我
这些天,我不再使用clang_complete
了。Vim 我们那里有更强大的语义自动完成插件。是YouCompleteMe。我强烈建议您尝试一下。对于 C 系列语言(C/C++/Objective-C/Objective-C++)的语义完成,它也使用libclang
。它依赖于强大的 C++ 后端,因此速度非常快。它与syntastic有很好的集成(另一个必须有 Vim 插件)。它具有跳转到定义的能力,等等。
由于它是用 C++ 编写的并通过 Python 与 Vim 相连,因此您必须编译 C++ 后端。为了减轻痛苦,您可以从我的Vim YouCompleteMe for Windows下载预构建并准备使用的 YCM 插件。我已经为 x86 和 x64 架构构建了它。本机组件称为ycm_core.pyd
. 像往常一样,您选择的 Vim 构建的体系结构必须与 YCM 构建相匹配(即ycm_core.pyd
)。YCM只能与 Python 2(而不是 3)一起工作,因此只需确保环境变量中有 Python 2 DLL(例如python27.dll
)和 Python 2 解释器(python.exe
) 。PATH
如果你需要 LLVM/Clang,你也可以从我这里下载:LLVM for Windows。同样,只需确保您libclang.dll
在PATH
环境变量中(推荐)或ycm_core.pyd
. 再次支持 x86 和 x64 架构,并且该架构应该再次匹配 Vim 和 YCM 的架构。
关于完成:
他应该神奇地找到STL在哪里吗?
当然不是!这只是一个基于 Clang 前端的自动补全系统。它应该如何知道您当前正在使用哪个工具链来编译您的代码?你可以使用任何东西:Visual C++、Borland C++、GCC、MinGW、MinGW-w64、LLVM/Clang 等。它们每个都有自己的标准库和运行时提供。因此,在每种情况下,您都必须指定当前工具链用于查找标准包含的所有路径。
例如,对于 GCC、MinGW、MinGW-w64,您可以在 POSIX shell 中运行以下命令:
g++ -E -x c++ - -v < /dev/null
或在 Windows 命令提示符中:
g++ -E -x c++ - -v < nul
并寻找以下摘录:
#include <...> search starts here:
d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++
d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/x86_64-w64-mingw32
d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/backward
d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include
d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/include-fixed
d:\toolchains\x64\mingw-w64\4.8.1\posix\seh\bin\../lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/include
End of search list.
这会告诉您标准的所有路径,包括在编译代码期间隐式使用的 GCC、MinGW、MinGW-w64。
对于 LLVM/Clang,你可以这样做:
clang++ -E -x c++ - -v < /dev/null
或者:
clang++ -E -x c++ - -v < nul
当您知道路径后,您可以愉快地将它们添加到.ycm_extra_conf.py
. 例如,就我而言:
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/x86_64-w64-mingw32',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++/backward',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/lib/gcc/x86_64-w64-mingw32/4.8.1/include-fixed',
'-I',
'D:/Toolchains/x64/MinGW-w64/4.8.1/POSIX/SEH/x86_64-w64-mingw32/include',