前言

用VIM写代码也有很多年了,一直使用其内嵌的自动补全。这种补全没有任何语义分析,仅仅根据当前打开的文件,收集所有的单词形成一个补全库。在输入时,根据已经输入的字母,用逐个字母匹配的方式来寻找可能的补全项。

这个用来写普通文本时勉强够用,但是用来写代码就有点捉襟见肘了。

要实现的代码的自动补全,就需要用到大名鼎鼎的YouCompleteMe了。这个插件简称YCM,号称是VIM里最难安装的插件,没有之一。之前我也尝试安装过几次,但在Windows下一直没有成功。网上很多的攻略都是基于Linux环境的,所以安装过程中出现的问题难以找到头绪,所以每每就放弃了。

最近升级新电脑,重装开发环境的过程中,觉得是时候啃一啃这个拦路虎了。花了几天时间,终于搞定了所有的问题。有了这个插件后,感觉码代码的境界又高了一级。抱着建设美好祖国的初心,在此写一个中文安装攻略,分享给知乎的VIMER们。

安装过程

  • 初始环境
- Windows 10
- VIM 8.1 (WIN32)
- Python 2.7 (WIN32)

YCM本质上是一个基于Python的服务,需要Python配合VIM运作。在WINDOWS系统中,这要求两者要么都是32位的,要么都是64位的。因为现在VIM官网提供的Windows安装程序只有32位的了,所以这里也用一个32位的Python 2.7与之做配合。

  • 安装准备
- Visual Studio Community Version
- CMake

YCM比一般的VIM插件难安装,原因在于它不光是一个基于vimscript的插件,它还需要在电脑上编译出相关的python动态模块。在Windows上进行编译,需要用到Visual Studio和CMake这两个工具。
微软提供了免费的Visual Studio社区版本。这里下载最新的2019版本,即Version 16。整个安装过程是一个在线安装,在弹出的组件选项里选择Desktop development with C++。总共需要耗费6G多的硬盘空间。点Install以后,需要花不少时间,可以端个茶找同事聊聊天去了。安装好了以后,需要重启一次系统。

图1. 安装Visual Studio Community

CMake安装最新的版本即可。安装时记得将安装路径加入系统路径。

图2. 安装CMake
  • 下载插件

Plugin下载这里就不详细讲了,相信大家都会用Vundle。

图3. Vundle里下载YCM的配置
  • 运行安装脚本

用Vundle下载下来的插件根目录下有一个基于python的安装脚本,执行之前,可以了解一下其可用的选项。

cd %userprofile%.vimbundleyoucompleteme
python install.py --help
python install.py --clang-completer

图4. Install选项

图4的选项中,我们要选择的是--clang-completer,也就是基于clang的语义分析,来进行代码补全。在实际安装过程中,会下载libclang.dll,版本为8.0。这个版本号挺重要,后面会再次提到。

图5. 安装过程中下载libclang 8.0

编译的过程中会有一些warning,不用管它们。编译到最后生成的一个正则表达式的python动态模块_regex.pyd,这标志着YCM的所有动态库都已编译完成。到这里安装的过程就结束了。

图6. _regex.pyd的生成宣告YCM安装完成

使用方法

  • _vimrc中的基本配置

在使用之前,需要在_vimrc里加入一些基本配置。

图7. YCM在_vimrc里的配置

g:ycm_key_list_stop_completion指定选择键,这里回车和Ctrl + Y都可以确认选择。

g:ycm_global_ycm_extra_conf指定YCM插件目录里面自带的一个python脚本就行,不用对其做任何修改。

g:ycm_log_level选择log的详细程度,这个选项在插件使用出问题的时候可以用来提供一定的线索。

g:ycm_disable_for_files_larger_than_kb选择一个文件大小的门限值,如果大于这个门限,ycm对这个文件就停止解析,因为笔者用的工程里有比较大的源文件,所以设为10000KB。

修改好_vimrc后,重启gvim。运行:YcmDebugInfo,观察输出来确定安装是否成功。

图8. YcmDebugInfo的输出

