跳到主要内容

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 上,wW 的落点 不同。先用小段代码观察一次,不必死记所有边界规则。

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;
  1. const 的开头移动到 user
  2. user 移动到 name
  3. 从行中任意位置移动到首个非空白字符和行尾。
  4. 试一次 wW,观察它们如何对待 .

本章必须记住

Motion 描述去哪里。
Count 可以放在 Motion 前扩展范围。
先选择合适的目标粒度,再考虑操作它。

暂时不用记

暂时不用记段落、屏幕、句子等 Motion。wbe0^$ggG 已足够进入下一章。

评论