Vim 文本对象与运算符深挖:从 i/a 到文本块与正则
更新时间:2026-08-30。本文是
languages/vim/主题高手层第 1 篇(A2:PlantUML + 机制 + ≥2 实测 + ≥2 交叉引用)。
本文要回答的问题
- 文本对象到底有哪几类?
i/a之外还有别的修饰吗? - 运算符(operator)和文本对象怎么自由组合?
- Vim 正则的"魔法等级"是什么?为什么
(和\(行为不同?
一、机制:operator + [i/a] + object
Vim 的编辑命令是运算符 + 文本对象两段式。运算符决定"做什么",文本对象决定"对哪块做":
| 运算符 | 作用 |
|---|---|
d | 删除 |
c | 删除并进入插入(改) |
y | 复制 |
v | 选中(进入可视) |
= | 格式化(如 =ip 重排段落) |
> < | 缩进 / 反缩进 |
gU gu | 转大写 / 小写 |
文本对象分两类:
| 类型 | 对象 | 例子 |
|---|---|---|
| 配对型 | () {} [] <> "" '' `` | ci{ 改花括号内容 |
| 范围型 | w 词 s 句 p 段 | dap 删整段 |
i = inner(不含边界与外侧空白),a = around(含边界及两侧空白)。
二、实战:复杂结构精准改
c
if (foo(x) && bar(y)) {
do_work();
}光标在 foo 上,想改整个条件但保留 {} 块:
vim
ci( " 改圆括号内 → 进入插入改 "foo(x) && bar(y)"想连 if 整行判断一起替换成别的:
vim
ca( " 含括号一起改(含两侧空格)想改花括号里的函数体:
vim
ci{ " 只改 { } 内三、Vim 正则的"魔法等级"陷阱
这是高手最易踩的坑。Vim 正则默认是"非常数魔法(very nomagic)"——( . 都是字面量,要特殊含义得加 \。对比:
| 写法 | 含义 |
|---|---|
( | 字面左括号 |
\( | 分组(捕获) |
.( | 任意字符 + 字面左括号 |
\v 模式 | " very magic":之后像 PCRE,( . * 都特殊 |
vim
:s/\vfoo\((.*)\)/bar(\1)/ " \v 后写法接近 PCRE,少写转义建议:涉及复杂正则时一律前缀 \v(very magic),心智负担最低。详见 搜索替换 的替换示例。
四、与金字塔衔接
一句话总结
编辑命令 = 运算符(d/c/y/=) + 文本对象(配对型 i( a" / 范围型 iw ip);i 不含边界、a 含边界;写正则加 \v 切到 very magic,避开 Vim 默认转义地狱。
上一篇:Vim 宏录制与回放 下一篇:Vim 补全系统