Vim 修炼场
CHAPTER 01 · 生存篇

模式与 IDE 配置:今天就能活下来

预计阅读 45 分钟(含练习约 1 小时)· 前置:无,零基础可读 · 本章演示 7 个

学习目标

  • 理解「模式」是 Vim 与其他编辑器的根本区别,而不是一个别扭的怪癖
  • 在 VSCode 和 IntelliJ IDEA 里装好 Vim 插件,并确认它真的在工作
  • 掌握生存最小集:i a I A Esc x dd o u :wq
  • 建立全教程最重要的习惯:普通模式是家,插入模式只是出差
  • 学会正确的 Esc 指法,知道每天怎么热身
  • 学会使用本站的动画演示(播放 / 单步 / 调速 / 单步回看)

1. 为什么 Vim 长这样:模式

1.1 一切从「你的时间花在哪」说起

回想一下你昨天写代码的两小时:真正在输入新代码的时间有多少?大部分时间其实花在读(上下滚动、找人)、跳(去第 38 行改个参数、去函数结尾加一行)、改(换个变量名、删半行、补个分号)上。输入只是众多动作里的一种,而且往往是最短的那一种。

你用过的编辑器几乎都按「打字机」设计:键盘的唯一职责是往光标处塞字符,于是「改」这件事被拆成了 —— 拿鼠标选中之、按退格删掉之、再打字补上之;手在键盘和鼠标之间来回奔波,眼睛跟着光标满屏找。

Vim(1991 年 Bram Moolenaar 发布,前身是 1976 年的 vi)赌了另一个方向:把键盘一分为二 ——

  • 普通模式(NORMAL):一副操纵杆。每个键都是命令 —— 移动、删除、复制、跳转,手不离主键区,眼睛不离代码;
  • 插入模式(INSERT):一台打字机。只有在这里,打的字才是字。

四十年过去,这套赌注赢了:今天你在 VSCode、IDEA、Chrome、甚至 Gmail 里都能找到 Vim 键位插件。它不是「老古董的固执」,而是被反复验证过的编辑模型。

1.2 直观感受:同一件事的两种做法

场景传统做法Vim 做法
删掉一行 手挪到鼠标 → 点行首 → 拖到行尾 → 删除(或 CmdL 整行选中再删) dd,两个键,手没动
行尾补个分号 → 按到底(或 Cmd→)再输入 A,输入,完事
改一个单词 双击选中 → 删除 → 重新输入 本章之后你还会学到 ciw 三个键直接「改这个词」(第 4 章)

注意第三行:Vim 的动作读起来像一句话 ——「change inner word(改 内部 词)」。这不是巧合,而是设计:Vim 是一门微型的编辑语言,动词 + 名词拼出无穷句子。本章先学最短的几个「单词」,第 4、5 章开始造句。

1.3 一个键,两种人生

模式带来的直接推论:同一个键,在不同模式下含义完全不同。这不是 Vim 难学的借口,而是它高效的原因 —— 字母键不用来拼命令(没有 Ctrl+Shift+X 这种和弦),而是直接当按钮用:

按键插入模式里普通模式里
d输入字母 d删除动词,等待目标
x输入字母 x删掉光标处一个字符
o输入字母 o下方打开新行
u输入字母 u撤销上一个变更

1.4 模式地图

四种常用模式的全景与切换路线如下 —— 任何模式按 Esc 都把你送回普通模式:

NORMAL 操纵 · 跳转 · 家 INSERT 输入文本 VISUAL 选择区域(第 7 章) CMDLINE : 命令(保存 / 替换) i a o … Esc v V C-v Esc : Enter Esc 任何模式按 Esc 都回 NORMAL —— 普通模式是家
图 1-1 · 模式切换地图。本章只用到 NORMAL ⇄ INSERT 和一条通往 CMDLINE 的路;VISUAL 在第 7 章等你

