# 新形势下在MSYS2/Mingw下编译安装VIM的YouCompleteMe插件 关于在`Win`下使用`vim`的教程,已经有了一些。关于在`win`版本的`vim`下使用`YouCompleteMe`插件的教程,也已经有了一些。 但是,都有点旧了。主要问题点在于: 1. 现在`MSYS2`已经提供了足够好用的`vim`和`clang`的**预编译**版本,不用再去找源码和编译了; 2. `vim`毕竟还是用在开发上,既然开发多用`MSYS2`环境,那么搞一个独立于`MSYS2`的`vim`意义不大; 3. `YouCompleteMe`插件的作者对`win`很有些看法,所以提供的源码对`Windows`(包括`Windows`下的`MSYS2`)支持不好,具体表现在: + `Cmake`相关文件完全不考虑`mingw` + 官方`gay♂hub`上的关于在`Window`下`*nix`环境下编译`ycm`的教程,居然也已经过时了 4. 网上前人教程中提到的一些编译方法,与官方`gay♂hub`上的相关内容很像,但是在 ~~新形势下~~也已经玩不转了。 鉴于这些原因,我觉得重新写一个教程是有必要的。探索过程过于复杂,就不写了,只写简要步骤。 1. 安装`MSYS2 x64`版,在`msys`主环境中安装`make`工具,在`mingw64`环境下安装基本的编译环境,包括`gcc`相关,`clang`相关,`cmake`,`python2`等(对`python3`的支持还是不好); 2. `pacman -S vim` 安装预编译的`vim`,确认其支持`python`插件;注意一点:这货是处在`MSYS`环境下的,安装到这里之后意味着`mingw32/64`两个分支中都可以用它; 3. [按说明安装`vim-plug`](https://github.com/junegunn/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`可以查看完整错误信息; 7. cd进入`.vim/plugged/YouCompleteMe/third_party/ycmd`,新建各目录用来手动编译,我建议叫`.build`,因为官方的自动编译脚本自护也在用它。 8. 启动`cmake-gui`,编译目录自然就是新建的`.build`,源码目录设置为`.vim/plugged/YouCompleteMe/third_party/ycmd/cpp`,**类型选择为`MSYS` Makefiles,这一点与其他教程不同**; 9. 有一个隐藏选项是用`clang-tidy`检查代码规范,我们是手动编译所以需要手动打开,强制增加一个`bool`变量叫`USE_CLANG_TIDY`,设置为`true`;构建类型记得选`Release`;`USE_CLANG_COMPLETER`自然也要选上; 10. 使用系统`clang`和`boost`这两项他们都建议不选,所以我也没选; 11. 检查一下`cmake`是否找到了正确的`python`开发环境,**这里我用的是mingw64子环境中安装的python,不是msys环境下的python;也许msys环境下的python也能用,但必须记住你用的是哪一个,保持一致很重要,很重要,很重要**; 12. `INSTALL_PATH`无所谓,反正实际上用不着——所以这个CMake用的并不标准; 13. Generate并退出,现在不要编译,需要改一些文件。 14. 按官方文档的说法,需要在`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)``` 15. 上面那几句不太懂啥意思,反正添加前后编译过程是由巨大改变的——本来可以直接过去,改了之后报了一堆“警告被当作错误处理:头文件没有正确排序”的错误,需要动手一一调换`#include`语句的顺序。不多,十个左右吧,改一下`make`一遍很快; 16. 官方文档中还说要改一句`tss_cleanup_implemented`什么的,没找到,没理; 17. 用`make`而不是`mingw`中的`mingw32-make`来编译;这一点很重要,如果用的是`cmake`生成的用于`mingw32-make`的文件,会报一大堆找不到头文件一类的错误,似乎是编译器不认`cmake`中设置的包含目录,我没心情去一一改成绝对路径看它最终能不能编译; 18. 编译完成,`YouCompleteMe/third_party/ycmd/`文件夹中应该出现`libclang.dll`文件和`ycm_core.pyd`文件,没有的话检查哪里做错了; 19. 此时,再次在`vim`中打开一个`cpp`文件,`YouCompleteMe`应该不会抱怨找不到核心库了,我这里换成了“你用python2编译的核心库,但现在路径里面的默认值是`python3`,这个不行,需要设置xxxx”,同样是用`:message`产看全部信息; 20. 设置正确的`python`解析器的方法,就是在`.vimrc`里面加一行:`let g:ycm_server_python_interpreter="/mingw64/bin/python2"`,**注意,你刚才编译用的是哪里的python,这里就得设置成那个python**,我一开始时编译用了`mingw64`里面的`python2`,运行环境设置成了`msys2`里面安装的`python2`,结果时错误信息回到了“没有检测到核心库”的状态,估计是相关进程直接崩了; 21. 没其他问题的话,重新打开一个cpp文件,应该看不错任何错误信息(或者只有一条说没有`.ycm_extra_conf.py`,所以补全功能发挥的不完整的信息),并且开始补全。 {{:windows:gnu:msys_vim_demo.png?direct|}}