为vim配置代码自动联想,文档自动格式化。

软件安装

默认已经存在的软件:

  1. Node.js & npm
  2. Vim9 / neovim
  3. Python3

需要后续安装的软件/插件:

  1. vim-plug:轻量级的 Vim 插件管理器,本文中主要用来安装coc.nvim。
  2. coc.nvim:一个为 Vim 和 Neovim 提供智能代码补全、诊断和其他 IDE 特性的语言服务器协议(LSP)插件框架。
  3. black:一个 Python 代码格式化工具。
  4. pynvim:一个用于与 Neovim 编辑器深度集成的 Python 库,特别适用于开发复杂的插件和提供高级功能,如果不使用neovim可以忽略。

安装vim-plug

vim-plug插件安装及使用

直接上博客园教程

安装coc.nvim

安装完vim-plug之后,我们使用它来安装coc.nvim,在vim中命令模式输入:

1
2
# 编辑.vimrc文件
:e $MYVIMRC

进入了vim的配置文件,如果是neovim也会自动进入对应的配置文件,好用,不用知道配置文件的具体路径。

Then,在里面输入:

1
2
3
call plug#begin('~/.vim/plugged')
Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()

回到命令模式,输入:

1
:PlugInstall

接下来,vim-plug会帮你安装coc.nvim:

放一张安装过程的图片

命令模式输入:CocInfo,能正常显示信息就说明安装成功咯。

image-20241208012420399

安装black

然后,我们使用pip安装black库(Ubuntu等Linux系统通常对此有限制,需要改用apt安装):

1
2
3
sudo pip install black
# 如上述命令报错,通常会有提示应如何正确安装,如:
sudo apt install python3-black

查询版本号确认安装成功:

image-20241208015207677

如环境中有多个python,注意此时的python和vim中使用的python为同一个

安装coc-pyright等

coc-pyright是一个为coc.nvim提供 Python 语言支持的插件,它基于Pyright语言服务器。Pyright是由微软开发的一个快速且功能丰富的类型检查器和语言服务器,专为 Python 设计。如果需要编写其他编程语言,使用coc.nvim下载对应的插件即可,如C++对应的插件有coc-clangd,搜一下就有了。

1
2
# 命令模式下下载这仨插件,如有网络问题,想办法 npm pack coc-pyright,得到一个压缩包,然后在插件目录下的package.json中写入文件路径,进行本地安装
:CocInstall coc-json coc-tsserver coc-pyright

安装前vs安装后:

image-20241209012603546image-20241209013352252

可以看到,安装后,好用

此时写代码会有联想弹窗,帮助你高效地编写代码:

image-20241209014301432

不过,你下意识地按下Tab键想补全弹窗里的第一个选项,却发现事与愿违,这是因为,这个插件选择补全项的快捷键是Ctrl+Y,这实在是太不方便了,接下来,把它改掉~

配配置

配置tab自动补全

inoremap 是 Vim 和 Neovim 中用于定义插入模式(Insert mode)下的快捷键映射的命令。它的全名是 “insert no remap”,意味着在这个映射中,右侧的键不会被进一步映射或展开,从而避免了潜在的递归映射问题。

可以使用 inoremap 来定义在插入模式下特定按键的行为,比如tab自动补全:

1
2
# 此处编辑.vimrc,命令是 :e $MYVIMRC
inoremap <expr> <Tab> pumvisible() ? "\<C-y>" : "\<Tab>"

<expr> 是一个特殊的标志,它告诉 Vim 映射的右侧应该被当作表达式来评估,而不是直接作为键序列执行。

pumvisible() 是 Vim 和 Neovim 中的一个函数,用于检查补全菜单(Popup Menu)是否可见。

如上配置好后,退出重进vim,或者:source $MYVIMRC,就可以用tab键自动补全了。

配置自动格式化

有许多工具可以帮助我们自动格式化代码,现代IDE中,通常可以通过快捷键来触发这一工作。默认情况下,Pycharm里快捷键是Ctrl+Alt+L,VSCode里快捷键是Shift+Alt+F,在Vim里,没有这样的快捷键,但我们可通过配置实现。

coc.nvim为我们提供了一个命令来触发代码格式化:

1
:call CocAction('format')

在配置好一切之后,效果会是这样:
image-20241208014024326
main函数里不规范的缩进被规范化了。

而我们可通过配置快捷键来触发这个命令,以实现自动格式化代码。

1
2
3
4
5
# 普通模式下 Ctrl+Shift+F 自动格式化,这个快捷键在Mac上是 Ctrl+Option+F
nnoremap <C-S-f> :call CocAction('format')<CR>

# 插入模式下 Ctrl+Shift+F 自动格式化并保存
inoremap <C-S-f> <Esc>:call CocAction('format')<CR>:w<CR>

不过此时按下快捷键还是不能进行格式化的,因为coc也是需要调用第三方工具来实现格式化。

coc.nvim适配了多种代码格式化工具,python代码默认使用autopep8,我们使用命令:CocConfig修改键python.formatting.provider的值为black

image-20241209020357241

如果正常安装black,在终端直接输入black可以成功调用black(即系统路径包含black),python.formatting.blackPath无需手动配置,否则可能需要考虑在这个配置项中加入black脚本的路径。

完成上述工作后,我们写一点不规范的代码,按下快捷键,看看能不能自动格式化~

配置.vimrc

最后加上一个可能会被复制的.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
set encoding=utf-8
set number relativenumber
set tabstop=4
set shiftwidth=4
set expandtab
filetype plugin indent on
set autoindent
set ruler

# 禁止备份文件
set nobackup
set nowritebackup

# 允许退格键删除自动缩进
set backspace=indent,eol,start

call plug#begin('~/.vim/plugged')
Plug 'neoclide/coc.nvim'
call plug#end()

inoremap <expr> <Tab> pumvisible() ? "\<C-y>" : "\<Tab>"

# 普通模式下 Ctrl+Shift+F 自动格式化,这个快捷键在Mac上是 Ctrl+Option+F
nnoremap <C-S-f> :call CocAction('format')<CR>
# 插入模式下 Ctrl+Shift+F 自动格式化并保存
inoremap <C-S-f> <Esc>:call CocAction('format')<CR>:w<CR>

遇到的问题

coc.nvim需手动构建:

问题如图:

image-20241204005337726

解法:

image-20241204005414197

搞定。