模式与 IDE 配置:今天就能活下来
学习目标
- 理解「模式」是 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 操纵与跳转的大本营,90% 的时间待在这里;
- INSERT 打字的出差模式,办完事就回;
- VISUAL 先选中、再操作 —— 你熟悉的「拖选」的模式版(第 7 章);
- CMDLINE 屏幕底部的一条命令行:保存、替换、批量操作都从这里出发(第 8 章)。
另外两种你现在不用管:替换模式(R,边打边覆写,第 6 章)和 Select 模式(很少用,VSCode/IdeaVim 里基本遇不到)。
2. 五分钟装备你的 IDE
本教程面向「在 IDE 里用 Vim」:你不需要换编辑器,不需要配终端,插件装完立刻可用。完整的推荐配置在第 12 章,现在这套最小集足够学完全书。
先建个靶场:新建一个 vim-practice.txt(或 IDE 里的 Scratch 文件),随便粘几十行代码进去。今天所有练习都在它身上做,别拿正在工作的代码当靶子。
2.1 VSCode:安装 VSCodeVim
- 扩展市场(CmdShiftx)搜索
Vim,安装 VSCodeVim(发布者 vscodevim.vim,下载量千万级那个),点「重新加载」; - 确认生效:打开任意文件,左下角状态栏出现
-- NORMAL --;按 i 它变成-- INSERT --,按 Esc 变回来 —— 成了; - 建议追加这段最小配置(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
Settings → Plugins → Marketplace搜索 IdeaVim,安装并重启 IDE;- 确认生效:打开文件按 :,屏幕左下角出现命令输入条;或右下角状态栏出现 Vim 模式指示 —— 成了;
- 创建
~/.ideavimrc(终端touch ~/.ideavimrc,没有这个文件插件也照样能用,配置只是锦上添花):
set number " 显示行号
set relativenumber " 相对行号(第 3 章讲为什么)
set hlsearch " 搜索高亮
set incsearch " 边输入边匹配,所见即所得
- 以后改了这个文件,在编辑器里执行
:so ~/.ideavimrc立即生效,不用重启; - 临时禁用:点击编辑器右下角的 Vim 图标,可以一键关掉插件(救急用)。
:w 回车后,标签页上的修改标记(小圆点/星号)消失了。三条都过,装备完毕。
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 | 把刚撤销的再做回来 |
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. 如果本章只记住三件事
- Esc 回家:迷路、按错、恐慌,一律先按 Esc;
- 出差办完就回:插入模式只用来打字,打完立刻退,别在里面安家;
- 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 没按实 —— 明天继续热身。
常见陷阱
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。