modal editing · 把按键变成状态机
x 在 normal 是删字符、在 visual 是删选区、在 insert 是输入字母 x。模式 = 状态,按键 = 状态转移函数。理解这条,Vim 就不是玄学,是工程。
很多人放弃 Vim 是因为"快捷键太多记不住"。但 VS Code 的快捷键更多,没人因此放弃。Vim 真正的反常识是:同一个键,含义随模式变。
这是教科书级的有限状态机(FSM):当前状态 + 输入 → 下一状态 + 输出动作。普通编辑器是"一键一动作"的查表,Vim 是"一键一转移函数"的状态机。代价是要记当前在哪个模式,收益是按键空间被复用了 N 倍——26 个字母键在 4 个模式下等于 104 个动作,还不用按 Ctrl。
所以"Vim 难学"的真正原因是:你的肌肉记忆要从"按键→动作"升级成"按键→状态→动作"。一旦升级完成,效率是普通编辑器的几倍——因为手指不离开主键区。
点上面的模式按钮切换模式,再点下面的按键,看同一个键在不同模式下做了什么。光标(蓝色块)会移动,选区(蓝色淡底)会出现。
剥掉所有花哨功能,一个模式编辑器的核心就是一个状态循环:
关键设计:transition 是一张 (state, key) → action 的二维表,不是 if-else 堆。这样加新模式只需加一行表项,不用改主循环。这就是为什么 Vim 能扩展出几十种模式(operator-pending、command-line、select…)而不崩——它的内核是数据驱动的,不是代码堆出来的。
从零写一遍这个 30 行内核,你会突然理解 Vim 那些"奇怪"设计:为什么 d 后面要跟一个 motion(因为 d 是 operator,它等下一个输入决定删什么——这本身又是一个临时模式);为什么 Esc 回 normal 是"回到安全屋"(normal 是唯一一个不会误改文本的模式)。
有人觉得模式编辑是 1976 年的过时设计。但看看 2020 年后的新编辑器:Helix、Kakoune 全是模式编辑;VS Code 的 Vim 插件有上百万安装量;甚至 Emacs 的 evil-mode 把 Vim 模式搬进了 Emacs。模式编辑不是怀旧,是回潮。
原因有两个:一是键盘没变,主键区还是最高效的输入区,模式让 26 键复用 N 倍;二是 AI 时代,编辑器要处理"选区→指令"的语义操作(选中一段代码→"重构它"),模式天然把"选择"和"操作"分开,比鼠标拖拽更适合命令化。Vim 的 vi((选中括号内)+ c(改)这种组合,本质就是"语义选区 + 动作",和 AI 指令是同一个范式。
所以学 Vim 不是学一个老工具,是学一种把输入空间折叠进状态空间的设计思想——这种思想在 AI 编辑器时代只会更值钱。