首先是要确认载入的Clang的版本。前面提到,在运行安装脚本时,会下载Clang 8.0的版本,实际上是下载一个libclang.dll到YCM插件所在的目录里去。只要load的是这个dll,这里就会显示clang version 8.0.0。如果版本不对的话,说明系统路径里有旧的Clang dll,一般是因为之前安装过别的版本的LLVM[1]导致的。版本不匹配会导致自动补全的异常。笔者就在这卡住了老半天。如果发现这样的情况,又想保留老版本的LLVM的话,可以改装64位版本的LLVM,因为VIM和PYTHON都是32位的,会忽略64位的dll,最终找到YCM下载的这个正确的dll。

接下来确认YCM载入了我们之前选择的配置文件。

这两点确认后,我们可以认为YCM安装和配置成功。接下来看一个实际使用的例子。

  • 使用在基于C语言的嵌入式开发工程中

笔者进行的是大规模的嵌入式开发,工程基于CMake和ARMGCC的toolchain,配置文件是CMakeLists.txt。要想YCM在这个工程中起作用,需要配置CMakeLists.txt,在编译过程中生成一个compile_commands.json文件,生成的方法是在CMakeLists.txt里加入一行

SET(CMAKE_EXPORT_COMPILE_COMMANDS ON)

之后再编译一次,就会发现生成了compile_commands.json。将这个文件拷贝到源文件的根目录,之后打开任何一个源文件,YCM会逐级向上搜索,直到找到这个文件,并将其中的配置载入。

这时我们再打开任何一个工程中包含的源文件,运行:YcmDebugInfo,观察输出和之前有什么不同。

图9. 载入compile_commands.json后YcmDebugInfo的输出

从log里可以看到。YCM成功的找到了Compilation database path,也就是compile_commands.json所在的目录,并从中读取了若干Flag。而Translation Unit代表当前打开的文件。有了这些,YCM就在后台的server里开始解析代码,并不断提供基于C语言语义分析的自动补全项。

来小试一把牛刀。

图10. 一个自动完成的例子

可以看到YCM自动识别出了两级的数据结构,并提供了自动完成的建议。

其他的toolchain怎样生成compilation database笔者没有进一步的研究,大家按需谷歌咯。

结语

列举一下YCM相比于VIM原生的自动补全的优势。

  • 基于C/C++语义的自动补全
  • 打字过程中自动弹出补全建议,不用按特殊键进行触发,因此补全的过程行云流水
  • 模糊匹配,不再是按逐个字母的匹配给出建议,对于一个长的Symbol,只要按顺序输入其中的任意字母,无论这些字母是否相邻,都能完成匹配,这就相当于提供了一个智能的缩写。比如前面的例子,要输入switchchannel,只需要输入s, c, l,就能找到匹配项。

关于YCM的其他使用方法,笔者也需要花一点时间再进一步地进行体验,这里就不具体展开了。本文的主要目的还是帮助那些没能成功安装上YCM的小伙伴们,先迈出这第一步。后面的进一步配置、以及更高阶的用法,就等待以后慢慢发掘吧。

参考

  1. ^LLVM是一个open source的compiler架构,其中包含了Clang的可执行程序。一个常见的用法是对代码进行coding style的检查 http://releases.llvm.org/

