Vim的可视模式提供了一种灵活且直观的方式来选择文本块,然后应用操作符进行处理。它也是选择矩形文本列块的唯一方法。
其“先选择,后操作”的逻辑与现代图形编辑器(使用鼠标)非常相似,区别在于Vim通过键盘快捷键实现了这一切,在熟练后效率更高。
1. 可视模式基础
理解可视模式的基本概念是高效使用它的第一步。
要删除一些简单的文本,使用操作符‑动作命令(如 dw)通常就足够了。但在更复杂的场景中,可能很难找到合适的动作命令来精确移动到目标位置。这时,可视模式就派上了用场。
你可以使用 v(小写)命令启动可视模式。然后移动光标来选择文本区域,被选中的文本会高亮显示。最后,键入一个操作符命令(如 d 删除)来对高亮区域执行操作。
例如,要从一个单词的中间删除到下一个单词的中间,可以这样做:
This is an examination sample of visual mode
└─────移动光标─────┘
This is an example of visual mode
操作步骤:
- 将光标置于“examination”的某个字母上。
- 按
v 进入字符可视模式。
- 使用
l(右移)、w(跳到下一个单词词首)等命令移动光标至“sample”的某个字母。
- 看到目标文本高亮后,按
d 删除。

在这个过程中,你无需精确计算需要按多少次 l,因为可以直观地看到高亮的文本。如果中途想取消选择,只需按 <Esc> 键即可退出可视模式。
按行选择
若需要对整行进行操作,可以使用 V(大写)命令启动行可视模式。进入该模式后,当前整行会立即被高亮,左右移动光标无效,上下移动则可选择多行。
例如,使用 Vjj 可以选中三行(当前行及下面两行):

上图展示了光标在第6行时,按下 Vjj 后选中了三行文本。
列块选择
这是处理矩形文本区域的利器,使用 Ctrl-v 启动。在处理表格数据或代码注释时尤其有用。
假设有如下表格:
name Q1 Q2 Q3
pierre 123 455 234
john 0 90 39
steve 392 63 334
要删除中间“Q2”这一整列:
- 将光标移动到第一个“Q2”的“Q”上。
- 按
Ctrl-v 进入列块可视模式。
- 按
3j 向下移动三行,再按 w 移动到“Q3”的“Q”上(此时最后一列的首字符也被选中)。
- 按
h 向左移动一格,排除“Q3”列。
- 按
d 删除选中列。

现在,让我们为这段文本的每一行行首添加注释符号 #:
- 将光标移动到“name”的“n”上。
- 按
Ctrl-v 进入列块模式,再按 j 或 2j 向下选中所有行,形成一列。
- 按
I 进入插入模式(状态栏显示 -- INSERT --)。
- 输入
#。
- 连续按两次
<Esc> 键,所有选中行的行首将同时出现 #。


这个功能在批量注释代码或格式化文本时非常高效。如果操作失误,可以按 <Esc> 退出,并在普通模式下按 u 撤销。
切换选择端点
在可视模式下选中文本后,如果想调整选择范围的另一端,可以按 o 键(代表 other end)。光标会跳转到选中区域的另一端,此时移动光标即可改变起始点或结束点。再次按 o 可切回。
在列块可视模式下,有四个角,按 o 会移动到对角,而按 O(大写)则移动到同一行的另一个角。
2. 可视模式进阶
可视模式的使用遵循一个清晰的流程:
- 标记开始:使用
v, V 或 Ctrl-v 在起始点启动可视模式。
- 标记结束:移动光标到目标结束位置。起始点与光标之间的文本将被高亮。
- 执行操作:键入一个操作符命令,该命令将作用于高亮区域。
核心命令
| 命令 |
作用 |
[count]v |
进入字符可视模式。 |
V |
进入行可视模式。 |
[count]Ctrl-v |
进入列块可视模式。 |
可用的操作符
可视模式下,可以对选中的区域应用丰富的操作符:
~ 切换大小写
d 删除
c 修改 (替换并进入插入模式)
y 复制 (抽出)
> 向右缩进
< 向左缩进
! 通过外部命令过滤
= 自动格式化代码
gq 按文本宽度重排段落
(注:标有数字的操作符行为有特定规则,详见Vim帮助文档)
文本对象选择
在可视模式下结合文本对象,可以更精准地选择语义单元:
aw / iw 一个单词(含/不含周围空格)
aW / iW 一个字串(含/不含周围空格)
ap / ip 一个段落(含/不含周围空格)
ab / ib 一个 () 块(含/不含小括号)
aB / iB 一个 {} 块(含/不含大括号)
a" / i" 一个双引号字符串(含/不含引号)
其他技巧
- 使用寄存器:在操作符前指定寄存器,例如
"ay 将复制内容到寄存器 a。
- 指定计数:在操作符前加数字,例如选中后按
3> 会将选中区域向右缩进3次。
- 执行Ex命令:在行可视模式下选中多行后,按
: 可以对这些行统一执行替换等命令。
3. 列块操作精讲
列块模式(Ctrl-v)提供了独特的矩形文本处理能力,掌握它们是提升Shell或配置脚本编辑效率的关键,让你告别繁琐的手动逐行调整。
列块插入 (I)
在列块选择状态下,输入 I{string}<Esc> 会在选择区域的左侧(每一行的相同起始列)插入相同的字符串 {string}。只有长度足以触及选择区域的行才会被插入。
列块添加 (A)
在列块选择状态下,输入 A{string}<Esc> 会在选择区域的右侧(每一行的相同结束列)追加相同的字符串 {string}。对于短于选择区域结束列的行,会用空格填充至该列再追加。
列块替换 (r)
选中一个列块区域后,按 r 再按一个字符(如 X),会将区域内每一个字符都替换为该字符(X),保持矩形结构不变。
实践挑战
尝试将下面表格中“name”列的所有字母改为大写:
name Q1 Q2 Q3 Q4
pierre 123 455 234 Q4
john 0 90 39 Q4
steve 392 63 334 Q4
提示:利用列块选择选中“name”列的所有字母,然后使用 U(大写)命令。
通过系统性地练习这些可视模式操作,你将深刻体会到Vim在文本处理上的强大与高效,其设计哲学正是在于通过简洁的规则组合,应对复杂的编辑任务。
参考资料