ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Vim 深度定制指南:插件管理、效率提升与美化配置实战

Vim 深度定制指南:插件管理、效率提升与美化配置实战 接触Vim的第五个年头我电脑里的编辑器只剩它一个了。要说为什么当初愿意折腾其实就是一条理由我想要一个完全按自己想法来的编辑器而不是一个别人替我决定好的IDE。前前后后我也给Vim装过几十个插件换过十几套主题走过不少弯路最终沉淀下来这么一套既有颜值又好用的方案。这篇东西不是教科书更像是我这几年把Vim弄花里胡哨的完整记录包括插件怎么选、配置怎么组织结构、美化怎么才不生硬以及那些照抄配置时非常容易踩的坑。1. 为什么一个过时的编辑器值得花时间装扮1.1 编辑器选择的底层逻辑很多朋友第一次见我用了一整天去折腾Vim配色第一反应都是你图啥说真的我也不是一开始就懂。最早我还停留在编辑器能打开文件、能保存退出就够了的阶段觉得Vim无非是一个没有菜单的记事本大家都在用IDE我何必自找麻烦。转折点是我负责一个比较大型的运维脚本仓库文件多函数杂那段时间我每天都要花一两个小时在翻代码、找函数、改字符串这种琐碎动作上。VSCode也不是不好但它启动之后从你心里想到目标到光标落在正确位置中间总隔着一层鼠标和菜单的摩擦。Vim把这种摩擦直接碾平了不用鼠标、不用菜单、命令直达。这里我必须先把一件很重要的事情说清楚Vim的美化和插件的核心价值从来不是让编辑器变漂亮而是让漂亮为效率服务。一个配色清晰、状态栏信息完整、补全提示及时出现的编辑环境能让你输入代码时不被打断。注意力不被打断比任何快捷键都珍贵。当然我也承认Vim确实套着一层过时的外衣。默认状态下的它极不友好没有自动补全、没有文件树、没有像样的语法高亮。但正是因为它把一切都做成了可配置的才有了后面庞大的插件生态。所以这篇文章不是让你把所有插件都装上堆满而是帮你搭建一套够好看、够好用、还不卡的配置体系。1.2 美化不是给人看是给效率看我遇到过一种人装了一堆主题之后每天打开编辑器先截个图发朋友圈。这不是不行但如果你只是为了截图好看折腾到这里就结束了Vim对你来说和一张动态壁纸没有区别。真正的美化应该具备三个功能降低信息提取成本、延长长时间工作的眼睛耐受度、建立我愿意待在这个环境里的心理暗示。降低信息提取成本靠的是合理的高亮语法关键字用一种颜色字符串用另一种错误用醒目的红搜索结果用一个高对比的背景色。颜色不是越多越好而是每种颜色都要承担一个语义。那些把所有东西都染成彩虹色的主题时间久了眼睛真的会累。延长眼睛耐受度靠的是背景亮度和对比度的控制。暗色主题不是必须但我绝不建议上来就选一个背景纯黑、文字纯白的方案——那个对比度白天看还行深夜写代码的时候纯白文字能把眼睛灼得生疼。我自己最后长期用的是一个偏暖的暗色主题背景不是#000000而是带一点灰褐底的整体柔和很多盯久了不容易头晕。至于心理暗示这就更实际了长期做技术工作的人一天里大半时间都在编辑器面前。一个让你觉得舒服的环境比强迫自己去适应一个难看但专业的环境效率真的要高得多。这也是我一直建议大家别不好意思花里胡哨的原因。1.3 适合谁去折腾不适合谁去折腾我得坦诚一点并不是所有人都应该折腾Vim。如果你平时写代码很轻量一周只打开几次编辑器那你完全可以直接用IDE别浪费时间。但如果你符合下面这些特征里的任何一条那我建议你真花一个周末来折腾大量时间在写代码、写脚本、改配置希望尽量减少鼠标操作经常要远程登录服务器在终端里编辑文件的频率很高对编辑器有强烈的个性化需求希望所有行为都由自己定义想深入了解插件机制理解文本编辑工具的本质这套折腾里面没有绝对的对错只有适合与不适合。接下来的内容我会以我这套方案为主线把插件添加和美化拆成三条线分别讲清楚。2. 插件管理器与配置结构先把家具摆放想清楚2.1 三个主流方案的真实差异很多人一上来就装插件结果装了几十个之后Vim启动变得特别慢。为什么因为没想清楚插件们住在哪里、谁先加载谁后加载。这一节先解决住的问题。目前给Vim添加插件的主流方案有三个方案代表工具特点插件管理器vim-plug / Vundle / dein.vim自动下载、更新、按需加载最省心原生packpathVim 8.0 自带不用额外工具但功能基础手动管理git clone 到 ~/.vim/plugin最原始强烈不推荐我自己用的是vim-plug。选它不是因为Vundle不能用而是vim-plug有几个点很对我的胃口。一是安装步骤极简。下载plug.vim放到autoload目录再在vimrc里写一段plug#begin和plug#end就够了。二是它并行拉取插件几十个插件一起更新的时候速度差距远比你想象的大。三是它原生支持按需加载比如这个插件等打开Markdown文件时再加载这对启动速度非常关键。如果你用的是Neovim选择会更多lazy.nvim、packer.nvim都做得很好。但本文聚焦在Vim上所以我以vim-plug为主线。2.2 目录规划与.vimrc拆分从堆砌到工程化很多人的.vimrc最后会变成三四百行的毛线球今天加一个映射明天删一个设置后天插一段注释最后自己都不敢动。我建议从一开始就把配置拆开。我的典型目录结构是这样的~/.vim/ ├── autoload/ │ └── plug.vim ├── plugged/ # vim-plug 管理的插件仓库 ├── vimrc.d/ # 自定义配置分片 │ ├── basic.vim # 基础设置行号、缩进、编码 │ ├── maps.vim # 所有按键映射 │ ├── plugs.vim # 插件声明与配置 │ ├── theme.vim # 主题、状态栏、图标相关 │ └── functions.vim # 自定义函数 └── colors/ # 自己放的主题文件然后在主配置文件.vimrc里做一件事就够了runtime vimrc.d/basic.vim runtime vimrc.d/plugs.vim runtime vimrc.d/maps.vim runtime vimrc.d/theme.vim runtime vimrc.d/functions.vim这里有个细节值得强调我用的是runtime而不是source。runtime只会在运行时路径里找文件source需要写完整路径跨平台时特别容易踩坑。比如你在Linux下写source ~/.vim/vimrc.d/maps.vim换到Windows之后就废了。但runtime只认相对路径换机器也完全扛得住。2.3 插件加载顺序的底层逻辑为什么所有插件管理器都要求在plug#begin和plug#end之间声明因为在这个块里Vim会把每个插件的目录通过runtimepath插到加载路径的最前面。这个顺序不是摆设——靠后的插件如果定义的映射或者函数覆盖了前面的最终生效的一定是后加载的那个。比如我把tpope/vim-sensible这种统一默认行为的插件放在前面把自己在maps.vim里写的个性化映射放在后面就是为了确保我的映射能覆盖它的默认做法。如果你顺序反了费劲写的映射被插件覆盖排查起来非常隐蔽你甚至以为是自己的语法写错了。插件加载顺序还有一层含义是按需加载。vim-plug里可以这样写Plug junegunn/fzf, { do: { - fzf#install() } } Plug preservim/nerdtree, { on: NERDTreeToggle } Plug easymotion/vim-easymotion, { on: [Plug(easymotion-prefix)] }on后面可以跟命令名也可以跟按键动作的Plug名。意思是这个插件平时不加载直到你按下对应快捷键才被激活。这能让Vim启动时少读几十个文件速度提升立竿见影。3. 编辑体验的三把钥匙补全、导航、文本操作3.1 补全方案从YCM到coc.nvim的迁移我在插件配置里花功夫最多的是自动补全。早期我用过YouCompleteMe补全质量确实不错但它需要编译原生C组件在部分环境里编译折腾一次就是半小时起步而且它跟好多插件合不来的情况非常常见。后来我彻底转向了coc.nvim。coc.nvim 的全名是 Conquer of Completion它借助Node.js运行时把VSCode那套语言服务协议搬进了Vim。它对我来说最大的价值是语言无关。装好之后只要往项目里放一个coc-settings.json配置好对应的语言服务Python、Go、TypeScript、Rust都能接入。安装前需要确认环境node --version # coc.nvim 要求 Node.js 12 以上 vim --version # Vim 8.2且带 python3然后安装扩展:CocInstall coc-json coc-yaml coc-pairs coc-snippets我踩过的第一个坑是coc.nvim的服务是在后台任务里跑的如果你改了Vim配置导致崩溃错误提示经常滞后你根本不知道是哪一条设置引起的。后来我的习惯是一次改一处改完观察十分钟这比一次改十处再回头猜哪一处弄坏了靠谱得多。如果你连Node.js都不想装那可以退而求其次用vim-lsp或者asyncomplete.vim但体验会粗糙不少。我的建议是能做LSP的就别用正则补全。正则补全不知道什么是类型只能猜你以前输入过什么写几个同名变量时它根本给不了上下文感知。3.2 文件跳转模糊搜索加文件树谁才是主角自动补全解决词怎么打的问题文件导航解决代码在哪的问题。我对文件树的态度比较极端它最大的用处其实是给你全景而不是用来点文件。你用鼠标点在文件树上的动作本质上还是鼠标操作思维。真正提升效率的组合是模糊搜索 快速跳转。junegunn/fzf.vim是这一块的王牌。它需要系统里先装fzf本体git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install然后在vimrc里映射这几个动作nnoremap leaderf :FilesCR nnoremap leaderb :BuffersCR nnoremap leaderg :RgCR效果是按leaderf输入一个不完整文件名回车就到文件省掉一级级展开目录的时间比任何文件树遍历都快。文件树插件我仍然保留NERDTree但它的定位变了。我只在需要一口气看整个项目结构时才手动打开它。另外vim-fern、defx是很好的替代品如果对NERDTree的渲染速度不满意可以试试看文件树本身真没有什么不可替代性。3.3 文本操作的零思考体验补全和导航搞定之后真正决定你和Vim之间默契程度的是文本操作类插件。它们改变的不是能不能做而是要不要动脑子。我常用的这一套是这样的tpope/vim-surround快速给选中文本套上引号、括号、标签。cs把双引号变单引号ds删掉引号ysiw给光标下的词加引号。用顺了以后回到普通编辑器里会非常难受。easymotion/vim-easymotion连按两下leaderleader加目标字母光标在当前屏幕内直接跳过去。长文件里找位置不用再从头数行了。auto-pairs或vim-matchup自动配对括号并且让%能跳转到真正的配对括号而非纯字符匹配。mbbill/undotree可视化撤销树。Vim的撤销不是一条线而是一棵树想回退到十几步之前的某个状态时undotree比连按u靠谱得多。这些插件的共同点是把我原本需要想三秒的操作压缩成下意识的一个按键。组合一旦养成你写代码时脑子可以一直停留在业务逻辑上不用反复中断去思考该怎么移动光标、怎么改括号。这种流畅也正是不少人离开IDE之后反而回不去的原因。3.4 被低估的内置功能补丁补充两个不起眼但每天都会用到的插件。一是tpope/vim-commentary。它的核心能力一句话就能说清按gcc注释当前行按gc注释选中块。不用再去选块头再手工输入注释符。Python的#、C语言的/* */它都统一处理非常省心。二是tpope/vim-sensible。它不提供任何耀眼的功能只是把一组公认合理的默认项全部打开比如set nocompatible、set backspaceindent,eol,start这些琐碎设置。如果你不知道该从哪些基础配置写起先装它再在上面做减法比从零憋一个.vimrc平滑得多。另外Git集成我必装tpope/vim-fugitive。这个插件把:Gdiff、:Gstatus、:Gblame这些Git操作直接暴露在Vim里。你可以直接在Gstatus窗口里用-暂存文件用cc提交。就凭这一条足以说服很多Git重度用户留在Vim里。4. 美化的三层递进终端、配色、状态栏4.1 配色方案的选择逻辑从找个好看的到理解颜色空间美化Vim第一件事自然是配色主题。但我的建议是先不要沉迷于哪个主题最网红而是先搞清楚Vim的配色机制。Vim的颜色设置分为cterm和gui两套。简单讲cterm管终端环境下的颜色大部分终端最多只能支持256色gui管图形界面或真彩色终端里的颜色有完整RGB空间如果你的终端支持真彩色并且已经在Vim里开启了termguicolors那两者能统一。否则你会在终端里看到一个褪色版主题标点全灰、高亮不对、语法颜色糊成一团。这是我经过多次踩坑后确定的一套配置骨架if has(termguicolors) set termguicolors endif set backgrounddark colorscheme gruvbox主题选择上我长期用的有这几款主题特点适合场景gruvbox暖色调、对比度适中长期编程、深夜工作tokyonight蓝紫色调、边界清晰喜欢冷色调的人onedark跟Atom一脉相承前端转过来的人会很有熟悉感dracula鲜艳、辨识度高喜欢高饱和视觉的人我的建议不是只装一个而是装一个主题包比如flazz/vim-colorschemes里面集合了几百上千种主题切着看。用几天之后你会慢慢知道自己到底喜欢偏黄、偏蓝还是偏灰的背景。主题这件事没有标准答案你自己看着舒服才是唯一标准。4.2 状态栏与启动页信息密度和氛围感状态栏是花里胡哨最容易出效果也最容易出乱码的地方。两代人气插件vim-airline和lightline.vim。vim-airline功能开箱即用现成的tab栏、buffer栏、模式提示都有还自带一堆主题非常适合刚上手的人。但它的缺点是为了好看默认会用到Powerline字体里特殊的箭头字符如果终端没装对应字体屏幕上就是一串方框乱码。lightline.vim则是纯粹的状态栏渲染库自带装饰很少但你可以自己用代码控制每个子段显示什么。它加载开销小也更贴合我自己控制一切的折腾精神。我的建议如果图省心用vim-airline并装好对应字体如果追求启动速度和精细控制用lightline。这条配置可以让airline不再那么塑料感let g:airline_theme gruvbox let g:airline_powerline_fonts 1 let g:airline#extensions#tabline#enabled 1 let g:airline#extensions#tabline#left_sep 启动页是美化的另一块高地。每次打开一片欢迎使用Vim的文言文确实非常劝退。我用的是mhinz/vim-startify它在Vim和Neovim都能跑能显示最近打开的文件列表还能接入Git状态。这样每次打开Vim不是直接进一个空文件而是先进一个今日工作台氛围感直接拉满。4.3 图标字体与终端真彩色最容易被忽略的底层配置到这里配色和状态栏都已经准备就绪但如果你打开文件树发现文件夹图标全部变成了方框那问题就出在图标字体上。文件树和状态栏里那些五颜六色的小图标其实都是字符编码里的私有区符号必须由对应的Nerd Font字体渲染出来。你要做的不是去改插件配置而是去Nerd Fonts官网下载一款编程字体比如 FiraCode Nerd Font把字体安装进系统在终端设置里切换成该字体回到Vim里打开文件树图标才会真正生效如果实在不想装字体也有一条退路把文件树的图标功能关掉。比如NERDTree可以通过let g:NERDTreeDirArrowExpandable 这类选项调整显示。你总不希望满屏方框影响心情。真彩色的生效则必须终端层面配合。举个例子在tmux里跑Vim时tmux默认把内部终端类型改成screen导致Vim以为只有256色。解决方案大致是在tmux配置里设置set -g default-terminal tmux-256color再确认外层是否保留了RGB能力。提前帮大家把坑画出来真彩色和256色的差异用肉眼是能看出来的同样的主题256色模式下渐变完全断裂渣都不剩。5. 踩坑实录真彩色、乱码方块与加载卡顿5.1 真彩色失效的完整排查思路如果你设置完主题感觉颜色不对第一反应不该是这个主题不好看而是先排查是不是真彩色没生效。我的排查链路是这样的第一步在终端里执行echo $TERM。如果显示的是xterm-256color或screen说明终端或tmux还在用256色模式。第二步在Vim里执行:echo t_Co。如果输出小于16777216说明Vim认为当前环境颜色数不够。第三步检查.vimrc里的set termguicolors是否真的被执行了。有时候你把它写在了某个不满足条件的if分支里主题就会静默回落到cterm模式。第四步如果你用了终端复用器比如tmux那还需要单独排查外层是否保留了RGB能力。这一步建议一次只改动一项配置测试正常后再动下一项。我见过有人一次性改了七八行tmux配置结果分屏颜色全乱排查成本高得吓人。5.2 状态栏和文件树的图标乱码这个坑几乎人人都踩。表现就是状态栏出现一堆方框或者??文件树目录前的折线图标变成问号。原因很简单插件的好看依赖字体。airline的箭头符号用的是Powerline专用区NERDTree的图标依赖Nerd Font。两条路任选安装字体下载并安装Nerd Font然后在终端设置里选择对应字体名称。注意是设置终端字体不是设置Vim。很多人卡在这一步卡了很久。关闭图标暂时装不了字体就在配置里关掉对应选项let g:webdevicons_enable 0 let g:airline_powerline_fonts 0我个人经验是既然已经走上花里胡哨这条路了那装一个Nerd Font一劳永逸别在乱码里挣扎。每次看到有人因为乱码放弃状态栏美化我都觉得可惜——其实只差一个字体文件而已。5.3 启动从200ms到30ms的优化过程刚开始折腾时我也很贪心把社区里推荐度高的插件几乎都装上了。结果Vim启动要200多毫秒虽然体感还凑合但每次开新终端都明显顿一下。后来做完优化稳定在30ms左右。主要做了三件事。第一把不常用的插件改成on延迟加载这点第2节说过不再赘述。第二用:profile定位耗时大户。具体是:profile start profile.log :profile func * :profile file * 然后正常操作一会儿触发各类插件加载 :profile pause打开profile.log看每个函数和脚本的执行时间哪一行最慢一目了然。我第一次跑的时候发现某个主题的配置里有一个高亮循环执行了上万行占了总启动时间一半以上。换掉那一段之后启动速度立刻起飞。第三把偶尔才用的重型功能包在函数里用call按需调用而不是在启动阶段执行。比如LaTeX支持、大文件检测脚本都是这个思路。5.4 版本兼容性Vim与Neovim的分岔路最后特别提醒一点Vim和Neovim虽然兼容但插件生态已经明显分叉。很多新插件明确写着Neovim only比如那些基于Lua或者异步框架的新生代插件硬装在Vim里只会得到错误提示。反过来一些老牌Vim插件在Neovim里能跑但可能需要额外适配。如果你在Vim和Neovim之间来回切换我建议配置文件尽量只写两边通用的语法专门差异用条件分支if has(nvim) Neovim 特有配置 else Vim 特有配置 endif这样一份配置两边都能用不用维护两份。我见过有人因为喜欢某个插件而专门换编辑器其实大可不必工具是拿来用的别把自己绑死。6. 把配置用了两年之后我的真实维护经验写到这里我不急着催你去一口气装一堆插件。折腾完只是第一步真正让配置长期活下来的是持续修剪。我自己的习惯是每三个月重新过一遍配置和插件列表凡是注释里写着试试看但三个月没碰过的一律删掉。插件也是别抱着说不定以后用得上的心态攒仓库这样的Vim迟早被插件拖垮。清爽本身就是一种性能优化。另外分享一个陪我多年的小习惯把所有配置文件纳入Git管理。每次有大的改动提交一个版本。这样一旦某次折腾坏了一条命令就能退回昨天能用的状态。这个习惯救过我很多回比任何备份工具都直接。最后如果你问我花掉的那些时间值不值得我会说值。不是因为我的Vim码字变快了多少而是我终于明白工具和人的关系本应是不断磨合不是被迫适应。你给编辑器投入的心思最终会以更流畅的输入体验回报给你。这篇的经验也只代表我个人的选择你完全可以拿着这套方案再加加减减做成属于你自己的那台花里胡哨的Vim。
返回列表