【问题标题】:C-family Semantic Autocompletion Plugins for Vim (C/C++ completion) using Clang (clang_complete, YouCompleteMe)使用 Clang (clang_complete, YouCompleteMe) 的 Vim 的 C 系列语义自动完成插件(C/C++ 完成)
【发布时间】:2013-09-19 00:41:53
【问题描述】:

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

+python27
+python33
+huge

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

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

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

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

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

更新

这是我所做的:

  1. 拍了Vim YouCompleteMe for Windows
  2. 拍了LLVM for Windows
  3. 从中取出 liclang.dll 并将其卡在 YCM python 目录中
  4. .ycm_extra_conf.py 与我的 cpp 文件一起使用

它几乎可以工作(我没有任何错误消息),但我仍然得到:

【问题讨论】:

  • 为什么不简单地继续线程直到问题解决?这就是问题跟踪器的用途。
  • 不,it isn't.

标签: vim autocomplete clang clang-complete libclang


【解决方案1】:

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 ONLY 可以与 Python 2(不是 3)一起工作,因此只需确保您在 PATH 环境中具有 Python 2 DLL(例如 python27.dll)和 Python 2 解释器(python.exe)变量。

如果您需要 LLVM/Clang,也可以从我这里下载:LLVM for Windows。同样,只需确保您在 PATH 环境变量(推荐)中包含 libclang.dll,就在 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 做广告。赏金在路上
  • 如果您的意思是您尝试使用 Clang 编译您的代码,那么它当然不起作用。 Clang 尚未准备好在 Windows 上进行生产。甚至标准库和运行时也没有完全为 Windows 做好准备。这就是为什么现在你最好在 Windows 上坚持使用 MSVC、MinGW 或 MinGW-w64。据我所知,Bitbucket 的 Vundle 也可以。调查一下,稍后告诉我。如果没有机会从 Bitbucket 进行 Vundle,那么我也会在 Github 上进行镜像。再次感谢您的测试。
  • 是的,这就是我的意思,我不知道 clang 还没有为 windows 做好准备。关于bitbucket,我会回来找你的。能否请您删除以前的 cmets 以清理帖子?再次感谢
  • @AlexanderShukaev 谢谢你的帖子!经过数小时尝试设置标志后,我找到了您的答案,并且自动完成功能终于起作用了!而且速度很快!
猜你喜欢
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多