四种常用模式,一句话各自定位:

  • NORMAL 操纵与跳转的大本营,90% 的时间待在这里;
  • INSERT 打字的出差模式,办完事就回;
  • VISUAL 先选中、再操作 —— 你熟悉的「拖选」的模式版(第 7 章);
  • CMDLINE 屏幕底部的一条命令行:保存、替换、批量操作都从这里出发(第 8 章)。

另外两种你现在不用管:替换模式(R,边打边覆写,第 6 章)和 Select 模式(很少用,VSCode/IdeaVim 里基本遇不到)。

💡 心法 新手 90% 的痛苦是「不知道自己在哪个模式,按了键没反应或反应奇怪」。解药只有两味:盯着状态栏(插件会显示当前模式),以及 迷路就按 Esc —— 按错模式里的键,最坏结果也就是多打了几个字,按几下退格就回来。

2. 五分钟装备你的 IDE

本教程面向「在 IDE 里用 Vim」:你不需要换编辑器,不需要配终端,插件装完立刻可用。完整的推荐配置在第 12 章,现在这套最小集足够学完全书。

先建个靶场:新建一个 vim-practice.txt(或 IDE 里的 Scratch 文件),随便粘几十行代码进去。今天所有练习都在它身上做,别拿正在工作的代码当靶子。

2.1 VSCode:安装 VSCodeVim

  1. 扩展市场(CmdShiftx)搜索 Vim,安装 VSCodeVim(发布者 vscodevim.vim,下载量千万级那个),点「重新加载」;
  2. 确认生效:打开任意文件,左下角状态栏出现 -- NORMAL --;按 i 它变成 -- INSERT --,按 Esc 变回来 —— 成了;
  3. 建议追加这段最小配置(Cmd, 打开设置,右上角图标切到 JSON 编辑):
{
  "vim.useSystemClipboard": true,   // y 复制 / p 粘贴直接走系统剪贴板
                                    // (Cmd-C / Cmd-V 也照常可用,两边不打架)
  "vim.hlsearch": true,             // 搜索命中高亮(第 8 章用)
  "editor.lineNumbers": "relative"  // 相对行号:第 3 章 5j 这种跳法的前提
}
  • 临时禁用:偶尔需要纯 IDE 操作(比如拖拽选中大段)时,CmdShiftp 执行 Vim: Toggle Vim Mode,用完再切回来。

2.2 IntelliJ IDEA:安装 IdeaVim

  1. Settings → Plugins → Marketplace 搜索 IdeaVim,安装并重启 IDE;
  2. 确认生效:打开文件按 :,屏幕左下角出现命令输入条;或右下角状态栏出现 Vim 模式指示 —— 成了;
  3. 创建 ~/.ideavimrc(终端 touch ~/.ideavimrc,没有这个文件插件也照样能用,配置只是锦上添花):
set number          " 显示行号
set relativenumber  " 相对行号(第 3 章讲为什么)
set hlsearch        " 搜索高亮
set incsearch       " 边输入边匹配,所见即所得
  • 以后改了这个文件,在编辑器里执行 :so ~/.ideavimrc 立即生效,不用重启;
  • 临时禁用:点击编辑器右下角的 Vim 图标,可以一键关掉插件(救急用)。
✅ 装完的检查清单 ① 状态栏能看到当前模式;② i / Esc 能自由进出插入模式;③ 输入 :w 回车后,标签页上的修改标记(小圆点/星号)消失了。三条都过,装备完毕。
⚠️ 注意 装完插件后,部分按键会被 Vim 接管:IDEA 里的 Ctrld 会变成「向下翻半页」而不是全局搜索类操作,VSCode 里 Cmdd 之外的多数单键也会先被 Vim 吃掉。冲突如何仲裁、哪些键建议还给 IDE,第 12 章专门讲;现在先不管,不影响本章。

3. 第一课:进去,出来 —— i / a / I / A / Esc

