概述
本文主要介绍YCM插件的安装与使用。
安装
Vundle安装
- 添加插件
在文件.vimrc
中添加Plugin 'ycm-core/YouCompleteMe
- 运行安装命令
打开vim
工具,输入命令行:PluginInstall
。
国内网速不好,可能下载时间会比较长。。。 - 进入插件目录
$ cd ~/.vim/bundle/YouCompleteMe
- install dependence
$ sudo apt install build-essential cmake vim python3-dev -y
- install relate language
$ sudo apt install mono-complete golang nodejs npm -y
由于插件依赖一些第三库,所以安装前先检查YCM是否安装了相关依赖库,输入命令如下
$ git submodule update --init --recursive
- 安装
输入安装命令
$ python3 install.py --all
if you only want install C-family language, you can input as follow:
$ python3 install.py --clangd-completer
文件拷贝
将插件目录下third_party/ycmd/examples
文件夹中的配置文件模板文件.ycm_extra_conf.py
拷贝到.vim
文件夹下,具体操作如下:
$ cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim
配置文件
下述内容是插件模板文件中的内容
flags = [
'-Wall',
'-Wextra',
'-Werror',
'-fexceptions',
'-DNDEBUG',
# THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
# language to use when compiling headers. So it will guess. Badly. So C++
# headers will be compiled as C headers. You don't want that so ALWAYS specify
# a "-std=<something>".
# For a C project, you would set this to something like 'c99' instead of
# 'c++11'.
'-std=c++11',
# ...and the same thing goes for the magic -x option which specifies the
# language that the files to be compiled are written in. This is mostly
# relevant for c++ headers.
# For a C project, you would set this to 'c' instead of 'c++'.
'-x',
'c++',
'-isystem',
'/usr/include',
'-isystem',
'/usr/local/include',
'-isystem',
'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1',
'-isystem',
'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include',
]
-std
:语言标准
如果是C语言项目,需要将语言标准改为-std=c99
,如果是C++项目则根据具体项目的语言标准,比如-std=c++11
。-x
:编程语言
根据项目实际需求选择对应编程语言
C语言 | C++语言 | Objective-C语言 | CUDA语言 |
---|---|---|---|
c’ | c++ | objc | cuda |
-isystem
:头文件目录
~~需要制定项目所需的标准库和第三方库的目录,常用目录如下:
/usr/include
:系统包含的头文件/usr/local/include
:用户安装库相关头文件/usr/lib/c++/9
:C++相关头文件,具体C++版本根据实际指定~~
vim配置
- 配置文件
在.vimrc
文件中添加如下配置,指定插件配置文件的路径。
let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
- python版本
建议使用python3版本,可使用命令行查看目前安装的软件版本
python3 --version
在.vimrc
文件中指定python路径
let g:ycm_server_python_interptreter='/usr/lib/python3.8'
通过上述配置,就可以使用TAB
键正向选择匹配结果,持续按TAB
键,直到循环结束。而shift + TAB
可以实现反向循环。
命令
主命令
:YcmRestartServer
:重启服务
如果ycmd completion server 因不明原因中断,可以通过上述命令重启该服务。:YcmDiags
:诊断
调用该命令,如果文件中存在错误和警告,将会覆盖VIM的locationlist
文件并打开:YcmDebugInfo
:调试信息
改命令将会打印出当前文件一系列的调试信息:YcmCompleter
:扩展命令
通过该命令可以访问一些列的子命令,像跳转功能、类型信息等
子命令
跳转命令
使用该命令允许在代码间跳转,移动光标到相应变量,跳转命令就会将其添加到jumplist
中,因此,可以使用CTRL+ O
快捷键跳回先前的位置,或者使用CTRL + I
快捷键前进到下一个位置。
GoToInclude
查询当前行的头文件,并跳转到相应文件;
支持文件类型包括:c, cpp, objc, objcpp, cuda
。GoToDeclaration
查询光标下的符号并跳转到其声明处;
支持文件类型包括:c, cpp, objc, objcpp, cuda, cs, go, java, javascript, python, rust, typescript
。GoToDefinition
查询光标下的符号并跳转到其定义处;
支持的文件类型包括:c, cpp, objc, objcpp, cuda, cs, go, java, javascript, python, rust, typescript
。
注:对于C族语言,该命令只在某些情况下有效,即符号定义在当前上下文内。一个上下文由所编辑的文件和文件内
#include
所直接或间接包含的文件组成。
GoTo
该命令尝试采取智能的跳转方式,也就意味着,查找光标下的字符,如果可能跳转到它的定义;如果定义无法从当前上下文访问,则跳转到符号的声明。
支持的文件类型包括:c, cpp, objc, objcpp, cuda, cs, go, java, javascript, python, rust, typescript
。GoToReferences
该命令尝试在整个项目内,查找光标下标识符参考,并列出相应的位置列表。
支持文件类型包括:c, cpp, objc, objcpp, cuda, java, javascript, python, typescript, rust
设置快捷键
为了方便跳转,将上述跳转命令设置为如下快捷键,方便快速跳转。
nnoremap <leader>gi :YcmCompleter GoToInclude<CR>
nnoremap <leader>gc :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gt :YcmCompleter GoTo<CR>
nnoremap <leader>gr :YcmCompleter GoToReferences<CR>
上述配置采用vim的前缀键\
去触发相关功能,比如,在Normal
模式下输入\gt
相当于调用了:YcmCompleter GoTo
子命令。