Vim基础篇(十六)——代码补全插件coc.nvim

前言:
  让Vim像IDE一样实时编辑有补全提示代码,这能在大程度上提高代码编辑效率,而coc.nvim就是这样一款优秀的插件。

1 安装coc.nvim

  插件 coc.nvim 支持LSP功能,并且支持异步特性,个人认为是目前最优秀的Vim代码补全插件。
  在.vimrc文件中添加如下配置安装coc.nvim。

1
Plug 'neoclide/coc.nvim' : {'branch': 'release'}

  在Vim中运行指令 :PlugInstall 完成插件安装。coc会创建 ~/.config/coc 目录,并将相关数据存于此目录下。

2 安装node

  coc的运行依赖于node,在Ubuntu下安装只需在终端输入以下指令。

1
sudo apt-get install nodejs

3 配置coc.nvim

  在.vimrc配置文件中添加以下配置,可根据自己喜好修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"neoclide/coc.nvim
"下划线标识。
hi CocErrorHighlight cterm=underline gui=underline
hi CocWarningHighlight cterm=underline gui=underline

"状态信息加入vim-airline。
let g:airline#extensions#coc#enabled = 1
let airline#extensions#coc#error_symbol = '✘:'
let airline#extensions#coc#warning_symbol = '!:'
let airline#extensions#coc#stl_format_err = '%E{[%e(#%fe)]}'
let airline#extensions#coc#stl_format_warn = '%W{[%w(#%fw)]}'

"保持光标时突出显示符号及其引用。
autocmd CursorHold * silent call CocActionAsync('highlight')

"使用tab键触发补全。
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~ '\s'
endfunction

inoremap <silent><expr> <Tab>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<Tab>" :
\ coc#refresh()

  为了增加响应,还建议进行如下配置。

1
set updatetime=100                     "更新时间100ms。

coc.gif

4 配置c/c++补全支持

  coc对c/c++的补全支持建议使用clangd,更多语言补全支持可在 Language-servers 查看,根据需要安装,下面以clangd举例。
  首先需要确保在子系统Ubuntu上安装了clangd,在终端输入以下指令完成安装。

1
sudo apt-get install clangd

  或者也可使用coc的clangd,在Vim中执行以下指令完成安装,两者选其一即可。

1
:CocInstall coc-clangd

  安装完成后还需对coc进行配置,修改json文件。在Vim中输入指令打开 coc-settings.json 配置文件。

1
:CocConfig

  根据 Language-servers 上的配置示例将配置赋值到json文件中,比如。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"languageserver":
{
"clangd":
{
"command": "clangd",
"rootPatterns": [".git/", ".svn/"],
"filetypes": ["c", "cc", "cpp", "c++", "objc", "objcpp"]
}
},

"diagnostic":
{
"enableSign": "true",
"errorSign": "✘",
"warningSign": "!"
}
}

  如果装的是coc-clangd则将 clangd 修改为 coc-clangd 。在原配置的基础上要加一个 {} 将代码括起来,否则会报json语法错误。
  以上配置了使用 clangd 时的根目录标识为 .git/.svn/ 。需要注意的是 clangd 会识别工程根目录下的 compile_commands.json 文件(Ubuntu下可以通过CMake使用clang或gcc编译生成。),根据该文件去解析文件的路径,这样补全和语法检查才能找到其他文件内的代码。

4 配置Coc语法检查

  Coc不仅能补全也能语法检查,如果你装了ALE等其他语法检查插件,语法报错可能出现冲突。Coc的语法检查和ALE一样,也能配合底部状态栏显示,不过Coc的语法检查能在浮动窗口显示错误和警告信息。因此建议装Coc就够了,既能补全又能语法检查,这两者用同一个插件也避免出现不同步问题。
  使用Coc进行语法检查,为了快速在错误或警告提示之间跳转,建议进行如下按键映射。

1
2
3
4
5
6
7
8
9
"neoclide/coc.nvim
"tab 触发补全。
"<c-l> 补全时触发补全函数参数列表。
"<c-j> 函数补全时跳到下一个参数,普通模式或插入模式。
"<c-j> 函数补全时跳到上一个参数,普通模式或插入模式。
"跳转到上一个错误或警告信息。
nmap <silent> <c-h> <Plug>(coc-diagnostic-prev)
"跳转到下一个错误或警告信息。
nmap <silent> <c-l> <Plug>(coc-diagnostic-next)