vim win装_VIM的代码补全工具YouCompleteMe在Windows上的安装攻略相关推荐

  1. 史上最全智能代码补全工具系列——序篇

    近几年,人工智能迅速发展,在各行各业都有所应用,特别是近两年,面向开发者的AI开发工具也是层出不穷,从这些工具中,我们看到了AI能为开发者带来的无限可能性.本系列文字主要介绍目前业界比较实用的几款智能 ...

  2. 重磅!革命级AI代码补全工具,这款撸码利器让程序员界沸腾了!

    我们平时写代码的时候,多少都会依赖编辑器的代码补全功能,敲几个字母就能补全一个词.可是这么多年过去了,语言升级了很多次,而代码提示却没有升级,还是只能限定在一个词,毫无意义地按照字典表顺序排列,这对于 ...

  3. 【Linux】Ubuntu 18下安装Vim自动补全插件YouCompleteMe(可高速下载安装)

    前言 本文写于2020年10月,如果你多年后看见这篇文章,方法可能已经失效,但是请牢记,尽量下载你所处时代的最新版本的软件,会减少很多麻烦. 摆正心态 即便按照本文操作,由于你的系统状态和我的不一样, ...

  4. vim win装_vim插件管理器的安装和配置-windows

    # vim插件管理器的安装和配置-windows ### 前言 ----------------------------- - vim做一框功能强大的编辑器,扩展功能令人称奇,插件机制非常灵活 - 本 ...

  5. 通过vimplus安装vim代码补全插件YouCompleteMe

    项目地址:https://github.com/chxuan/vimplus git clone https://github.com/chxuan/vimplus.git ~/.vimplus cd ...

  6. 定制Eclipse的Content assist(代码补全),比如空格键不上屏

    原文地址:http://www.blogjava.net/yes1983/archive/2010/12/15/Eclipse.html 以前只知道alt+/调出assist,后来发现可以所有字母都激 ...

  7. aixcoder 智能代码补全工具

    1.官网下载 https://www.aixcoder.com/#/setting 1.1介绍 1.2选择对应的下载版本 1.3安装&注册(需关闭IDEA) 安装完进行手机/邮箱注册,下载对应 ...

  8. 代码补全_AI加持,Kite增加智能代码补全功能:减少一半操作,实时补全

    代码补全工具 Kite 近日更新了最新的版本,增加了名为「Intelligent Snippets」的新功能.这一功能可以帮助开发者更为智能和高效的补全 Python 代码中的函数命令了. 机器之心报 ...

  9. hbuilderx代码自动补全_DL时代的代码补全利器,北大出品,效果远超语言模型

    从程序员到数据工程师,编写程序代码是一项基本功,但是编写冗长代码的过程也极大地消耗了开发者的耐心.近来,有不少关于代码补全工具的消息爆出,例如,来自美国的 Kite,来自加拿大的 TabNine 等, ...

最新文章

  1. Python网络爬虫 - 一个简单的爬虫例子
  2. 关于:last-child的一点见解
  3. Android开发之ActionBar结合Fragment的导航功能的使用(源代码分享)
  4. Ubuntu14.04安装编译ffmpeg
  5. 阅读代码和修改别人代码的一些技巧以及注意事项
  6. JavaSE各阶段练习题----多线程-垃圾回收
  7. EF创建上下文对象HttpContext和CallContext
  8. Logistic Regression Classifier逻辑回归
  9. code iban 是有什么组成_EAN-128码和Code-128码的区别
  10. LeetCode 1245. 树的直径(图的最大直径结论)
  11. ISO27001标准的起源和发展
  12. Linux操作系统之常用快捷键汇集
  13. ubuntu编译tensorflow 支持AVX,AVX2等指令集
  14. centos查询php目录大小,Linux CentOS下找到大于10M 小于100M的文件列出来的命令
  15. 微信进入公众号提示服务器错误,微信登录公众号提示没有权限访问解决教程
  16. 15---TernaryOperator 三目运算符
  17. 机器学习进阶 day4
  18. alter table新增字段操作究竟有何影响?(上篇)
  19. 1024程序员节:向改变世界的程序员致敬
  20. [Linux 驱动] -- 驱动调试技巧点滴分享

热门文章

  1. 使用批处理实现mysql数据库备份与上传
  2. SQL2008安装后激活方式以及提示评估期已过解决方法(转)
  3. 享乐不尽 聚 VR一体机艳冠群雄
  4. 使用docker toolbox 在windows上搭建统一环境
  5. 安卓开发_求好评功能
  6. Tomcat遇到”Error listenerStart”或”Error filterStart”问题且无详细日志时的log配置...
  7. EqualLogic 6100 V6 Synchronous Replication
  8. 32.突然弹出很多IE窗口怎么办:
  9. Java线程:线程的调度-合并
  10. eBPF Tracing 入门教程与实例