插入模式不是常态,是出差:按 i 进去,办完事(打完字),立刻按 Esc 回家。这一来一回是 Vim 的第一块肌肉记忆,先看动画:

3.1 i:在光标前落笔

注意两个细节:① 进入插入模式后,状态栏变成 -- INSERT --,光标从「块」变成「竖线」;② 按 Esc 回普通模式时,光标会左移一格,停在最后输入的字符上 —— 这是 Vim 的刻意设计,普通模式的命令永远作用在光标所在的字符上。

3.2 a:在光标后落笔

i 在光标前插入;如果你要写在光标后(比如给变量加个后缀),用 a(append),它会先把光标右移一格再进入插入:

3.3 I 与 A:行首与行尾的直达版

给行尾补分号,难道要先按一路 →?不用。A 直接跳到行尾进入插入;同理 I 跳到行首(第一个非空白字符,自动保留缩进)进入插入。它们是 i/a 的「直达版」,顺手还会偷看到下一章的主角 j:

按键含义典型场景
i光标【前】进入插入在标识符中间改内容
a光标【后】进入插入给标识符加后缀
I行首(首个非空白)进入插入行首加 // 注释
A行尾进入插入行尾补分号 / 补逗号
o下方开新行并进入插入函数体里加一条语句
O上方开新行并进入插入在当前行前面插一行

3.4 到底选哪个?一个简单的决策法

别背表格,问自己一个问题:我要在哪里落笔?

  • 落笔处在光标前 / 后 → i / a;
  • 落笔处在行首 / 行尾 → I / A(省掉移动光标的两步);
  • 落笔处是不存在的行(上面/下面新建)→ O / o。

选错了也不要紧:Esc 回来重选就是,成本一秒钟。练到后来,手指会先于意识做出选择 —— 那就是肌肉记忆到了。

3.5 插入模式里的世界

插入模式里你仍然可以:

  • 正常打字、删除(⌫ 退格)、用方向键小范围挪动 —— 但请尽量克制,方向键是坏习惯的开始;
  • 用 Ctrlo 临时执行一个普通模式命令,然后自动回到插入模式(彩蛋,第 6 章细讲);
  • 用 Ctrlw 删掉光标前一个单词(比连按退格快,第 6 章细讲)。

另外记住一个彩蛋键 gi:回到上次退出插入模式的位置并直接进入插入 —— 刚才 Esc 出来想马上回去补两个字?它就是为此而生(第 6 章细讲)。

训练法:在靶场文件里,光标放到任意标识符上,按 i 输入两个字母,Esc;再按 a 输入两个字母,Esc。重复二十次,目标是不看键盘、不想「我在哪个模式」 —— 手自己知道。

4. 保命三键与后悔药:x / dd / o / u

普通模式的威力初体验:不进插入模式,也能删、能开行。而且删除的粒度一开始就比「按住退格键」大:

4.1 x:删一个字符

x 删掉光标处的字符。手滑多打了一个字符?光标挪过去(暂时用方向键没关系)一刀。它还有个镜像 X,删光标前的字符(相当于退格,但不用进插入模式)。

4.2 dd:删一整行

为什么是两个 d?第一个 d 是动词「删除」,它在等一个宾语;第二个 d 表示宾语 = 当前行 —— 「删,删的对象是这行」。这就是 Vim 编辑语言的第一个完整句子,虽然是个省略句。后面的章节里,你会把第二个 d 换成别的名词:换成 w 删一个词、换成 ) 删到句尾…… 动词不变,宾语随便换。

4.3 o:向下开新行

4.4 u 与 Ctrl-r:后悔药与反后悔药

关于撤销,现在记一件事就够:一次「变更」对应一次 u。你从 i 进插入模式到 Esc 出来,中间不管打了多少字,算一次变更 —— 一键全撤。这个特性非常好用,细讲在第 10 章。

