Vim 从零搭建 C++ 开发环境:vimplus + coc.nvim + clangd
Vim 从零搭建 C++ 开发环境:vimplus + coc.nvim + clangd
本文记录从一个基本没有配置过的 Vim 开始,搭建一套适合 C/C++的开发环境。
最终实现:
- vimplus 美化与基础配置
- C/C++ 智能代码补全
- clangd 语义分析
- 实时代码错误检查
↑ / ↓选择补全候选Tab / Enter确认补全- 自动补全括号与引号
- 错误代码下划线提示
- Normal 模式查看错误详情
- NERDTree、状态栏、主题等 vimplus 功能
1. 最终效果与环境结构
最终使用的组件:
Ubuntu
│
└── Vim
│
└── vimplus
│
├── vim-plug
│ │
│ ├── coc.nvim
│ │ └── coc-clangd
│ │ └── clangd
│ │
│ └── lexima.vim
│
├── NERDTree
├── Airline
├── Startify
└── 其他 vimplus 插件
几个东西之间的关系:
Vim 编辑器
vimplus 一整套已经配置好的 Vim 环境
vim-plug Vim 插件管理器,vimplus 内部使用它管理插件
coc.nvim Vim 的代码补全 / LSP 框架
coc-clangd coc.nvim 的 C/C++ 扩展
clangd 真正负责分析 C/C++ 代码的语言服务器
lexima.vim 自动补全括号、引号
需要特别注意:
vim-plug ≠ vimplus
vimplus 是一整套配置方案,而 vim-plug 只是其中的插件管理器。
2. 安装 Vim 基础环境
先更新软件源:
sudo apt update
安装 Vim、Git 和 curl:
sudo apt install vim git curl
检查 Vim:
vim --version
检查 Git:
git --version
如果都能正常输出版本信息,就可以继续。
3. 安装 vimplus
3.1 备份原来的 Vim 配置
如果以前配置过 Vim,可以先备份:
cp ~/.vimrc ~/.vimrc.bak
如果本来就没有 .vimrc,可以跳过。
3.2 下载 vimplus
执行:
git clone https://github.com/chxuan/vimplus.git ~/.vimplus
进入目录:
cd ~/.vimplus
开始安装:
./install.sh
这里一般不要使用 sudo。
安装完成以后:
vim
就可以看到 vimplus 的 Vim 界面。
4. vimplus 的配置文件
安装完成以后,比较重要的文件主要有:
~/.vimrc
~/.vimrc.custom.config
~/.vimrc.custom.plugins
4.1 ~/.vimrc
这是 vimplus 本身的主要配置。
~/.vimrc
通常不要把自己的大量自定义配置直接写进去,因为以后更新 vimplus 时可能被覆盖。
4.2 ~/.vimrc.custom.config
自己的 Vim 配置建议写这里:
~/.vimrc.custom.config
编辑:
vim ~/.vimrc.custom.config
例如:
set signcolumn=no
set updatetime=300
都可以写在这里。
4.3 ~/.vimrc.custom.plugins
自己额外安装的插件写这里:
~/.vimrc.custom.plugins
编辑:
vim ~/.vimrc.custom.plugins
例如后面使用的:
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'cohama/lexima.vim'
就放在这里。
4.4 一个容易犯的错误
下面这样:
~/.vimrc.custom.config
不是打开文件,而是尝试把它当程序执行。
因此可能出现:
Permission denied
正确写法:
vim ~/.vimrc.custom.config
5. 删除 vimplus 默认的 YCM
vimplus 默认带有 YouCompleteMe,也就是 YCM。
YCM 是非常经典的 Vim 补全插件,但旧版 vimplus 携带的 YCM 在较新的 Vim、Python 等环境下可能出现兼容问题。
例如:
The ycmd server SHUT DOWN
Unexpected exit code 0
因此这里选择:
YCM
↓
删除
coc.nvim + coc-clangd + clangd
↓
作为新的 C++ 补全方案
5.1 查找 YCM 配置
执行:
grep -n "YouCompleteMe\|YCM\|ycm" ~/.vimplus/.vimrc
可能看到:
133:Plug 'Valloric/YouCompleteMe'
270:" YCM
271:...
272:...
5.2 删除 YCM 插件声明
打开:
vim ~/.vimplus/.vimrc
找到:
Plug 'Valloric/YouCompleteMe'
删除这一行。
5.3 删除 YCM 配置
继续找到:
" YCM
下面可能有大量:
let g:ycm_confirm_extra_conf = 0
let g:ycm_error_symbol = '✗'
let g:ycm_warning_symbol = '✹'
let g:ycm_seed_identifiers_with_syntax = 1
let g:ycm_complete_in_comments = 1
let g:ycm_complete_in_strings = 1
let g:ycm_collect_identifiers_from_tags_files = 1
以及:
let g:ycm_semantic_triggers = {
...
}
这一整块都可以删除。
保存退出:
:wq
5.4 清理 YCM 插件目录
重新打开 Vim:
vim
执行:
:PlugClean
确认以后,vim-plug 会把已经不在插件列表中的 YCM 删除。
6. 安装 Node.js
coc.nvim 运行依赖 Node.js。
安装:
sudo apt update
sudo apt install nodejs npm
检查:
node --version
例如:
v22.22.1
再检查:
npm --version
如果 coc.nvim 启动时出现:
[coc.nvim] "node" is not executable
说明 Node.js 没有正确安装或 Vim 找不到 Node。
7. 安装 clangd
clangd 是 C/C++ 的语言服务器。
它负责:
代码补全
语法分析
错误诊断
函数信息
定义跳转
引用分析
安装:
sudo apt install clangd
检查:
clangd --version
只要能够正常显示版本信息即可。
8. 安装 coc.nvim
打开:
vim ~/.vimrc.custom.plugins
加入:
Plug 'neoclide/coc.nvim', {'branch': 'release'}
最终还需要自动括号插件,所以也可以直接一起写:
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'cohama/lexima.vim'
保存退出:
:wq
重新打开:
vim
执行:
:PlugInstall
等待插件安装完成。
9. 安装 coc-clangd
coc.nvim 本身只是框架,还需要安装 C/C++ 扩展。
进入 Vim:
:CocInstall coc-clangd
正常会显示:
Install finished
✓ coc-clangd
这样整个补全链就完成了:
Vim
↓
coc.nvim
↓
coc-clangd
↓
clangd
↓
C/C++ 代码
10. 测试 C++ 自动补全
创建:
vim main.cpp
输入:
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> a;
a.
return 0;
}
输入到:
a.
正常应该自动出现:
push_back
pop_back
emplace_back
assign
at
begin
capacity
clear
data
empty
end
erase
front
...
说明 coc.nvim、coc-clangd 和 clangd 已经正常工作。
11. 配置 VS Code 风格补全
默认 Coc 的补全按键不一定符合自己的习惯。
这里配置为:
↑ 选择上一个候选
↓ 选择下一个候选
Tab 确认当前候选
Enter 确认当前候选
并且:
↑ / ↓ 只移动高亮
不会直接修改当前输入内容
11.1 编辑配置
打开:
vim ~/.vimrc.custom.config
加入:
" ==============================
" coc.nvim VS Code 风格补全
" ==============================
" ↓:选择下一个候选,不立即插入
inoremap <silent><expr> <Down> coc#pum#visible() ? coc#pum#next(0) : "\<Down>"
" ↑:选择上一个候选,不立即插入
inoremap <silent><expr> <Up> coc#pum#visible() ? coc#pum#prev(0) : "\<Up>"
" Tab:确认当前候选
inoremap <silent><expr> <Tab> coc#pum#visible() ? coc#pum#select_confirm() : "\<Tab>"
" Enter:确认当前候选
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#select_confirm() : "\<CR>"
11.2 让选中的补全项更明显
vimplus 部分主题中,Coc 当前选中项和普通候选颜色比较接近,不容易看出当前选择的是哪一个。
加入:
highlight CocMenuSel cterm=reverse gui=reverse
highlight PmenuSel cterm=reverse gui=reverse
这样按:
↑
↓
时,当前选择项会有明显的整行高亮。
11.3 立即重新加载配置
保存:
:w
不需要退出 Vim,可以直接:
:source ~/.vimrc.custom.config
让新配置立即生效。
12. 检查补全按键映射
如果发现:
Tab
没有反应,可以执行:
:verbose imap <Tab>
正常会出现类似:
<Tab> * coc#pum#visible() ? ...
Last set from ~/.vimrc.custom.config
说明 Tab 配置已经加载。
如果显示:
No mapping found
说明配置没有生效。
可以重新执行:
:source ~/.vimrc.custom.config
再检查:
:verbose imap <Tab>
同理可以检查:
:verbose imap <CR>
或者:
:verbose imap <Up>
:verbose imap <Down>
13. 配置 C++ 实时错误检查
coc-clangd 不仅能够补全代码,也能够实时检查 C++ 错误。
进入 Vim:
:CocConfig
配置:
{
"diagnostic.enable": true,
"diagnostic.enableSign": false,
"diagnostic.virtualText": false,
"diagnostic.refreshOnInsertMode": true,
"diagnostic.enableMessage": "always",
"diagnostic.messageTarget": "float",
"diagnostic.messageDelay": 300
}
保存:
:wq
14. Coc 错误诊断配置说明
14.1 开启诊断
"diagnostic.enable": true
开启代码错误检查。
14.2 输入代码时实时检查
"diagnostic.refreshOnInsertMode": true
这样在 Insert 模式写代码时,也可以更新错误状态。
14.3 关闭左侧错误标记
"diagnostic.enableSign": false
默认情况下,Coc 可能在左侧显示:
>>
或者:
x
!
一类的错误标记。
这样会多出一列空间,使代码整体向右移动。
因此关闭:
"diagnostic.enableSign": false
14.4 关闭右侧错误文本
"diagnostic.virtualText": false
否则错误可能直接显示在代码右边:
a.push_bac(1); no member named 'push_bac'...
关闭以后界面更加干净。
14.5 使用浮动错误信息
"diagnostic.messageTarget": "float"
错误的详细信息使用浮动窗口展示。
15. 关闭 Vim 的 signcolumn
即使关闭了 Coc 的:
"diagnostic.enableSign": false
Vim 自己的:
signcolumn
仍然可能处于:
auto
检查:
:set signcolumn?
如果显示:
signcolumn=auto
可以临时执行:
:set signcolumn=no
想要永久生效,在:
~/.vimrc.custom.config
加入:
set signcolumn=no
最终:
set updatetime=300
set signcolumn=no
这样错误出现时,左边不会突然多一栏,代码也不会左右跳动。
16. 错误提示最终效果
故意写:
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> a;
a.push_bac(1);
return 0;
}
这里:
push_bac
是错误的。
clangd 会检查出问题。
最终效果:
错误代码下面出现提示线
但不会出现:
左侧 >>
也不会出现:
右侧一大段错误文字
查看错误详情时:
Esc
进入 Normal 模式。
再把光标移动到错误代码上。
例如:
push_bac
对应位置。
稍等一下即可显示具体错误信息。
如果需要查看当前文件的全部诊断:
:CocDiagnostics
17. 安装自动括号插件
使用:
lexima.vim
打开:
vim ~/.vimrc.custom.plugins
加入:
Plug 'cohama/lexima.vim'
如果前面已经加过,则不需要重复添加。
插件配置最终:
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'cohama/lexima.vim'
保存:
:wq
进入 Vim:
vim
执行:
:PlugInstall
18. 自动括号效果
安装 lexima.vim 后:
输入:
(
自动变成:
()
输入:
[
自动变成:
[]
输入:
{
自动变成:
{}
输入:
"
自动变成:
""
输入:
'
自动变成:
''
光标自动位于两个符号中间。
例如:
if (
输入 ( 后自动:
if ()
光标位于:
(|)
的位置。
19. 最终插件配置
最终:
~/.vimrc.custom.plugins
中自己的插件:
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'cohama/lexima.vim'
安装插件:
:PlugInstall
删除已经不再使用的插件:
:PlugClean
20. 最终 Vim 自定义配置
最终:
~/.vimrc.custom.config
主要新增:
" ==============================
" coc.nvim VS Code 风格补全
" ==============================
set updatetime=300
set signcolumn=no
" ↓:下一个补全项
inoremap <silent><expr> <Down> coc#pum#visible() ? coc#pum#next(0) : "\<Down>"
" ↑:上一个补全项
inoremap <silent><expr> <Up> coc#pum#visible() ? coc#pum#prev(0) : "\<Up>"
" Tab:确认补全
inoremap <silent><expr> <Tab> coc#pum#visible() ? coc#pum#select_confirm() : "\<Tab>"
" Enter:确认补全
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#select_confirm() : "\<CR>"
" 当前补全项高亮
highlight CocMenuSel cterm=reverse gui=reverse
highlight PmenuSel cterm=reverse gui=reverse
修改以后可以执行:
:source ~/.vimrc.custom.config
立即重新加载。
21. 最终 Coc 配置
进入:
:CocConfig
最终:
{
"diagnostic.enable": true,
"diagnostic.enableSign": false,
"diagnostic.virtualText": false,
"diagnostic.refreshOnInsertMode": true,
"diagnostic.enableMessage": "always",
"diagnostic.messageTarget": "float",
"diagnostic.messageDelay": 300
}
22. 最终补全操作方式
输入:
vector<int> a;
a.
补全框自动出现。
操作:
↑ 上一个候选
↓ 下一个候选
Tab 确认当前候选
Enter 确认当前候选
例如:
push_back
pop_back
emplace_back
assign
at
begin
capacity
clear
使用:
↓
↓
↑
只会移动当前高亮项。
不会立即修改代码。
最后:
Tab
或者:
Enter
才真正完成补全。
整体操作习惯与 VS Code 比较接近。
23. 以后所有 cpp 文件都有补全吗
有。
以后创建:
vim a.cpp
或者:
vim main.cpp
或者:
vim test.cpp
只要 Vim 正常识别:
filetype=cpp
就会自动:
启动 coc.nvim
↓
启动 coc-clangd
↓
连接 clangd
↓
分析当前 C++ 文件
因此不需要给每一个 .cpp 文件重新安装或者配置补全。
普通算法竞赛代码:
#include <bits/stdc++.h>
using namespace std;
可以直接使用。
24. 常见问题
24.1 coc.nvim 提示 node 不存在
错误:
[coc.nvim] "node" is not executable
安装:
sudo apt install nodejs npm
检查:
node --version
24.2 clangd 不存在
检查:
clangd --version
如果没有:
sudo apt install clangd
24.3 Tab 没反应
检查:
:verbose imap <Tab>
如果:
No mapping found
执行:
:source ~/.vimrc.custom.config
24.4 左侧突然出现一列箭头
检查:
:set signcolumn?
如果:
signcolumn=auto
修改:
:set signcolumn=no
永久配置:
set signcolumn=no
同时确保 CocConfig 中:
"diagnostic.enableSign": false
24.5 错误直接显示在代码右边
检查 CocConfig:
"diagnostic.virtualText": false
24.6 如何查看所有错误
执行:
:CocDiagnostics
24.7 如何检查 Coc 状态
执行:
:CocInfo
24.8 如何安装新的 Coc 扩展
格式:
:CocInstall 插件名
例如:
:CocInstall coc-clangd
25. 最终效果总结
完成全部配置以后:
Vim
│
├── vimplus
│ ├── 主题
│ ├── 状态栏
│ ├── NERDTree
│ └── vim-plug
│
├── coc.nvim
│ └── coc-clangd
│ └── clangd
│
└── lexima.vim
最终获得:
C/C++ 智能补全
+
实时语法诊断
+
↑ / ↓ 选择候选
+
Tab / Enter 确认补全
+
自动补全括号
+
错误下划线提示
+
Normal 模式查看错误详情
+
NERDTree
+
状态栏
+
主题美化
以后只需要:
vim main.cpp
即可直接开始写 C++。

浙公网安备 33010602011771号