5月27日 14:00

Vim 常用插件有哪些?怎么安装和管理?

为什么要折腾 Vim 插件

Vim 本身已经是个够用的编辑器,但离「用得舒服」还差一截——没有文件树、没有智能补全、没有 Git 状态提示,每次切文件都得 :e 手敲路径。装上几个关键插件之后,Vim 的体验会发生质变。这篇文章不会给你列几十个插件让你挑花眼,只讲那些真正经得起时间考验的工具,以及怎么装、怎么管。

先选一个插件管理器

装插件之前,得先搞定插件管理器。主流选择有三个:

vim-plug — 目前最流行的选择。配置语法简洁,并行安装速度快,支持懒加载。一个 Plug 'author/repo' 就完事,入门成本最低。安装只需要一行 curl:

bash
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

Vundle — 老牌管理器,语法和 vim-plug 类似(Plugin 'author/repo'),功能够用但已经不怎么更新了。如果你接手的老项目 .vimrc 里用的 Vundle,能看懂就行,新项目不建议再用。

dein.vim — Shougo 开发的新一代管理器,异步安装、细粒度懒加载、hooks 回调,功能最强。代价是配置比 vim-plug 复杂不少,适合对启动速度有强迫症的用户。要求 Vim 8.0+ 或 Neovim。

实际建议:大多数人选 vim-plug 就够了。它的 plug#begin() / plug#end() 结构清晰,:PlugInstall:PlugUpdate:PlugClean 三条命令覆盖日常操作。

文件浏览:NERDTree

NERDTree 是 Vim 生态里最经典的文件浏览器,打开后左侧会出现一棵目录树,可以用键盘上下导航、回车打开文件。装了它就不用在终端和 Vim 之间来回切了。

安装:

vim
Plug 'preservim/nerdtree'

常用快捷键得配一下,不然每次手动敲 :NERDTreeToggle 太痛苦:

vim
nnoremap <C-n> :NERDTreeToggle<CR> " 打开 Vim 时自动显示 NERDTree autocmd VimEnter * NERDTree " 关闭最后一个文件时自动关闭 NERDTree autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif

NERDTree 的核心操作就几个:o 打开文件/展开目录,t 在新标签页打开,i 水平分屏打开,s 垂直分屏打开,m 打开菜单(新建/删除/重命名文件)。按 ? 可以看完整帮助。

如果你觉得 NERDTree 太重,可以试试 vim-dirvishnetrw(Vim 自带),但功能上差距明显。

模糊搜索:fzf

fzf 是目前最快的模糊搜索工具,没有之一。它用 C 写的,比纯 VimScript 实现的 ctrlp 快好几个量级,文件多的时候体感差距非常大。

安装需要两个部分:

vim
Plug 'junegunn/fzf', { 'do': './install --all' } Plug 'junegunn/fzf.vim'

fzf 是核心引擎,fzf.vim 是 Vim 集成层。装完后常用的命令:

  • :Files — 模糊搜索文件
  • :GFiles — 只搜 Git 跟踪的文件
  • :Buffers — 在已打开的 buffer 里搜索
  • :Rg:Ag — 全局内容搜索(需要安装 ripgrep 或 silver-searcher)

建议配一下快捷键:

vim
nnoremap <C-p> :Files<CR> nnoremap <leader>b :Buffers<CR> nnoremap <leader>g :Rg<CR>

fzf 的搜索窗口样式也可以调:

vim
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } }

如果你之前用 ctrlp,迁移到 fzf 几乎无痛,搜索速度的提升会让你立刻觉得值。

智能补全:coc.nvim

coc.nvim 是 Vim 生态里最接近 VS Code 补全体验的插件,基于 Language Server Protocol(LSP),支持跳转到定义、查找引用、重命名、自动补全、诊断提示等。它基本上把以前需要装五六个插件才能凑齐的功能统一了。

安装:

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

装完插件本身还不够,还得装对应语言的扩展。在 Vim 里执行:

vim
:CocInstall coc-tsserver " JavaScript/TypeScript :CocInstall coc-pyright " Python :CocInstall coc-go " Go :CocInstall coc-rust-analyzer " Rust :CocInstall coc-json " JSON :CocInstall coc-html " HTML :CocInstall coc-css " CSS

