可视化模式与块编辑:眼见为实的选择
学习目标
- 掌握三种种选择:v 字符、V 整行、Ctrl+v 块 —— 各自的适用形状一目了然
- 理解可视模式的本质:移动命令从「跳」变成「伸长选区」,圈好地之后动词随时进场
- 练成块编辑杀手锏:块插入 I / 块追加 A(批量注释、行尾补分号)与块删除 d(整列切掉)
- 学会选区微调:o 换端修剪、gv 一键召回上次选区
- 建立「文本对象优先,可视模式兜底,块编辑独占列操作」的选型直觉,并知道什么时候该改用 IDE 多光标
1. 有了文本对象,为什么还需要「选」?
第 4 章的文本对象让你「指物」:ciw 改这个词,da( 删这对括号 —— 不用选、不用看,一句话说完。那可视化模式(Visual mode)还有什么用?它不可替代的场景有三类:
第一类是眼见为实。文本对象是「盲指」—— 范围对不对,按完才知道;可视模式是「先圈后动」—— 选区亮起来,你亲眼确认这块就是要动的范围,再下动词。改重要代码、删一大段不确定边界的内容时,这半秒钟的确认价值千金。第二类是不规则范围。「从这行的这个字符到下面第三行那个字符」—— 这种不对应任何文本对象的歪 ranges,用 v 圈最直接。第三类,也是本章主角:矩形。注释一列、删一列、给若干行行尾统一加点东西 —— 字符和行的模型都表达不了「列」,只有 Ctrl+v 的块可以。
先把三种选法一张表认全,后面逐个展开:
| 按键 | 模式名 | 选什么 | 什么时候用 |
|---|---|---|---|
| v | VISUAL(字符) | 从光标到移动命令落点之间的字符 | 不规则范围、跨行的一段、要亲眼确认边界 |
| V | VISUAL LINE(行) | 整行整行的块 | 按行为单位施工:挪缩进、合并、整删、整复制 |
| Ctrl+v | VISUAL BLOCK(块) | 一个矩形(行 × 列) | 一切「列」形状的操作:批量注释、行尾追加、删列 |
一个先行的总原则:能一句话说完的用文本对象,要亲眼看的用 v,按行算账的用 V,只有「列」的形状才请出 Ctrl-v。块编辑很帅,但它是三板斧里的最后一张牌 —— 多数人日常 v 和 V 占九成,Ctrl-v 在特定场景一击必杀。
2. v 字符可视化:圈地与施工
v 进入字符可视化后,游戏规则只变了一条:所有移动命令不再是「跳过去」,而是「把选区伸长/缩短到那里」。w 选到下个词头,e 选到词尾,$ 选到行尾,f; 选到分号,3j 选到下面第三行 —— 第 2、3 章练的所有移动,在这里全部复用,只是语义从「到达」变成「圈地」。圈好之后,任意动词进场施工:
演示里两个值得回味的细节:①选中后的大小写三兄弟 U/u/~(大写/小写/逐字翻转)是可视模式的招牌动词 —— 它们平时也用得了,但选中一大片再翻转的手感,是文本对象给不了的「看着改」;②v 和移动命令的搭配就是你的选区词汇量,ve、viw(对,可视模式里也能用文本对象!)、v$、vf, —— 圈地的精细度,完全由第 2 章的功力决定。
退出选区有两条路:Esc 放弃选择退回普通模式;或者再按一次 v(以及 V/Ctrl+v)切换到别的种选择。三种模式互切是免 Esc 的:v 圈着圈着发现该按行算 → 直接 V。
有一句实话也要说在前面:可视模式比「动词+名词」多按一次键(先 v 圈地、再敲动词,而 daw 一句话就完事),所以它不该成为默认编辑方式 —— 高手用可视模式的频率,远低于新手想象。它的定位是特定形状的专用工具:要亲眼确认的、不规则的、跨多行混杂的、以及一切矩形。把这个边界守好,本章的技能才是加分项而不是负担。
3. V 行可视化:整行为单位
V 进入行可视化:选区永远是完整的行,上下移动(j k } G…)就是整行整行地扩。它解决一类高频场景:按行算账。最典型的是挪代码块:
把几行语句挪进 if/for 块里(右移 >)、还原缩进(<)、几行合成一行(J)、整块删(d)、整块复制(y)—— 这些动词在行选区上全按「行」执行。注意 > 施完工自动退出选区,紧接着普通模式的 . 能对同一批行再缩一级 —— V → 扩行 → > → . 是挪代码块的标准四拍。
顺带一个对照:第 5 章讲过 3>> 也能缩三行 —— 数字与可视模式是两种「数行数」的办法,行数少眼可数时用数字,行数多或想看着选时用 V。行选还有个隐藏福利:Vjjy 复制的必然是整行,粘贴时自动按行落位(第 9 章讲寄存器时会回收这个伏笔)。
4. Ctrl-v 块可视化:矩形是一等公民
终于到主角。Ctrl+v 进入块可视化:你操作的不再是「一段文字」而是一个矩形 —— 从光标(左上角)到移动命令落点(右下角)围出的框,框住的字符构成选区。向下扩行用 j,向右扩列用 l/w —— 任何移动命令都可以,列边界跟着落点的列走。
块选区最独特的键是 $:普通 v 里 $ 把选区拉到「当前行」行尾;块模式里 $ 把右边界拉到每一行各自的行尾 —— 行长行短不齐时,这个语义正好是「每行都选到尾」,批量行尾操作的钥匙。看杀手锏一号:
行尾批量加分号,传统做法是「End → ; → 下移 → End → ;」的循环,或者 IDE 里挨个点;块编辑一套 Ctrl+v 2j $ A ; Esc 完事。哪些行要补、哪些不补?眼睛扫着列,手指只圈要补的那几行 —— 这就是「列」这个形状的表达力。
两个实战小贴士:①块插入打错了怎么办 —— 直接 Esc,然后一个 u 把三行的错误一起撤销(块操作是一个撤销单元),重新来过比在里面修更干净;②哪些行入选你说了算 —— 圈块不必从第一行圈到最后一行,中间跳过的行就不受影响,补分号时遇到一行本来就有分号,j 跳过它再继续圈即可。块的「选择权」完全在你手里,这是它比正则替换(:s)更细腻的地方:替换按「内容」圈,块按「位置」圈,两种圈法互补。
5. 块插入 I 与块追加 A:一次打字,处处生效
块模式里有两条专用通道,把「打字」也批量化了:I 块插入(在每行块的左边缘之前插入)和 A 块追加(在每行块的右边缘之后追加)。它们的行为有一个必须提前打预防针的特点:
看到了吗 —— 打字过程中只有光标那一行显示输入,其他行纹丝不动,直到 Esc 才同时生效。第一次用的人 90% 在这里慌了:以为没生效,于是按 Esc 之外的各种键试图「刷新」,结果把块搞坏。记住:块插入/追加是延迟满足,Esc 就是发货按钮。批量加 // 注释是它最著名的应用 —— 注释多行、给多行加统一前缀(如 Markdown 的 > 、SQL 的 -- 、YAML 的键名),全是这一套。
把 I/A/$ 三个部件组装起来,两条生产线:批量注释 = Ctrl+v 圈行 → I → // → Esc;行尾追加 = Ctrl+v 圈行 → $ → A → 内容 → Esc。取消注释则是块删除的活:光标挪到注释列首(f/ 两键到达),Ctrl+v 圈住注释列,d 整块切掉 —— 下一节。
6. 块删除与块替换:d、c、x 在矩形上
动词在块选区上按「矩形」执行:d 删掉整块、x 同义、c 删掉整块后进入「块插入」(每行分别输入,Esc 统一生效)、r-单字符把整块替换成同一个字符。最常用的是 d —— 删一列:
「删列」的适用面比看上去广:对齐的表格砍掉一列、日志行去掉时间戳前缀、把行号列剥掉、上面演示的批量取消注释 —— 本质都是「每行的同一位置起、同样性质的一段,一次切掉」。配 $ 就是「从这列起到行尾」,配具体列宽就是「正好这一列」。c 块替换则适合「每行的这一段都要换,但内容相同」的场景(比如把三行的 todo 标记统一改成 done)。
三个键在块上的行为差异,用一张小场景表固定下来:
| 场景 | 按键 | 效果 |
|---|---|---|
三行的状态列 todo 全删 | 块选 d | 矩形消失,左右两边合拢 |
三行的 todo 统一改成 done | 块选 c 输入 done Esc | 每行分别输入、Esc 统一生效(宽度不必相同) |
| 把一列内容「涂掉」变成分隔线 | 块选 r- | 整块每格都变成 -,画表格分隔线神器 |
| 删掉每行行尾多余的一个字符 | 块选右起一列 x | 等价于块 d,手指更顺手 |
注意 c 与 I/A 的分工:I/A 是「在块的边缘之外加东西」,c 是「把块的内部换掉」—— 一个做加法一个做替换,组合起来,矩形世界里「增、删、改」三件事就齐了。
7. 选区微调:o 换端、gv 召回
圈地圈得不准怎么办?两个专用的微调键,都是可视模式里的「后悔药」:
| 键 | 名字 | 干什么 | 典型时机 |
|---|---|---|---|
| o | 换端 | 光标跳到选区另一端,此后移动命令调整的是那一头 | 起点选多了/选少了 —— 换到起点那头去修剪 |
| O | 换端(块专用) | 块模式里在同一行的两个角之间横跳 | 块选里调水平边界(行模式下 O 与 o 等价) |
| gv | 重选 | 一键恢复上一次的选区(连模式一起) | 同一块地上连续施工:y 看一眼 → gv → d 动手 |
o 的心智模型:选区像一根橡皮筋,两头各有一个端点,光标停在哪个端点上,移动命令就拽哪一头 —— o 就是把光标甩到对面去。gv 则解决了可视模式的一个痛点:每次施工完选区就没了,想再来一个动词得重圈 —— gv 让「圈一次、动多次」成为可能(下一次演示里它还会连击三连)。
8. 选中后的动词菜单
选区是名词,动词随叫随到。可视模式里所有在第 5 章学过的动词都可用,外加几个选区专属的。同一块选区,换个动词就是另一种施工:
| 动词 | 作用 | 备注 |
|---|---|---|
| d / x | 删除选区 | 字符选区进字符寄存器,行选区进行寄存器(第 9 章伏笔) |
| c / s | 删选区并进入插入 | 块选区上是「每行分别输入,Esc 统一生效」 |
| y | 复制选区 | 复制完选区解除 —— 想「复制后再删」用 gv |
| U / u / ~ | 选区转大写 / 转小写 / 逐字翻转 | 可视模式招牌动词,常量名改错大小写一秒救回 |
| > / < | 选区整体右移 / 左移一级缩进 | 行选区上最常用;. 可重复 |
| J / gJ | 选区所有行接成一行 / 无空格连接 | 参数列表横竖互转 |
| r{字符} | 整块替换成同一字符 | 块选区上「整列涂掉」;块专属利器 |
| : | 对选区执行命令行命令 | 自动填好 :'<,'> 范围 —— 第 8 章区域替换的入口 |
演示里的另一个主角是 gv 的连击节奏:d → u → gv → c → u → gv → ~ —— 圈一次地,连换三个动词试方案,这才是「选区是舞台」的完整含义。最后提一句语法层面的理解:可视模式相当于替你按下了动词并挂起,等你用选区充当名词 —— 所以它和「动词+名词」语言并不冲突,是同一门语言的「先给宾语」语序。
9. 选型决策:文本对象 / v / V / Ctrl-v / 多光标
至此你有五种「圈定范围」的手段,加上 IDE 原生的多光标是六种。决策法则一条主线:按形状选工具:
| 意图 | 首选 | 理由 |
|---|---|---|
| 改/删一个词、一对引号、一个括号里的内容 | ciw 等文本对象 | 一句话说完,最快,不用看 |
| 动一大段不规则的文字,想先看清边界 | v + 移动圈地 | 眼见为实,边界可微调(o) |
| 挪几行的缩进、合并几行、整块复制/删除 | V | 按行算账,整行为单位 |
| 批量注释/行尾追加/删一列 —— 「列」形状 | Ctrl+v | 矩形的表达力,多光标替不了它(列位置固定时) |
| 多处散落的相同词各改一下 | 多光标(gb / Cmd+d)或 *+.(第 8/10 章) | 位置不构成规则形状,按「内容」圈更省 |
块编辑与多光标的分界线值得单独说:块的选择单位是几何列(每行同一位置),多光标的选择单位是内容匹配(下一个相同词)。行尾统一加分号,块秒杀;把散落各处的 foo 都改成 bar 且每处还要微调,多光标或 *+. 更顺手。IDE 备注里有两边的具体键位。
再给一个「什么时候不该用可视模式」的提醒:改动只有两三处、且每处改法相同时,第 8、10 章的 * + n + . 组合(找下一处、重复上改)比圈选更快;改动一句话能说清(ci")时,文本对象更快。可视模式吃的是「形状复杂」和「要看清」这两碗饭 —— 端好自己的碗,才不会觉得每个键都要背。
10. 每日训练计划(30 分钟 × 3 天)
| 天 | 时间盒 | 内容 | 通过标准 |
|---|---|---|---|
| 第 1 天 | 0–10 分钟 | 重放演示 1–2,读 §1–§3;靶场练 v+移动圈地(ve viw v$ vf,)与 V+>/< | 圈地不用想「我在哪个模式」 |
| 10–30 分钟 | 练习 1 + 练习 2 | 三模式互切零延迟;挪块四拍(V 扩 > .)成型 | |
| 第 2 天 | 0–10 分钟 | 重放演示 3–5,读 §4–§6;块注释 → 块追加分号 → 块删列各 5 遍 | Esc 前不慌,知道「延迟满足」 |
| 10–30 分钟 | 练习 2 后半 + 练习 3 | o 换端修剪 10 次全对 | |
| 第 3 天 | 0–10 分钟 | 重放演示 6–7,读 §7–§9;抄一遍 §9 决策表 | 给出意图能报出首选工具 |
| 10–30 分钟 | 练习 4:盲测毕业考 | 10 题对 7 题,本章毕业 |
11. 如果本章只记住三件事
- 按形状选工具:一句话能说完的用文本对象,不规则范围用 v,按行算账用 V,「列」的形状才请出 Ctrl+v;
- 块插入是延迟满足:I/A 打字时只有一行显示,Esc 才同时生效 —— 慌就输了;批量注释、行尾追加是它的两大主场;
- 选区可召回、可换端:gv 一键重选上次范围(圈一次动多次),o 跳到选区另一头修剪起点 —— 圈错了不必推倒重来。
选择的问题解决了,下一章解决「找」:查找与替换 —— /、* 与 :s 全家桶,批量重构的正主。可视模式给它们留了个接口:选中后按 : 的区域替换。
练习
练习 1:三模式点名(10 分钟)
靶场任选一段 ≥10 行的代码。从普通模式出发,完成 20 组切换:v → V → Ctrl+v → v(退出)…… 每种模式里都动一动 jkw$,观察选区形状差异。然后练互切免 Esc 路径:v 圈着圈着改 V,V 圈着圈着改 C-v。通过线:状态栏文字(VISUAL / VISUAL LINE / VISUAL BLOCK)与手指动作同步,不用低头看。
练习 2:注释马拉松 + 行尾补分号(10 分钟)
造 10 行没分号的代码(或拿一段日志语句):①Ctrl+v 圈 10 行 → $ → A → ; → Esc 补完;②再 Ctrl+v 圈住分号列 → d 全删掉;③Ctrl+v 圈行 → I → // → Esc 注释全部;④块删取消注释。四连各做 3 遍。通过线:全程不慌「为什么只有一行变了」,Esc 节奏稳定。
练习 3:o 换端修剪(10 分钟)
用 v 从行中间起手选到行尾(故意起点不对),然后 o 换到起点端,用 w/b/e/f 把起点修剪到目标位置,最后 d/c 施工。10 组。进阶:块模式下试 O,体会「同行两角横跳」和 o「对角跳」的区别(块模式里 o 跳到对角行,O 只换列)。通过线:修剪过程中能随时说出光标在选区哪一头。
练习 4:盲测毕业考(10 分钟)
10 个任务先说按键再看答案:①批量给 8 行加 // 注释 ②8 行行尾批量补分号(行长不齐)③删掉对齐表格的第 2 列 ④把 4 行整体右移一级缩进 ⑤把选中的常量名转大写 ⑥复制一段后立刻删掉同一段 ⑦v 圈多了起点,修剪起点 ⑧把三行的 todo 列统一替换成 done(块)⑨把 5 行参数合成一行 ⑩选区上执行替换命令的按键。答案:C-v I // Esc / C-v $ A ; Esc / C-v 圈列 d / V jjj > / v e U / y 后 gv d / o + 移动 / C-v 圈块 c done Esc(或 r 逐个)/ V jjj J / 选中后按 :('<,'> 自动出现)。10 对 7 毕业。
常见陷阱
VSCode / IDEA 差异
VSCode(VSCodeVim)
- v/V/Ctrl+v 三种选择与块插入 I/A:VSCodeVim 全部原生支持,照本章用;块插入同样 Esc 后统一生效
- 多光标 vs 块:原生 Cmd+d 选中下一个相同词、Cmd+Alt+↓ 在下方添加光标(列形状);VSCodeVim 的 gb 等价于 Cmd-d 添加下一个匹配光标
- 可视模式里 Cmd+c 会把选区送进系统剪贴板(比 y 多一条通路,第 9 章展开)
- 注意:VSCode 自己的 Cmd-f 搜索会与可视选区联动(找选中内容);块选择快捷键 Alt+Shift+拖拽 是 VSCode 原生的,与 Ctrl-v 二选一即可
IntelliJ IDEA(IdeaVim)
- IdeaVim 同样支持三种可视模式与块插入;选区会接入 IDEA 的高亮系统(状态栏显示 VISUAL / VISUAL BLOCK)
- IDEA 原生列选择模式:Cmd+Shift+8(Toggle Column Selection)—— 与 Ctrl+v 功能重叠,日常留一个就够
- IDEA 的「多光标」是 Alt+J(添加下一个匹配选中),对应 VSCode 的 Cmd-d;块插入场景两者都建议优先 Ctrl+v
- mac 键位提醒:终端里 Ctrl+v 可能与终端粘贴冲突,IDE 内嵌 vim 插件无此问题;IdeaVim 里块可视化状态栏明确写 VISUAL BLOCK,低头可查
本章速记
| 按键 | 作用 | 按键 | 作用 |
|---|---|---|---|
| v / V / Ctrl+v | 字符 / 整行 / 块选择 | o / O | 跳到选区另一端 / 块内同行换角 |
| I(块内) | 块插入:每行块首打字,Esc 生效 | A(块内) | 块追加:每行块尾打字,Esc 生效 |
| $(块内) | 右边界拉到各行行尾 | d / c / r(块内) | 整块删 / 逐行改 / 整块替成同字符 |
| gv | 召回上次选区 | U / u / ~ | 选区转大写 / 小写 / 翻转 |
| > / < / J | 选区缩进移动 / 合并行 | 选中后 : | 对选区执行命令(:'<,'> 前缀) |
一句话心法:按形状选工具(对象/v/V/块),块插入延迟满足(Esc 才发货),选区可召回可换端(gv / o)。