06 Yank、Delete、Register 与 Put:文本去了哪里
Vim 把 Yank 或 Delete 得到的文本放进 Register,再由 Put 取出。把它想成一条数据流:
yank ────┐
├─→ register ─→ put
delete ──┘
最小 vocabulary
| 命令 | 作用 |
|---|---|
x | 删除光标下的字符。 |
yy | Yank 当前行。 |
dd | 删除当前行。 |
p / P | 从默认 Register Put 到光标后 / 前。 |
p 和 P 的具体落点还取决于 Register 中保存的是字符级还是行级文本。字符级文本会在当前行附近放入;
行级文本会放到当前行下方或上方。不要把它们简单等同于所有应用里的 Paste。
unnamed Register
不指定 Register 时,Vim 会使用 unnamed Register。最近一次 y、d、c 或 x 通常会更新它。
yy → unnamed Register 指向刚 Yank 的行
dd → unnamed Register 随后指向刚删除的行
p → Put unnamed Register 的当前内容
这解释了一个常见现象:你刚 Yank 了一段文本,又删除了别处的内容,之后按 p 得到的可能是刚删除的
文本,而不是之前 Yank 的文本。
"0 保存最近 Yank
编号 Register "0 保存最近一次未指定其他 Register 的 Yank。需要找回刚复制内容时:
"0p
Before — Normal Mode
const source = getSource();
^
const target = getTarget();
Keys
yiw
j0w
diw
"0P
After — Normal Mode
const source = getSource();
const source = getTarget();
^
diw 让 unnamed Register 改为刚删除的 target,但 "0P 仍能从 register 0 Put 先前 Yank 的 source。
这里使用 P 是因为光标位于删除后留下的空白上;p/P 的落点由光标位置和 Register 类型共同决定。
本章只要求理解它解决什么问题;named Register、black-hole
Register 和 small-delete Register 留到后续深入章节。
行级与字符级 Put
const source = getSource();
^
yy
j
p
yy 保存的是整行,因此 p 会在下一行放入一整行。相反,yiw 保存一个字符级 word,p 会在光标后
插入这个 word。先观察两次结果,比背规则可靠。
练习
const name = getName();
const fallback = "anonymous";
- Yank 第一行,并在第二行下方 Put 一份。
- 删除
fallback后直接 Put,观察内容变化;再找回最近 Yank 的第一行。 - Yank
anonymous,在同一行另一个位置 Put 它。 - 比较
p与P的位置。
本章必须记住
Yank 和 Delete 都会把文本交给 Register。
p/P 从 Register Put 文本。
unnamed Register 会被新的删除覆盖。
"0 保存最近 Yank,可用 "0p Put。
暂时不用记
暂时不用记全部 numbered、named 或系统剪贴板 Register;不同宿主应用对剪贴板的映射也可能不同。
评论