寄存器
寄存器(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 " 使用 + 寄存器作为默认(推荐)
配置后,普通的 yy 和 p 就会使用系统剪贴板。
持久化寄存器
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 | 有名 | 用户自定义 |
* | 选择 | 系统主选择区 |
+ | 剪贴板 | 系统剪贴板 |
_ | 黑洞 | 不保存删除 |
= | 表达式 | 计算结果 |
/ | 搜索 | 搜索模式 |
下一步
掌握了寄存器后,下一章我们将学习宏录制,这是自动化重复操作的强大工具。