Skip to content

Vim - 寄存器

Vim 提供了一组寄存器,它们本质上是文本的存储位置。把它们想象成多个命名的剪贴板。这个特性对于暂存(复制)、删除和粘贴文本非常有用,尤其是在处理多段文本或跨不同文件时。

  • 将文本暂存(复制)到寄存器
  • 从寄存器粘贴文本
  • 列出可用寄存器及其内容
  • 探索不同类型的寄存器

要将文本暂存到特定寄存器,请在暂存命令(y)前面加上 "(双引号),后面跟着寄存器的名称(一个字母、数字或符号)。如果省略寄存器名称,Vim 会使用“无名”寄存器。

语法:"<register-name><yank-command>

例如,将当前行暂存到寄存器 a 中:

"ayy

将当前单词暂存到寄存器 b 中:

"byw

类似地,使用 d 删除文本或使用 c 更改文本也会填充寄存器。例如,"add 会删除当前行并将其存储到寄存器 a 中。

要从特定寄存器粘贴文本,请在粘贴命令(p 或 P)前面加上 " 和寄存器名称。

语法:"<register-name><paste-command>

例如,将寄存器 a 的内容粘贴到光标之后:

"ap

将寄存器 b 的内容粘贴到光标之前:

"bP

要查看所有寄存器的内容,请使用命令:

:registers

或其更短的别名:

:reg

你也可以显示特定寄存器,例如,查看寄存器 a、b 和 0:

:reg a b 0

此命令非常有用,可以查看有哪些文本可供粘贴。

Vim 支持几种类型的寄存器,每种都有特定的行为:

用 "" 表示(或者仅仅是不指定寄存器)。这是默认寄存器。任何使用 y 暂存或使用 d、c、s、x 删除的文本,在未指定寄存器时都会存入此处。未指定寄存器名称的 p 或 P 会从此寄存器粘贴。

有 26 个命名寄存器,从 "a 到 "z。当你使用小写字母时(例如,"ayy),寄存器内容会被覆盖。当你使用大写字母时(例如,"Ayy),暂存的文本会被附加到该寄存器的现有内容后面(例如,如果寄存器 a 包含 “hello”,使用 "Ayy 暂存行 ” world” 会使寄存器 a 包含 “hello\n world”)。这非常适合收集多段文本。

这些由 Vim 自动管理:

  • 寄存器 "0(暂存寄存器):包含最近一次 y(暂存)命令的文本。
  • 寄存器 "1 到 "9(删除/更改历史记录):"1 包含最近一次删除或更改命令的文本(除非它非常小,小于一行,且不涉及行级删除)。"2 包含倒数第二次删除的文本,依此类推,直到 "9。这形成了较大删除操作的历史记录。

这对于恢复最近删除的文本很有用。例如,如果你使用 dd 删除了一行,然后又用 dd 删除了一行,你可以使用 "2p 粘贴第一行删除的文本,并使用 "1p 粘贴第二行。

这些寄存器提供信息,不能直接写入(尽管有些会自动更新):

寄存器描述
"%当前文件名。
"#当前窗口的备用文件名。
":最近执行的 Ex 命令(命令行命令)。
".最后插入的文本。(在插入模式下使用 Ctrl-R . 或在普通模式下使用 ".p 时非常有用)
"/最后搜索的模式。
  • 黑洞寄存器("_):暂存或删除到此寄存器的任何文本都会被丢弃。如果你想删除文本而不影响无名或编号寄存器,则非常有用(例如,"_dd)。
  • 系统剪贴板寄存器("* 和 "+):如果 Vim 编译时支持剪贴板,"* 通常指 X11 selection(主剪贴板,常用于鼠标中键粘贴),"+ 指系统范围的剪贴板(与 Ctrl+C/Ctrl+V 一起使用)。将当前行复制到系统剪贴板:"+yy。从系统剪贴板粘贴:"+p。这对于与其他应用程序交互极其有用。参见 :help clipboard。
  • 表达式寄存器("=):允许你评估一个表达式并使用其结果。当你在普通模式下输入 "=(例如用于粘贴)或在插入模式下输入 Ctrl-R = 时,Vim 会提示你输入一个表达式。例如,在插入模式下输入 Ctrl-R =strftime('%Y-%m-%d')<CR> 会插入当前日期。参见 :help expression-register。