新形势下在MSYS2/Mingw下编译安装VIM的YouCompleteMe插件

关于在Win下使用vim的教程,已经有了一些。关于在win版本的vim下使用YouCompleteMe插件的教程,也已经有了一些。

但是,都有点旧了。主要问题点在于:

  1. 现在MSYS2已经提供了足够好用的vimclang预编译版本,不用再去找源码和编译了;
  2. vim毕竟还是用在开发上,既然开发多用MSYS2环境,那么搞一个独立于MSYS2vim意义不大;
  3. YouCompleteMe插件的作者对win很有些看法,所以提供的源码对Windows(包括Windows下的MSYS2)支持不好,具体表现在: + Cmake相关文件完全不考虑mingw + 官方gay♂hub上的关于在Window*nix环境下编译ycm的教程,居然也已经过时了
  4. 网上前人教程中提到的一些编译方法,与官方gay♂hub上的相关内容很像,但是在 ~~新形势下~~也已经玩不转了。

鉴于这些原因,我觉得重新写一个教程是有必要的。探索过程过于复杂,就不写了,只写简要步骤。

  1. 安装MSYS2 x64版,在msys主环境中安装make工具,在mingw64环境下安装基本的编译环境,包括gcc相关,clang相关,cmakepython2等(对python3的支持还是不好);
  2. pacman -S vim 安装预编译的vim,确认其支持python插件;注意一点:这货是处在MSYS环境下的,安装到这里之后意味着mingw32/64两个分支中都可以用它;
  3. 按说明安装`vim-plug`,目前感觉比vundle好用那么一点?
  4. 自行安装其他的vim插件,做基本配置;
  5. 添加Plug 'Valloric/YouCompleteMe', {'for': 'cpp'}.vimrc中添加插件那一段;不要像某些教程教的再加上do:install ...来搞自动编译一类的,因为mingw环境下肯定自动不过去;
  6. vim:PlugInstall来实际安装YouCompleteMe插件,应该看到安装成功;但是,这时仅仅是安装了vim这一块与ycm核心进行交互的这一部分,ycm核心必须在本机上编译;
  7. 此时,你打开vim的话,可以看到YouCompleteMe抱怨说找不到核心库,必须按文档编译;输入:messages可以查看完整错误信息;
  8. cd进入.vim/plugged/YouCompleteMe/third_party/ycmd,新建各目录用来手动编译,我建议叫.build,因为官方的自动编译脚本自护也在用它。
  9. 启动cmake-gui,编译目录自然就是新建的.build,源码目录设置为.vim/plugged/YouCompleteMe/third_party/ycmd/cpp类型选择为MSYS Makefiles,这一点与其他教程不同
  10. 有一个隐藏选项是用clang-tidy检查代码规范,我们是手动编译所以需要手动打开,强制增加一个bool变量叫USE_CLANG_TIDY,设置为true;构建类型记得选ReleaseUSE_CLANG_COMPLETER自然也要选上;
  11. 使用系统clangboost这两项他们都建议不选,所以我也没选;
  12. 检查一下cmake是否找到了正确的python开发环境,这里我用的是mingw64子环境中安装的python,不是msys环境下的python;也许msys环境下的python也能用,但必须记住你用的是哪一个,保持一致很重要,很重要,很重要
  13. INSTALL_PATH无所谓,反正实际上用不着——所以这个CMake用的并不标准;
  14. Generate并退出,现在不要编译,需要改一些文件。
  15. 按官方文档的说法,需要在YouCompleteMe\third_party\ycmd\cpp\CMakeLists.txt添加如下几行(我加在的project语句后面): set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -include cmath") add_definitions(-DBOOST_PYTHON_SOURCE) add_definitions(-DBOOST_THREAD_BUILD_DLL) add_definitions(-DMS_WIN64)
  16. 上面那几句不太懂啥意思,反正添加前后编译过程是由巨大改变的——本来可以直接过去,改了之后报了一堆“警告被当作错误处理:头文件没有正确排序”的错误,需要动手一一调换#include语句的顺序。不多,十个左右吧,改一下make一遍很快;
  17. 官方文档中还说要改一句tss_cleanup_implemented什么的,没找到,没理;
  18. make而不是mingw中的mingw32-make来编译;这一点很重要,如果用的是cmake生成的用于mingw32-make的文件,会报一大堆找不到头文件一类的错误,似乎是编译器不认cmake中设置的包含目录,我没心情去一一改成绝对路径看它最终能不能编译;
  19. 编译完成,YouCompleteMe/third_party/ycmd/文件夹中应该出现libclang.dll文件和ycm_core.pyd文件,没有的话检查哪里做错了;
  20. 此时,再次在vim中打开一个cpp文件,YouCompleteMe应该不会抱怨找不到核心库了,我这里换成了“你用python2编译的核心库,但现在路径里面的默认值是python3,这个不行,需要设置xxxx”,同样是用:message产看全部信息;
  21. 设置正确的python解析器的方法,就是在.vimrc里面加一行:let g:ycm_server_python_interpreter="/mingw64/bin/python2"注意,你刚才编译用的是哪里的python,这里就得设置成那个python,我一开始时编译用了mingw64里面的python2,运行环境设置成了msys2里面安装的python2,结果时错误信息回到了“没有检测到核心库”的状态,估计是相关进程直接崩了;
  22. 没其他问题的话,重新打开一个cpp文件,应该看不错任何错误信息(或者只有一条说没有.ycm_extra_conf.py,所以补全功能发挥的不完整的信息),并且开始补全。

  • 最后更改: 2019/05/27 14:03