跳转到内容

Vim — 键盘上弹钢琴的编辑器

待复核

Vim 是一个纯键盘操作的文本编辑器——你不用鼠标点菜单,而是靠输入指令来移动光标、删除文字、复制粘贴,手指几乎不离开主键区。

日常类比:普通编辑器像触屏手机,哪里亮了点哪里;Vim 像钢琴——每个键是一个音符,按键组合形成”和弦”,熟练之后手速远超点按,但得先学琴谱。

你在终端输入 vim hello.txt,屏幕上出现文件内容,但你打字什么都不会出现——因为你此刻处于”普通模式”,键盘上的每个字母都是一条指令而不是要输入的字符。按 i 才进入”插入模式”,这时打字才会真正写进文件。

Vim 全名 Vi IMproved,1991 年由 Bram Moolenaar 在 Vi(1976)基础上增强而来。GitHub 仓库 38k+ star,是目前仍在活跃维护的最古老编辑器之一。

不理解 Vim 的模态编辑范式,下面这些事都没法解释:

  • 为什么几乎所有现代编辑器(VS Code、JetBrains、Zed)都提供 Vim 模式插件——五十年了依然是键盘编辑的事实标准
  • 为什么 SSH 登录远程服务器,Vim 是最常见的开箱可用编辑器——几乎所有 Linux/macOS 都预装了 vi 或 vim
  • 为什么 Neovim、Helix、Kakoune 这些新编辑器都以 Vim 为参照来定义自己——要么”兼容 vim”,要么”对标 vim 但改掉 X”
  • 为什么 Stack Overflow 上 “how to exit vim” 常年是最高阅读量的问题之一——模态编辑对第一次碰到的人极度反直觉

Vim 的设计哲学可以拆成 三个支柱

  1. 模态编辑:键盘在不同模式下做不同的事。普通模式(Normal)用来移动和操作文本;插入模式(Insert)用来打字;可视模式(Visual)用来选区;命令模式(Command-line)用来执行保存/搜索/替换等命令。你大部分时间应该待在普通模式,只在需要输入文字时短暂切到插入模式——这和大多数编辑器”永远在打字”的心智模型完全相反。

  2. 操作 = 动词 + 名词:Vim 的按键就像一门迷你语言。d 是”删除”(动词),w 是”一个单词”(名词),dw 就是”删除一个单词”。c 是”修改”,i" 是”引号内的内容”,ci" 就是”修改引号里的内容”。掌握十几个动词和名词,排列组合出上百种操作。

  3. 可组合性和重复性:像把一段钢琴指法录下来再反复弹——3dw 删除三个单词,.(点号)重复上一次操作,q 录制宏再回放。Vim 不鼓励一次性的鼠标操作,鼓励”描述意图 → 让编辑器重复执行”。

Terminal window
vim hello.txt # 打开文件,进入普通模式

进入后按 i 切到插入模式,输入 Hello, World!。按 Esc 回到普通模式。输入 :wq 回车——w 保存、q 退出。恭喜你完成了 Vim 的最小闭环。

假设光标停在一行代码 const name = "old value"o 字符上:

ci"new value<Esc>

c = 修改,i" = 引号内部。结果:引号内容变成 "new value",光标自动跳到正确位置。你没有用鼠标选中旧文字,也没有按 Backspace 一个个删。

你要把文件里所有的 foo 改成 bar,但只改部分位置:

/foo<Enter> # 搜索 foo,跳到第一个
cwbar<Esc> # cw = 修改一个单词,输入 bar
n # 跳到下一个 foo
. # 重复上次修改(自动变成 bar)
n # 再跳
. # 再改——需要的就按 .,不需要的就按 n 跳过

这就是 Vim 用户常说的”点号大法”——比全局替换更精准,比手动一个个改更快。

  1. 被困在 Vim 里出不去:第一次打开 Vim 的人不知道怎么退出。记住 Esc 回普通模式,:q! 不保存强制退出,:wq 保存退出。这是生存级知识。

  2. 在普通模式下打字导致乱操作:以为自己在输入文字,实际上 Vim 在执行命令。比如不小心按了 dd,整行就被删了。解决办法:看左下角——如果显示 -- INSERT -- 才是插入模式,空白则是普通模式。

  3. 把 Vim 配置搞得比代码还复杂:新手容易抄一大堆 .vimrc 配置,结果出了问题完全不知道哪行导致的。建议从空配置开始,每次只加一两行,理解每行在做什么。

  4. 忽略内置帮助系统:Vim 自带极其详细的帮助文档,:help 进入,:help w 查看 w 的用法。很多人不知道这个系统存在,跑去搜博客其实绕了远路。

适用

  • SSH 到远程服务器改配置文件——服务器上不一定有你喜欢的编辑器,但 vi/vim 几乎永远在
  • 大量重复性文本编辑——宏录制和点号重复让批量操作极快
  • 想要一个几十年不变的肌肉记忆投资——Vim 按键 1991 年至今没变过,学一次用一辈子
  • 终端工作流爱好者——和 tmux、ripgrep、fzf 组成全键盘开发环境

