04 Text Object:直接描述要操作的对象
Motion 擅长回答“到哪里”。但很多编辑需求并不是一个位置,而是一个对象:当前单词、引号中的字符串、 括号里的参数。Text Object 让你直接描述这些对象。
Text Object 只能在 Operator 之后或 Visual Mode 中使用。它不是普通 Normal Mode 下独立执行的命令。
operator + text object
i 和 a 依赖上下文
在 Normal Mode,i 和 a 分别是插入位置命令。进入 Operator-pending 或 Visual 上下文后,它们才构成
Text Object 前缀:
iw → inner word
aw → a word
i" → 双引号内部
a" → 包含双引号
i( → 圆括号内部
a( → 包含圆括号
对于 aw,额外范围通常是相邻空白;对于引号和括号,a 通常包含分隔符。因此不要把每个 a 都机械地
理解为同一种“around”。
常用对象
| 对象 | inner | a |
|---|---|---|
| 单词 | iw | aw |
| 双引号 | i" | a" |
| 单引号 | i' | a' |
| 圆括号 | i( | a( |
| 方括号 | i[ | a[ |
| 花括号 | i{ | a{ |
先看一个完整组合
Before — Normal Mode
const name = "Felix";
^
Keys
ci"Ada<Esc>
After — Normal Mode
const name = "Ada";
^
c 表示 change,i" 表示当前双引号内部。引号被保留,Vim 进入 Insert Mode,输入 Ada 后按 <Esc>
回到 Normal Mode。
Before — Normal Mode
formatUser(user, options);
^
Keys
di(
After — Normal Mode
formatUser();
^
Count 与 Text Object
2ciw 之类的组合存在,但多个 word 的选择还会包含它们之间的空白。初学阶段先把一个对象操作稳定,
需要多个对象时优先多做一次明确编辑或使用 .。等你能预测范围后,再把 Count 接到 Text Object 上。
练习
const message = formatUser(user, { compact: true });
- 修改
message。 - 清空双引号中的文本,同时保留双引号。
- 删除
formatUser调用的参数,同时保留圆括号。 - Yank
{ compact: true },并比较 inner 与包含花括号的结果。
本章必须记住
Text Object 直接描述一个结构化对象。
它只能在 Operator 或 Visual 上下文中使用。
inner 与 a 的实际范围要看对象类型。
暂时不用记
暂时不用记 tag、句子、段落等 Text Object。iw、引号与三种括号足够解决大量代码编辑。
评论