02 Motion 与 Count:先描述去哪里
你不需要禁止使用方向键,也不必假装 hjkl 永远没有价值。Vim 的优势在于:目标较远或结构清楚时,
可以用一个 Motion 直接描述“去哪里”。
从近到远移动
| 范围 | Motion | 结果 |
|---|---|---|
| 字符 / 行 | h j k l | 左、下、上、右移动。 |
| 单词 | w b e | 下一个单词开头、上一个单词开头、当前或下一个单词结尾。 |
| 大块单词 | W B E | 用空白划分 WORD,而不是按标点切开。 |
| 行 | 0 ^ $ | 行首、首个非空白字符、行尾。 |
| 文件 | gg G | 文件开头、文件结尾。 |
word 会把标点视为边界;WORD 主要由空白划分。例如在 user.profile.name 上,w 和 W 的落点
不同。先用小段代码观察一次,不必死记所有边界规则。
Count:把同一种 Motion 走得更远
在 Motion 前加入数字:
3w → 向后移动三个 word
2b → 向前移动两个 word
5j → 向下移动五行
Before — Normal Mode
const primaryUser = users[0];
^
Keys
2w
After — Normal Mode
const primaryUser = users[0];
^
实际落点取决于单词边界;这个例子的重点是 Count 修饰 Motion,而不是让你逐个按 w。
Motion 以后会成为 Target
此刻 w 只移动光标。下一章输入 d 后再输入 w 时,w 会描述删除范围:
d + w → delete 到下一个 word 的开头
Motion 的光标落点和 Operator 实际处理的边界有时并不完全直观。遇到不确定的范围时,以 Before / After 验证为准,而不是仅凭“移动了几步”猜测。
练习
const displayName = user.profile.name;
- 从
const的开头移动到user。 - 从
user移动到name。 - 从行中任意位置移动到首个非空白字符和行尾。
- 试一次
w与W,观察它们如何对待.。
本章必须记住
Motion 描述去哪里。
Count 可以放在 Motion 前扩展范围。
先选择合适的目标粒度,再考虑操作它。
暂时不用记
暂时不用记段落、屏幕、句子等 Motion。w、b、e、0、^、$、gg 和 G 已足够进入下一章。
评论