@author zhanjzh
YouCompleteMe
简称YCM,使用vim编程的人应该都有所耳闻,YCM作为Vim的补全插件真的是神器。
一般情况下,我使用vscode来编程,vscode本身就已经有很不错的补全插件,但是在进行cuda编程时,很无奈的发现vscode只有一个很残缺的vscode-cudacpp
插件。为什么说残缺呢,是因为这个插件能提供的功能只有.cu
文件中对cuda 语法高亮,支持的语法补全都是缩写,只支持很少数的一部分函数,并且没有函数提示。
相比之下,vim 下的YouCompleteMe就表现得十分优秀。
前提条件
安装YCM是有版本前提的,
- vim版本要8.0 或者以上(最新)
- 自己安装 git 工具包
- vim支持 python2或者 python3
安装过程
在网上找到了不止一个版本的安装博客,翻来翻去都试了一下,大致的方法有下面几种:
- 使用系统自带的clang
- 使用YCM自己下载的clang
- 使用自己编译的clang
无论哪种安装之后都不太行,YCM好用是好用,安装是真的坑。
官网README的安装教程: readme
我的系统为 Ubuntu
1. 配置vim的插件管理器 vundle
在~/.vim
目录下,先自行下载vundle
文件:
1 | git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle |
修改vim
的配置文件~/.vimrc
(第一次使用vim的人请自行创建)
1 | set nocompatible |
2. 使用vundle安装YCM
第一步修改配置文件后退出重新进入vim
,在vim
下执行BundleInstall
.
具体步骤:按下Esc
键,shift
+ ;
按出 :
,输入BundleInstall
。
等待YCM安装完毕之后,在目录 ~/.vim/bundle/
下应该会看到有 YouCompleteMe
这个目录。
3. 配置YCM的自动补全
主要配置的是 C和C++ 的自动补全。
按照官网的安装步骤,下面应该执行:
1 | cd ~/.vim/bundle/YouCompleteMe |
然而很遗憾,如果直接按照这个步骤来执行在下载 clang 时会报出类似这个错误:
1 | for file: [/home/irvinglwj/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/../clang_archives/clang+llvm-3.9.0-x86_64-opensuse13.2.tar.xz] |
意思是下载的hash不匹配。网上查了信息后有网友说原因是这个:clang官网地址迁移,但是安装包还是使用的旧的地址,因此会解析失败。
既然下载失败那就只能自行编译或者加上 --system-libclang
参数
但是经常会报出YCM server shut down
之类的奇妙错误。下面我说一下我的做法:
- 自行下载对应的 clang + llvm 安装包,没记错的话我是在这里下载的: clang+llvm7.0
- 将下载完的压缩包放入
~/.vim/bundle/YouCompleteMe/third_party/ycmd/clang_archives
目录下
1 | cp ~/Downloads/libclang-7.0.0-x86_64-unknown-linux-gnu.tar.bz2 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/clang_archives |
- 执行官网的安装命令:
1 | cd ~/.vim/bundle/YouCompleteMe |
如果执行 --all
的话在配置c#
补全时会出现一些错误,但是我目前不需要c#
的补全,因此没去管,另外YCM默认是有python补全的。
到目前位置应该安装完,重新进入vim会提示没有配置文件.ycm_extra_conf.py
,下面会说一下.ycm_extra_conf.py
的配置。
4. 后续配置
复制.ycm_extra_conf.py
文件
1 | cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py ~/.vim |
在~/.vimrc
添加配置:
1 | let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py' |
这之后需要配置C++ 和 C 或者 cuda 的头文件所在地
我的.ycm_extra_conf.py
文件如下:
1 | # Copyright (C) 2014 Google Inc. |
重要的地方只有flags
那里:
1 | flags = [ |
另外如果是跟我一样要配置cuda的补全的话,有些地方要修改一下:
1 | SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm', '.cu' ] # 添加 .cu |
配置输入两个字符就能提示:
1 | let g:ycm_semantic_triggers={'c,cpp,python,cuda': ['re!\w{2}'] } |
取消函数提示时在上方跳出的框框:
1 | set completeopt=menu,menuone |
更多功能有待发掘。