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++。

posted @ 2026-08-27 19:04  YuYangaa  阅读(8)  评论(0)    收藏  举报