使用Clang(clang_complete,YouCompleteMe)进行Vim(C / C ++完成)的C系列语义自动完成插件

时间:2013-09-14 11:40:39

标签: vim autocomplete clang clang-complete libclang

我在Windows上使用64位Vim,this version使用Haroogan

+python27
+python33
+huge

我正在尝试使用clang_complete,因此我使用libclang.dllhere并正确设置了vimrc。找到libclang.dll

但是,当我打开*.cpp文件时,我现在有一条消息:

  

libclang找不到内置包含这会导致慢   完成代码

但我根本没有完成......

我找到了this post与我使用的构建Vim版本的人,但没有明确指示该怎么做。有人可以帮忙吗?

更新

这是我做的:

  1. 取得Vim YouCompleteMe for Windows
  2. 取得LLVM for Windows
  3. 从中获取liclang.dll并将其粘贴在YCM python目录中
  4. 拿出.ycm_extra_conf.py并将其粘贴在我的cpp文件
  5. 它几乎可以工作(我没有任何错误信息),但我仍然得到: no auto

1 个答案:

答案 0 :(得分:25)

clang_complete


感谢您使用 Vim for Windows ,希望您喜欢。

要解决您的问题,您必须使用.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 ++后端,因此非常快。它与 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) ONLY 工作,所以只需要确保你有Python 2 DLL(例如python27.dll)和Python 2 Interpreter(python.exePATH环境变量。

如果您需要LLVM / Clang,也可以从我这里下载: LLVM for Windows 。同样,请确保libclang.dll旁边的PATH环境变量(推荐) OR 中有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',