03 Operator 与 Motion:描述做什么和做到哪里
Operator 表示“做什么”,Motion 表示“做到哪里”。先从三个最常用的 Operator 开始:
d → delete
c → change
y → yank
保持 Target 不变,替换 Action
$ 表示到本行结尾。把同一个 Target 接到不同 Operator 后:
| 命令 | 可以这样读 | 结果 |
|---|---|---|
d$ | delete to end of line | 删除到行尾。 |
c$ | change to end of line | 删除到行尾并进入 Insert Mode。 |
y$ | yank to end of line | Yank 到行尾。 |
Before — Normal Mode
return user.profile.name;
^
Keys
d$
After — Normal Mode
return␠
^
␠ 只是为了让示例中保留下来的空白可见,不是要输入的字符。
重复 Operator:按行操作
重复同一个 Operator 表示行级 Target:
dd → 删除当前行
cc → 修改当前行
yy → Yank 当前行
这不是三条必须孤立记忆的命令;它们仍然服从“Operator + Target”,只是第二个相同 Operator 表示整行。
Count 可以在两侧出现
2dw 和 d2w 都会删除两个 word。若 Operator 和 Motion 前都带 Count,两个数字相乘:
2d3w → 删除六个 word
刚开始练习时优先使用一个 Count,例如 2dw。先让意图清楚,再使用两侧 Count。
高频但不完全对称的 cw
dw、cw、yw 很常见,但不要把它们理解成范围永远完全相同。Vim 对 cw 有特殊处理:当光标位于
单词中时,cw 通常只改到词尾,不包含 w 常见移动结果里的尾随空白。
Before — Normal Mode
const userName = account.owner;
^
Keys
cwname<Esc>
After — Normal Mode
const name = account.owner;
^
空格仍保留,因此 name 与 = 之间不会粘在一起。遇到需要严格相同 Target 的教学或操作,优先使用
d$ / c$ / y$,或下一章的 diw / ciw / yiw。
练习
function formatUser(user: User) {
return user.profile.name;
}
- 删除
return后到行尾的内容。 - 把
formatUser改成另一个函数名。 - Yank 整个
return行。 - 尝试用一个 Count 删除连续两个 word,再用
u观察范围。
本章必须记住
Operator 决定做什么。
Motion 决定 Operator 的范围。
重复 Operator 表示按行操作。
cw 是需要认识的特殊情况。
暂时不用记
不必扩展更多 Operator。先用 d、c、y 和已学 Motion 建立组合直觉。
评论