跳到主要内容

寄存器

寄存器(Registers)是 Vim 的多剪贴板系统,允许你保存多段文本,并在需要时粘贴。这是 Vim 比传统编辑器更强大的功能之一。

什么是寄存器

寄存器是 Vim 中用于存储文本的容器。你可以将文本复制到指定寄存器,然后从该寄存器粘贴,实现多剪贴板功能。

查看寄存器内容

:registers      " 查看所有寄存器
:reg a b c " 查看指定寄存器 a, b, c

寄存器类型

1. 无名寄存器 "

默认使用的寄存器,所有删除和复制操作都会存入这里。

dd      " 删除一行,存入无名寄存器
yy " 复制一行,存入无名寄存器
p " 粘贴无名寄存器内容

2. 数字寄存器 0-9

  • 0:上次复制的内容(yank)
  • 1-9:最近 9 次删除的内容
yy      " 复制到寄存器 0 和无名寄存器
dd " 删除到寄存器 1,原 1 移到 2,以此类推
"0p " 粘贴上次复制的内容(即使中间有删除操作)
"1p " 粘贴上次删除的内容

3. 有名寄存器 a-z

26 个字母寄存器,用户可以显式使用。

"ayy        " 复制当前行到寄存器 a
"ap " 粘贴寄存器 a 的内容
"Ayy " 追加到寄存器 a(大写表示追加)

4. 只读寄存器

寄存器内容
.上次插入的文本
%当前文件名
:上次执行的命令
#交替文件名
".p         " 粘贴上次插入的文本
"%p " 粘贴当前文件名
":p " 粘贴上次命令

5. 表达式寄存器 =

用于计算表达式并将结果插入。

在插入模式下:
Ctrl+r = " 进入表达式寄存器
输入 2+3 " 输入表达式
回车 " 插入结果 5

示例

在普通模式下:
"=2+3p " 计算 2+3 并粘贴结果

在插入模式下:
今天是 Ctrl+r =strftime("%Y-%m-%d") 回车
" 插入:今天是 2024-01-15

6. 选择和拖拽寄存器 *+~

寄存器说明
*主选择区(X11)/ 系统剪贴板
+剪贴板(clipboard)
~拖拽的文本
"*yy        " 复制到系统剪贴板
"*p " 从系统剪贴板粘贴
"+yy " 复制到剪贴板(与 * 类似)
系统剪贴板

在 Windows 和 macOS 上,*+ 通常都指向系统剪贴板。 在 Linux 上,* 是主选择区(鼠标中键粘贴),+ 是剪贴板(Ctrl+v)。

7. 黑洞寄存器 _

删除到黑洞寄存器的文本不会保存到任何地方。

"_dd        " 删除一行,不保存到任何寄存器
"_dw " 删除单词,不影响其他寄存器

用途:当你想删除文本但不想覆盖默认寄存器时使用。

8. 搜索模式寄存器 /

存储上次搜索的模式。

"/p         " 粘贴上次搜索的模式

使用寄存器

复制到寄存器

"ayy        " 复制当前行到寄存器 a
"ayw " 复制单词到寄存器 a
"a3yy " 复制 3 行到寄存器 a
"ay$ " 复制到行尾到寄存器 a

从寄存器粘贴

"ap         " 粘贴寄存器 a 的内容
"aP " 在行前粘贴寄存器 a 的内容
"ap " 可以多次使用

追加到寄存器

使用大写字母表示追加:

"ayy        " 复制第一行到寄存器 a
"AYY " 追加下一行到寄存器 a
"Ayy " 再追加一行

寄存器实战

场景 1:多段复制

需要复制多段文本,然后依次粘贴:

1. "ayy     " 复制第一段到寄存器 a
2. 移动到第二段
3. "byy " 复制第二段到寄存器 b
4. 移动到目标位置
5. "ap " 粘贴第一段
6. "bp " 粘贴第二段

场景 2:保留复制内容

复制后进行了删除操作,想粘贴之前复制的内容:

yy          " 复制一行(存入寄存器 0)
dd " 删除一行(存入寄存器 1,无名寄存器也被覆盖)
"0p " 粘贴寄存器 0 的内容(上次复制的内容)

场景 3:系统剪贴板交互

与外部程序交换数据:

"+yy        " 复制到系统剪贴板
"+p " 从系统剪贴板粘贴

场景 4:批量添加前缀

给多行添加相同前缀:

1. 输入前缀文本:I// Esc
2. "ayy " 复制带前缀的行到寄存器 a
3. j " 移到下一行
4. "ap " 粘贴
5. . " 重复粘贴(如果需要)

场景 5:复杂计算

使用表达式寄存器进行计算:

1. 在插入模式下:
2. Ctrl+r =
3. 输入:100 * 2.5 + 50
4. 回车
5. 结果:300

寄存器与宏

寄存器也用于存储宏(录制的一系列命令):

qa          " 开始录制宏到寄存器 a
... " 执行一系列命令
q " 停止录制

"ap " 可以看到宏的内容(以文本形式)
@a " 执行宏

寄存器配置

共享系统剪贴板

让 Vim 默认使用系统剪贴板:

set clipboard=unnamed      " 使用 * 寄存器作为默认
set clipboard=unnamedplus " 使用 + 寄存器作为默认(推荐)

配置后,普通的 yyp 就会使用系统剪贴板。

持久化寄存器

Vim 9 支持持久化寄存器:

set viminfo+=<1000          " 保存 1000 行寄存器内容

寄存器技巧

技巧 1:快速清空寄存器

:let @a = ''        " 清空寄存器 a

技巧 2:编辑寄存器内容

"ap         " 粘贴寄存器内容
... " 编辑
"ayy " 重新存入寄存器

技巧 3:在命令中使用寄存器

:%s/\=@a/new/g      " 将寄存器 a 的内容替换为 new

技巧 4:寄存器内容作为命令

:@a         " 执行寄存器 a 中的命令

练习

练习 1:基础寄存器操作

1. 打开一个文件
2. 用 "ayy 复制一行到寄存器 a
3. 用 "byy 复制另一行到寄存器 b
4. 分别用 "ap 和 "bp 粘贴
5. 用 :reg 查看寄存器内容

练习 2:数字寄存器

1. 复制一行:yy
2. 删除几行:dd, dd, dd
3. 用 "0p 粘贴最初复制的内容
4. 用 "1p, "2p 粘贴删除的内容

练习 3:系统剪贴板

1. 用 "+yy 复制到系统剪贴板
2. 在其他程序中粘贴
3. 从其他程序复制内容
4. 用 "+p 粘贴到 Vim

练习 4:表达式寄存器

1. 在插入模式下按 Ctrl+r =
2. 输入数学表达式:100 / 4 + 25
3. 回车查看结果
4. 尝试日期函数:strftime("%Y年%m月%d日")

寄存器总结

寄存器类型用途
"无名默认寄存器
0数字上次复制
1-9数字最近删除
a-z有名用户自定义
*选择系统主选择区
+剪贴板系统剪贴板
_黑洞不保存删除
=表达式计算结果
/搜索搜索模式

下一步

掌握了寄存器后,下一章我们将学习宏录制,这是自动化重复操作的强大工具。