意图按键备注
删一个字符x镜像 X 删光标前的
删整行dd动词 + 当前行
下面开新行o直接进入插入模式
上面开新行O同上,方向相反
撤销u一次撤销一个变更
重做Ctrlr把刚撤销的再做回来
💡 数一数按键 「删掉这一行」:鼠标方案 = 手离键盘 + 定位 + 拖选 + 删除 ≈ 3–4 秒;dd 方案 = 0.3 秒,且视线从未离开代码。单次差距小,乘以每天几百次,就是下班时间的差距 —— 这是学 Vim 的全部经济学。

5. 保存与退出:命令行模式

按 : 进入命令行模式:屏幕左下角出现一条命令行,输入命令、回车执行;按 Esc 取消。最常用的几条:

命令含义IDE 中的等价物
:w保存(write)Cmds
:q关闭当前文件 / 标签页(quit)Cmdw
:wq保存并退出两者连按
:q!不保存,强制退出(放弃全部修改)关闭时选「不保存」
ZZ普通模式直接按,等价 :wq(免冒号)—
:w 文件名另存为(第 11 章细讲)Save As

细节控补充::x 与 :wq 几乎等价,区别是 :x 只在真的改过时才写盘(不刷新文件的修改时间)。知道即可,不必背。

5.1 命令行小技巧

  • 命令行里按 ↑ / ↓ 可以翻命令历史 —— 刚才敲过的 :w 再按一次只需 :↑⏎;
  • 输到一半想放弃:Esc 或 Ctrlc 都可以全身而退;
  • 命令行也是模式:待在里面时打的字都是命令的一部分,不会进文件 —— 迷路了照例 Esc。

6. 指法与热身:Esc 到底怎么按

Esc 在键盘左上角,看起来很远,其实标准指法下左手小指向左上方轻伸一格就够到 —— 和按 ~ 同一个位置区间。不用看键盘,不用挪手腕。前三天的酸痛感是正常的,第四天开始它会变成反射。

动作指法练习
按 Esc左手小指左上伸展,手腕不动每天开工前热身 30 秒:
Esc j Esc k × 10 遍
(j / k 就是下 / 上,先混脸熟)
按 dd左右手食指各一下,同时击键感
按 i / a右手 / 左手中指或食指,回位要快

如果小指确实吃力,macOS 可以把大写锁定键改成 Esc(系统设置 → 键盘 → 功能键行为,或用 Karabiner-Elements 做更细的映射)—— 很多人这么干,详细步骤见附录 B。先试原味指法一周,再决定要不要改。

7. 今日训练计划(45 分钟)

学 Vim 不靠顿悟,靠今天这 45 分钟。照着做:

时间盒内容通过标准
0–10 分钟重读 §1 与 §3,重放全部 7 个演示(用 ⏭ 单步,看清每一步状态栏)能说清 NORMAL / INSERT / CMDLINE 各干什么
10–25 分钟终端里 vimtutor 做完第 1 讲(官方版热身)不看提示完成删字符、插入、撤销
25–35 分钟练习 2:删-悔-开行十连(靶场文件)全程不看键盘
35–45 分钟练习 3 与练习 4:i/a 改名 + 盲操作自测盲测 8/10 通过,今天毕业

8. 如果本章只记住三件事

  1. Esc 回家:迷路、按错、恐慌,一律先按 Esc;
  2. 出差办完就回:插入模式只用来打字,打完立刻退,别在里面安家;
  3. u 管够:大胆练,一个键就能时光倒流。

下一章我们解决第一个真问题:怎么把光标快速挪到想去的地方 —— 方向键从此退役,主键区接管一切移动。

练习

练习 1:官方 vimtutor 第一讲(约 15 分钟)

打开终端输入 vimtutor(macOS 自带),做完第 1 讲即可。它就是官方版的本章内容,双保险。做完你应该能不假思索地完成:移动光标、x 删字符、i/a 插入、u 撤销、:q 退出。