不适用

  • 刚学编程的第一天——先把精力放在理解代码上,编辑器之后再换
  • 需要深度 GUI 集成的场景——Vim 不擅长图形化调试、拖拽式 UI 设计
  • 团队全员用 VS Code 且需要实时协作——Live Share 这类功能 Vim 原生没有
  • 不愿花 1-2 周适应期的人——前三天改配置文件会明显变慢;SSH 救急立刻有用,但日常写代码要熬过肌肉记忆重建
  • 1976 年:Bill Joy 在 UC Berkeley 写出 Vi,作为行编辑器 ex 的可视化前端。当年终端连屏幕刷新都很奢侈,Vi 的设计目标就是”用最少按键做最多事”。
  • 1991 年:Bram Moolenaar 为 Amiga 写出公开版(早期叫 Vi IMitation),后改名 Vi IMproved,即 Vim;多级撤销、语法高亮、插件等是后续版本陆续加上的。
  • 2006 年:Vim 7.0 发布,给已有的 vimscript 加上 List/Dictionary 等能力;这门语言后来被社区诟病”只有 Bram 一个人能维护”。
  • 2014 年:Neovim 从 Vim 代码库 fork,目标是让代码可维护、支持异步和 Lua。这逼着 Vim 也加快了迭代。
  • 2023 年:Bram Moolenaar 去世。社区接管维护,Vim 9 继续更新,但核心团队规模远小于 Neovim。

一个够用的 ~/.vimrc,10 行以内:

set number " 显示行号
set relativenumber " 相对行号——方便 5j/3k 快速跳行
set expandtab " 按 Tab 输入空格
set shiftwidth=4 " 缩进 4 格
set tabstop=4 " Tab 显示宽度 4
set hlsearch " 搜索结果高亮
set incsearch " 边输入边搜索
set ignorecase " 搜索忽略大小写
set smartcase " 输入大写时变回区分大小写
syntax on " 语法高亮

不要一上来就抄 200 行配置。这 10 行让你在默认 Vim 上就能舒服工作。

  1. 模态编辑是范式不是功能:把”移动 / 编辑 / 选择 / 命令”分到不同模式,减少按键冲突,代价是学习曲线——这个 trade-off 50 年后仍在影响所有编辑器设计
  2. 组合优于枚举:十几个动词 + 十几个名词排列组合出上百种操作,比给每个操作绑一个快捷键更可扩展——这个思路和 Unix 管道哲学同源
  3. 可重复性是效率根基. 重复、q 录宏、:g 全局命令——Vim 鼓励你先”描述意图”再”机械执行”,和手动一次次点鼠标的工作方式根本不同
  4. 生存周期最长的工具靠的是稳定接口:Vim 按键 1991 年定型后几乎没变,无数工具和编辑器兼容这套接口——先投资稳定接口,再追求新功能
  5. 一个人的项目有天花板:Bram 独力维护 Vim 三十年,代码质量和迭代速度终究受限。Neovim 的出现证明了开放治理对长寿项目的必要性
  • 官方入门:在终端输入 vimtutor——一个交互式 30 分钟教程,跟着做就能学会基本操作
  • 速查表:Vim Cheatsheet(一页纸查所有常用按键)
  • 进阶思维:Practical Vim (Drew Neil)(“用 Vim 的方式思考”的最佳教材)
  • neovim —— Vim 的现代分叉,把 Lua、异步、LSP 都加了进去
  • helix —— 不兼容 Vim 按键但继承模态编辑思想的 Rust 编辑器
  • kakoune —— “先选后操作”的模态编辑器,和 Vim 的”先操作后选”形成对照
  • neovim —— 从 Vim 代码库 fork,保留按键但重做内核
  • helix —— 走了另一条路的模态编辑器,和 Vim 互为参照
  • ripgrep —— 现代 Vim/Neovim 生态里替代 vimgrep 的搜索工具
  • fzf —— 模糊搜索,常作为 Vim 插件的文件查找后端
  • tmux —— 终端复用器,和 Vim 组成经典 SSH 工作流
  • astronvim —— AstroNvim — 社区驱动的 Neovim 配置
  • atom —— Atom — Web 技术做桌面编辑器的先驱
  • doom-emacs —— Doom Emacs — 启动不到一秒的模块化 Emacs 配置
  • emacs —— GNU Emacs — 一个伪装成编辑器的 Lisp 操作系统
  • geany —— Geany — 用 C 写的轻量级 GTK 编辑器
  • lazyvim —— LazyVim — lazy.nvim 驱动的 Neovim 发行版
  • lunarvim —— LunarVim — 开箱即用的 Neovim IDE 发行版
  • nvchad —— NvChad — 极致美观的 Neovim 配置
  • spacemacs —— Spacemacs — 让 Vim 党和 Emacs 党握手的编辑器配置
  • texstudio —— TeXstudio — LaTeX IDE
  • textmate —— TextMate — macOS 上定义 bundle 宏系统的编辑器
  • xi-editor —— xi-editor — 异步架构编辑器的先驱实验