Vim的C系语言语义自动补全插件(C/C++自动补全),使用Clang实现(clang_complete,YouCompleteMe)。

17

我在Windows上使用64位Vim,使用这个版本,该版本由Haroogan开发:

+python27
+python33
+huge

我正在尝试使用clang_complete,所以我从这里获取了libclang.dll库,并正确设置了我的vimrc。现在可以找到libclang.dll

但是,当我打开一个*.cpp文件时,我会看到以下消息:

libclang无法找到内置的包含文件,这将导致代码补全变慢

但是我根本就没有自动补全...

我在这篇文章中找到了使用我所使用的Vim版本的人,但没有明确说明该做什么。有人能帮忙吗?

更新

我做了以下事情:

  1. 下载适用于Windows的Vim YouCompleteMe
  2. 下载适用于Windows的LLVM
  3. 从中提取liclang.dll并将其放入YCM python目录
  4. 获取.ycm_extra_conf.py并将其与我的cpp文件一起放置

它基本上可以工作了(没有任何错误消息),但我仍然得到:

no auto


为什么不直接继续线程,直到问题解决呢?这就是问题跟踪器的作用。 - romainl
不是。 - romainl
1个回答

26

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.dllPATH环境变量中(推荐)或者位于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',

它完美地运行了!!!非常感谢,我想我应该写点东西来总结一下你让我做的事情。顺便说一句,我使用了从你那里获取的LLVM中的clang++,但是它没有起作用,然后我使用了mingw64,它完美地工作了...在github上拥有vim-YCM,这样我们就可以将其Vundle吗?无论如何,我会把这些东西写下来,可能会向Val Markovic进行广告宣传。奖励即将到来。 - statquant
如果你的意思是尝试使用Clang编译代码,那当然不行。Clang在Windows上还没有准备好投入生产。即使标准库和运行时也没有完全准备好用于Windows。因此,现在最好在Windows上坚持使用MSVC、MinGW或MinGW-w64。据我记得,也可以从Bitbucket获取Vundle。调查一下,之后告诉我。如果没有从Bitbucket获取Vundle的机会,那么我也会在Github上进行镜像。再次感谢您的测试。 - Alexander Shukaev
是的,那就是我想说的,我不知道clang还没有准备好用于Windows。我会再和你联系关于Bitbucket的事情。你能否请把之前的评论删除以清理帖子?再次感谢。 - statquant
@AlexanderShukaev 感谢您的帖子!经过数小时的尝试设置标志后,我找到了您的答案,自动完成终于可以工作了!而且速度非常快! - user3496846

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接