Vim / Neovim 完全指南 / 06 - 可视模式
“Visual mode is Vim’s answer to ‘select and then act’.”
6.1 三种可视模式
6.1.1 字符选择(Characterwise Visual)
v " 进入字符选择模式
vap " 选择整个段落(字符级)
ve " 选择到词尾
选择范围精确到字符,适合选择不规则区域。
6.1.2 行选择(Linewise Visual)
V " 进入行选择模式
V3j " 选择当前行及下方 3 行
Vip " 选择段落(行级)
选择整行,适合批量行操作。
6.1.3 块选择(Blockwise Visual)
<C-v> " 进入块选择模式
<C-v>3j " 向下选择 3 行的块
<C-v>}$ " 选择到段落末尾的块
按列选择矩形区域,适合对齐编辑。
6.1.4 模式切换
v → <C-v> → V → v → ...
(循环切换三种模式)
gv " 重新选择上次的选区
o " 在选区的另一端移动光标
O " 在块选择中移动到行的另一端
6.2 可视模式下的操作
6.2.1 基本操作
| 按键 | 功能 |
|---|---|
d / x | 删除选中 |
c | 修改选中 |
y | 复制选中 |
> | 缩进选中 |
< | 反缩进选中 |
= | 自动缩进 |
~ | 大小写翻转 |
u | 转小写 |
U | 转大写 |
J | 合并选中的行 |
gJ | 合并不加空格 |
:sort | 排序选中的行 |
!filter | 用外部命令过滤 |
gq | 格式化文本 |
gw | 格式化(不移动光标) |
p / P | 粘贴覆盖选中 |
6.2.2 可视模式与操作符的区别
" 操作符方式:d + 动作
diw " 删除单词
" 可视模式:选择 + 操作
viwd " 选择单词,然后删除
" 效果相同,但可视模式提供即时视觉反馈
6.3 块选择(Visual Block)高级用法
6.3.1 块选择编辑
场景一:在多行末尾添加分号
// 原始
const a = 1
const b = 2
const c = 3
const d = 4
// 操作
<C-v>3j " 块选择 4 行
$ " 到行尾
A " 在末尾进入插入模式
; " 输入分号
<Esc> " 应用到所有行
场景二:在多行行首添加注释
# 原始
x = 1
y = 2
z = 3
# 操作
<C-v>2j # 块选择 3 行
I # 在行首进入插入模式
# <Esc> # 输入注释符
场景三:批量修改数字
原始:
001 item_a
002 item_b
003 item_c
004 item_d
# 任务:将 00 替换为 10
<C-v>3j
e " 到数字末尾
r1 " 替换选中为 1
l " 右移
r0 " 替换为 0
6.3.2 块选择插入 vs 追加
" I — 在块选择的左侧插入
<C-v>3jI// <Esc>
" 对选中的 3 行在左侧添加 '// '
" A — 在块选择的右侧追加
<C-v>3jA;<Esc>
" 对选中的 3 行在右侧添加 ';'
" 注意:
" I 和 A 的行为取决于选区是否跨行
" 单行块选择时 I/A 在光标前后
" 多行块选择时 I/A 在选区左/右侧
6.3.3 块选择填充
" 用块选择覆盖一个矩形区域
<C-v>5j2l " 选择 6 行 x 3 列
r0 " 将选区所有字符替换为 '0'
6.4 可视模式中的文本对象
在可视模式中,文本对象扩展选区:
viw " 选择当前单词
vaw " 选择当前单词(含空格)
vi" " 选择引号内内容
va" " 选择含引号的内容
vit " 选择标签内内容
vap " 选择段落
反复使用 i{object} 扩展选区:
vi" " 选择当前引号内
a" " 扩展到包含引号
a" " 再扩展到外层引号
6.5 可视模式中的搜索
" 选择文本后搜索下一个匹配
v " 进入可视模式
iw " 选择单词
n " 跳到下一个匹配(选区扩展)
N " 跳到上一个匹配
" 快速选中所有匹配
* " 搜索光标下的单词
gn " 选择下一个匹配
. " 重复操作(如 c 修改)
6.6 实战练习
练习一:表格对齐
cat > /tmp/visual-practice.txt << 'EOF'
name | age | city
Alice| 25| New York
Bob | 30| London
Charlie| 35| Tokyo
EOF
nvim /tmp/visual-practice.txt
" 使用块选择对齐列
<C-v> " 块选择模式
3j " 选择 4 行
f| " 跳到 |
...使用编辑操作对齐
练习二:HTML 标签批量修改
<ul>
<li>Item A</li>
<li>Item B</li>
<li>Item C</li>
</ul>
" 选择所有 <li> 标签内的文本
vit " 选择第一个标签内容
y " 复制
j / ... " 移动到下一个
练习三:CSV 数据处理
1,Alice,alice@test.com
2,Bob,bob@test.com
3,Charlie,charlie@test.com
" 用块选择在第二列周围添加引号
<C-v> " 块选择
2j " 3 行
f, " 到第一个逗号
l " 右移
w " 到名字首
" 选择名字列...
I'<Esc> " 左侧加引号
e " 到名字尾
A'<Esc> " 右侧加引号
6.7 业务场景
| 场景 | 推荐模式 | 操作 |
|---|---|---|
| 批量添加注释 | Visual Block | <C-v>...I// <Esc> |
| 批量添加分号 | Visual Block | <C-v>...$A;<Esc> |
| 列对齐 | Visual Block | 选择列 + 编辑 |
| 排序选中行 | Visual Line | V...:sort |
| 格式化代码块 | Visual | v...= |
| 批量大小写 | Visual | v...U 或 v...u |
| 覆盖粘贴 | Visual | v...p |
6.8 总结
| 模式 | 进入键 | 特点 | 适用场景 |
|---|---|---|---|
| Visual | v | 字符级 | 不规则选择 |
| Visual Line | V | 行级 | 整行操作 |
| Visual Block | <C-v> | 块级 | 列编辑 |
下一步:第 07 章 - 窗口与标签页 → 学习 Vim 的窗口分割、标签页和缓冲区管理。
扩展阅读
:h visual-mode— 可视模式完整参考:h blockwise-operators— 块选择操作:h visual-block— 块选择命令- Vim Tips Wiki: Visual Block Mode