关键快捷键配置:

vim
nmap <silent> gd <Plug>(coc-definition) nmap <silent> gy <Plug>(coc-type-definition) nmap <silent> gi <Plug>(coc-implementation) nmap <silent> gr <Plug>(coc-references) nmap <leader>rn <Plug>(coc-rename)

gd 跳转到定义,gr 查找引用, n 重命名符号——这三个大概是用得最频繁的操作。

coc.nvim 需要 Node.js 环境(>= 14),如果机器上没装 Node,这一步会报错。用 nvm 或系统包管理器装一个就行。

状态栏:vim-airline

默认的 Vim 状态栏只显示文件名和行列号,信息量很少。vim-airline 给状态栏加上了当前模式、Git 分支、文件类型、编码、语法检查状态等信息,底部一行就能掌握全局。

vim
Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes'

如果你也装了 fugitive 和 coc.nvim,airline 会自动显示 Git 分支名和 LSP 诊断数量,不需要额外配置。换个主题可以让状态栏更好看:

vim
let g:airline_theme = 'onedark'

如果觉得 airline 依赖太多,轻量替代是 lightline.vim,功能少一些但启动更快。

Git 集成:vim-fugitive + vim-gitgutter

两个插件各管一摊:fugitive 负责在 Vim 里执行 Git 操作,gitgutter 负责在行号旁显示改动标记。

vim-fugitive 把 Git 命令搬进了 Vim:

vim
Plug 'tpope/vim-fugitive'

常用命令::Gstatus 查看状态,:Gwrite 相当于 git add:Gcommit 提交,:Gdiff 看差异,:Gblame 看每行的提交记录。用熟了之后几乎不需要切到终端操作 Git。

vim-gitgutter 在行号左侧实时标记增删改:

vim
Plug 'airblade/vim-gitgutter'

+ 号表示新增行,- 号表示删除行,~ 号表示修改行。可以配合 ]h[h 在改动块之间跳转。如果觉得实时检测太耗性能,可以设个间隔:

vim
let g:gitgutter_realtime = 0 let g:gitgutter_eager = 0

一个能用的完整配置

把上面这些组合起来,一个实用的 .vimrc 长这样:

vim
" === 插件管理 === call plug#begin('~/.vim/plugged') " 文件浏览 Plug 'preservim/nerdtree' " 模糊搜索 Plug 'junegunn/fzf', { 'do': './install --all' } Plug 'junegunn/fzf.vim' " 智能补全 Plug 'neoclide/coc.nvim', {'branch': 'release'} " 状态栏 Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' " Git Plug 'tpope/vim-fugitive' Plug 'airblade/vim-gitgutter' call plug#end() " === 通用设置 === set number set relativenumber set tabstop=4 set shiftwidth=4 set expandtab set hidden set updatetime=100 " === NERDTree === nnoremap <C-n> :NERDTreeToggle<CR> " === fzf === nnoremap <C-p> :Files<CR> nnoremap <leader>b :Buffers<CR> let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } " === coc.nvim === nmap <silent> gd <Plug>(coc-definition) nmap <silent> gr <Plug>(coc-references) nmap <leader>rn <Plug>(coc-rename) " === airline === let g:airline_theme = 'onedark' " === gitgutter === set signcolumn=yes

写完之后打开 Vim,执行 :PlugInstall,等安装完重启,就有一个堪比轻量 IDE 的编辑环境了。

几点避坑提醒

  • 插件不是越多越好。每多一个插件,启动时间就多一点,出冲突的概率也大一点。上面这套组合已经覆盖了日常开发的绝大多数场景,先跑起来再说。
  • coc.nvim 是这套配置里最重的插件,首次打开会慢一两秒。如果受不了,可以换成 vim-lsp + asyncomplete 的组合,轻量但配置更繁琐。
  • fzf 的 :Rg 搜索需要系统里装了 ripgrep。macOS 用 brew install ripgrep,Ubuntu 用 apt install ripgrep
  • 如果你在用 Neovim,可以考虑把 vim-plug 换成 Lua 原生的 lazy.nvim,但这篇文章聚焦 Vim,就不展开了。

装好这六七个插件,日常写代码的效率会有明显提升。不用急着把所有插件都试一遍,先把这几个用熟,之后想加什么再加。

标签:Vim