练习 2:在 IDE 里做「删 — 悔 — 开行」十连

靶场文件,光标放到某行:dd 删掉 → u 悔回来 → o 在下面开新行,输入一行注释,Esc。循环 10 次。要点:全程不看键盘,感受 dd 和 u 的粒度都是「一整行」。

练习 3:只用 i / a / I / A / Esc 改代码

四件事各做 5 次:① 光标停在标识符中间,用 i 加前缀;② 用 a 加后缀;③ 随便找一行,用 I 在行首加 // 把它注释掉;④ 用 A 给没有分号的行补分号。每次都以 Esc 收尾。开始建立「进 → 打 → 出」的节奏感:决定用哪个键的瞬间,就是你开始用 Vim 思考的瞬间。

练习 4:盲操作自测(毕业考)

把手放在键盘上,眼睛离开键盘(看屏幕就行):闭着眼完成序列 dd → u → o → 输入 test → Esc。做 10 组,成功 8 组即毕业。失败的都是 Esc 没按实 —— 明天继续热身。

常见陷阱

🕳 Esc 太远,按着累 左手小指往左上一勾就是,标准指法本来就该够到;如果确实痛苦,macOS 可以把大写锁定键改成 Esc(系统设置 → 键盘 → 功能键),一劳永逸 —— 详细步骤见附录 B。建议先练一周原味指法再决定。
🕳 常驻插入模式综合征 新手的本能:按一次 i 进去,把插入模式当普通编辑器用,改半天不出来。这样等于只买了 Vim 的壳。心法反过来:普通模式是家,每次只在需要打字的那几秒钟进插入,打完立刻 Esc。
🕳 插入模式漫游 进了插入模式就忘了出来,用方向键或鼠标在文件里逛,逛到别处继续打字 —— 模式纪律彻底崩坏。对策:每次想移动光标,先 Esc 回普通模式再动;移动本来就是普通模式的职责(下一章整章都在讲怎么优雅地移动)。
🕳 中文输入法卡在中文状态 插入模式打完中文,按 Esc 回普通模式,但输入法还是中文 —— 下次按 d 想删除,却弹出了拼音候选。短期:手动切回 ABC;根治:VSCodeVim 的自动切换输入法(配合 macism),配置见附录 B。

VSCode / IDEA 差异

VSCode(VSCodeVim)

  • 安装即用,零配置可学完本章;状态栏左下角显示 -- NORMAL -- / -- INSERT --,迷路就瞄一眼
  • :w 完全等价 Cmds;:q 关闭标签页;:wq 保存并关闭
  • vim.useSystemClipboard 开启后,y / p 与 Cmd-C / Cmd-V 共用系统剪贴板,互不打架
  • 临时停用:CmdShiftp → Vim: Toggle Vim Mode
  • Cmd, 搜 vim 可看到全部选项(完整推荐见第 12 章)

IntelliJ IDEA(IdeaVim)

  • 装 IdeaVim 插件 + ~/.ideavimrc(见上文),改完 :so ~/.ideavimrc 热加载
  • :w 保存当前文件;:wq 会保存并关闭标签页
  • 右下角有 Vim 图标,可一键临时停用插件(需要纯 IDE 操作时救急)
  • IDEA 自身的 Cmds / Cmdw 依然可用,Vim 命令是叠加而非替换
  • 插件在 IDE 内更新即可,不用动 .ideavimrc

本章速记

按键作用按键作用
i / a光标前 / 后进入插入x删一个字符
I / A行首 / 行尾进入插入dd删整行
o / O下 / 上开新行u / Ctrlr撤销 / 重做
Esc回普通模式(回家)ZZ保存退出(= :wq)
:w :q :wq :q!存 / 关 / 存关 / 弃改强退gi回上次插入点(彩蛋)

一句话心法:普通模式是家,插入模式是出差;迷路就按 Esc。