跳到主要内容

06 Yank、Delete、Register 与 Put:文本去了哪里

Vim 把 Yank 或 Delete 得到的文本放进 Register,再由 Put 取出。把它想成一条数据流:

yank ────┐
├─→ register ─→ put
delete ──┘

最小 vocabulary

命令作用
x删除光标下的字符。
yyYank 当前行。
dd删除当前行。
p / P从默认 Register Put 到光标后 / 前。

pP 的具体落点还取决于 Register 中保存的是字符级还是行级文本。字符级文本会在当前行附近放入; 行级文本会放到当前行下方或上方。不要把它们简单等同于所有应用里的 Paste。

unnamed Register

不指定 Register 时,Vim 会使用 unnamed Register。最近一次 ydcx 通常会更新它。

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";
  1. Yank 第一行,并在第二行下方 Put 一份。
  2. 删除 fallback 后直接 Put,观察内容变化;再找回最近 Yank 的第一行。
  3. Yank anonymous,在同一行另一个位置 Put 它。
  4. 比较 pP 的位置。

本章必须记住

Yank 和 Delete 都会把文本交给 Register。
p/P 从 Register Put 文本。
unnamed Register 会被新的删除覆盖。
"0 保存最近 Yank,可用 "0p Put。

暂时不用记

暂时不用记全部 numbered、named 或系统剪贴板 Register;不同宿主应用对剪贴板的映射也可能不同。

评论