跳到主要内容

04 Text Object:直接描述要操作的对象

Motion 擅长回答“到哪里”。但很多编辑需求并不是一个位置,而是一个对象:当前单词、引号中的字符串、 括号里的参数。Text Object 让你直接描述这些对象。

Text Object 只能在 Operator 之后或 Visual Mode 中使用。它不是普通 Normal Mode 下独立执行的命令。

operator + text object

ia 依赖上下文

在 Normal Mode,ia 分别是插入位置命令。进入 Operator-pending 或 Visual 上下文后,它们才构成 Text Object 前缀:

iw → inner word
aw → a word
i" → 双引号内部
a" → 包含双引号
i( → 圆括号内部
a( → 包含圆括号

对于 aw,额外范围通常是相邻空白;对于引号和括号,a 通常包含分隔符。因此不要把每个 a 都机械地 理解为同一种“around”。

常用对象

对象innera
单词iwaw
双引号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 });
  1. 修改 message
  2. 清空双引号中的文本,同时保留双引号。
  3. 删除 formatUser 调用的参数,同时保留圆括号。
  4. Yank { compact: true },并比较 inner 与包含花括号的结果。

本章必须记住

Text Object 直接描述一个结构化对象。
它只能在 Operator 或 Visual 上下文中使用。
inner 与 a 的实际范围要看对象类型。

暂时不用记

暂时不用记 tag、句子、段落等 Text Object。iw、引号与三种括号足够解决大量代码编辑。

评论