强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 LineV...:sort
格式化代码块Visualv...=
批量大小写Visualv...Uv...u
覆盖粘贴Visualv...p

6.8 总结

模式进入键特点适用场景
Visualv字符级不规则选择
Visual LineV行级整行操作
Visual Block<C-v>块级列编辑

下一步第 07 章 - 窗口与标签页 → 学习 Vim 的窗口分割、标签页和缓冲区管理。


扩展阅读