跳到主要内容

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 lineYank 到行尾。
Before — Normal Mode

return user.profile.name;
^

Keys

d$

After — Normal Mode

return␠
^

只是为了让示例中保留下来的空白可见,不是要输入的字符。

重复 Operator:按行操作

重复同一个 Operator 表示行级 Target:

dd → 删除当前行
cc → 修改当前行
yy → Yank 当前行

这不是三条必须孤立记忆的命令;它们仍然服从“Operator + Target”,只是第二个相同 Operator 表示整行。

Count 可以在两侧出现

2dwd2w 都会删除两个 word。若 Operator 和 Motion 前都带 Count,两个数字相乘:

2d3w → 删除六个 word

刚开始练习时优先使用一个 Count,例如 2dw。先让意图清楚,再使用两侧 Count。

高频但不完全对称的 cw

dwcwyw 很常见,但不要把它们理解成范围永远完全相同。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;
}
  1. 删除 return 后到行尾的内容。
  2. formatUser 改成另一个函数名。
  3. Yank 整个 return 行。
  4. 尝试用一个 Count 删除连续两个 word,再用 u 观察范围。

本章必须记住

Operator 决定做什么。
Motion 决定 Operator 的范围。
重复 Operator 表示按行操作。
cw 是需要认识的特殊情况。

暂时不用记

不必扩展更多 Operator。先用 dcy 和已学 Motion 建立组合直觉。

评论