跳到主要内容

01 Vim 的核心思想:把编辑当作一门文本操作语言

Vim 起步 中,你已经使用过 Normal Mode,也试过 w$ix。现在把这些 按键放进一张更大的地图:Vim 不是让你记住大量彼此无关的快捷键,而是让你在 Normal Mode 中描述 一次文本编辑。

Action  → 我要做什么?
Target → 我要操作什么?
Control → 要作用多远,或怎样重复?

d$ 为例:

d + $
│ │
│ └─ 到本行结尾
└──── delete

它的意思是“删除到本行结尾”。这里的 d 是 Operator,$ 是 Motion;在 Operator 之后,Motion 不只是 移动光标,也定义了要处理的范围。

Before — Normal Mode

const status = "draft";
^

Keys

d$

After — Normal Mode

const␠
^

表示留下来的空白,不是要输入的字符。Vim 执行完删除后仍处于 Normal Mode。

一条实用语法

后续章节会反复使用:

[count] operator [count] target

target = motion | text object

方括号表示可选。现在只需要先认识三个位置:

operator → d、c、y 等:做什么
motion → w、$、0 等:到哪里
count → 2、3 等:多少次或多远

Text Object 会在后面出现。它不是“到一个位置”,而是直接指定一个结构化对象,例如一个单词、引号中的 内容或括号中的内容。

不同 Mode 中,同一个键可能有不同职责

Vim 的组合能力依赖上下文。例如:

Normal Mode:
i → 在光标前进入 Insert Mode
a → 在光标后进入 Insert Mode

Operator-pending / Visual:
iw → inner word
aw → a word

因此,不能孤立地把 i 永远翻译成“插入”或“内部”。先判断当前处于哪个 Mode,再理解按键的角色。

先读出来,再按下去

遇到一个陌生组合时,可以先问:

  1. 第一个键是在执行什么 Action?
  2. 后续键是在描述 Motion,还是 Text Object?
  3. 有没有 Count 或 Repeat 改变范围?

这种读法不会让 Vim 没有例外,但能让绝大多数新命令有可推理的入口。下一章从 Target 的第一部分 开始:Motion 与 Count

练习

const status = getStatus();

假设光标位于 status 的首字母,请分别写下 Action、Target 和 Control,用来表达以下意图:

  1. 删除从光标到行尾的内容。
  2. 只移动到行尾,不修改文本。
  3. 思考第二项为什么没有 Action。

先描述组成,再尝试按键;本章不要求扩展新的 Operator 或 Motion。

本章必须记住

Normal Mode 用于描述和执行编辑动作。
一次编辑可以理解为 Action + Target + Control。
Operator 后的 Motion 会定义操作范围。

暂时不用记

不必现在记住所有 Operator、Text Object 或 Count 的组合。先学会到达目标,再让编辑动作作用在目标上。

评论