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
。
YouCompleteMe
现在我不再使用clang_complete
了。有一款更强大的语义自动完成插件供Vim使用,就是YouCompleteMe. 我强烈建议您试用它。对于C家族语言(C/C++/Objective-C/Objective-C++)的语义自动补全,它也使用libclang
。它依赖于一个强大的C++后端,因此非常快速。它与另一个必备的Vim插件syntastic很好地集成。它可以跳转到定义等。
由于它是用C++编写的,并通过Python与Vim结合,所以您需要编译C++后端。为了缓解痛苦,您可以从我的Vim YouCompleteMe for Windows中下载预构建的YCM插件。我已经为x86和x64架构都构建了它。本地组件称为ycm_core.pyd
。通常,您选择的Vim版本的体系结构必须与YCM版本(即ycm_core.pyd
)匹配。YCM仅与Python 2(而非3)兼容,因此请确保在PATH
环境变量中存在Python 2 DLL(例如python27.dll
)和Python 2解释器(python.exe
)。
如果您需要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',