Skip to content

寄存器系统:剪贴板的终极形态

Vim 的寄存器系统远超普通剪贴板——你可以同时保存多段内容,随时粘贴任意一段。

寄存器基础

什么是寄存器

寄存器是 Vim 的"命名剪贴板"。普通编辑器只有一个剪贴板,Vim 有几十个。

查看寄存器内容

vim
:reg        " 查看所有寄存器
:reg a      " 查看寄存器 a
:reg ab     " 查看寄存器 a 和 b

寄存器类型

命名寄存器 a-z

"ayy    复制当前行到寄存器 a
"ap     粘贴寄存器 a 的内容
"byiw   复制单词到寄存器 b
"bp     粘贴寄存器 b 的内容

大写追加 A-Z

大写字母表示追加到寄存器:

"ayy    复制第一行到 a
"Ayy    追加另一行到 a(不是覆盖)

这在收集多处内容时非常有用。

默认寄存器 "

yy      默认复制到 " 寄存器
p       默认从 " 寄存器粘贴

系统剪贴板 + 和

"+yy    复制到系统剪贴板
"+p     从系统剪贴板粘贴
"*yy    复制到选择剪贴板(X11)
"*p     从选择剪贴板粘贴

在 Windows/Mac,+* 通常相同,都是系统剪贴板。

数字寄存器 0-9

  • "0:最近一次复制(yank)的内容
  • "1-9:最近的删除历史,1 是最近的
"0p     粘贴最近复制的内容(不受删除影响)
"1p     粘贴最近删除的内容

特殊寄存器

寄存器内容
"-小删除(少于一行)
".最近插入的文本
"%当前文件名
"#上一个文件名
":最近执行的命令
"/最近的搜索模式

实用操作

复制到指定寄存器

"ayy        复制当前行到 a
"a3yy       复制 3 行到 a
"ayiw       复制单词到 a
"ay$        复制到行尾到 a

粘贴指定寄存器

"ap         在光标后粘贴 a
"aP         在光标前粘贴 a

从不同寄存器粘贴

"ap         粘贴 a
"bp         粘贴 b
"0p         粘贴最近复制的内容
"+p         粘贴系统剪贴板

实战场景

场景 1:保留复制内容不被删除覆盖

1. yy 复制某行
2. dd 删除另一行
3. "0p 粘贴复制的行(不是删除的)

"0 寄存器只存复制的内容,不受删除影响。

场景 2:同时保存多段内容

1. 移到第一处,"ayy 复制到 a
2. 移到第二处,"byy 复制到 b
3. 移到第三处,"cyy 复制到 c
4. 移到目标位置,"ap 粘贴 a
5. "bp 粘贴 b
6. "cp 粘贴 c

场景 3:收集分散的内容

1. 移到第一处,"ayy 复制到 a
2. 移到第二处,"Ayy 追加到 a
3. 移到第三处,"Ayy 继续追加
4. "ap 一次粘贴所有收集的内容

场景 4:与系统剪贴板交互

从浏览器复制代码:

1. 浏览器中 Ctrl+C 复制
2. VSCode 中 "+p 粘贴系统剪贴板内容

复制代码到其他程序:

1. VSCode 中 "+yy 复制当前行到系统剪贴板
2. 在其他程序 Ctrl+V 粘贴

VSCode Vim 配置

使用系统剪贴板作为默认

json
{
  "vim.useSystemClipboard": true
}

启用后,yp 直接使用系统剪贴板,无需 "+

在可视模式下也使用系统剪贴板

json
{
  "vim.visualstar": true,
  "vim.useSystemClipboard": true
}

键位映射简化剪贴板操作

json
{
  "vim.normalModeKeyBindingsNonRecursive": [
    // Y 复制到行尾(更一致的行为)
    { "before": ["Y"], "after": ["y", "$"] },
    
    // 快速复制到系统剪贴板
    { "before": ["<leader>", "y"], "after": ["\"", "+", "y"] },
    { "before": ["<leader>", "Y"], "after": ["\"", "+", "y", "$"] },
    
    // 快速粘贴系统剪贴板
    { "before": ["<leader>", "p"], "after": ["\"", "+", "p"] },
    { "before": ["<leader>", "P"], "after": ["\"", "+", "P"] }
  ],
  "vim.visualModeKeyBindingsNonRecursive": [
    // 可视模式下复制到系统剪贴板
    { "before": ["<leader>", "y"], "after": ["\"", "+", "y"] },
    
    // 粘贴时不覆盖剪贴板
    { "before": ["p"], "after": ["\"", "_", "d", "P"] }
  ]
}

解释可视模式粘贴技巧

默认情况下,可视选中后 p 粘贴会把选中的文本放入默认寄存器,覆盖你复制的内容。

使用 "_dP

  • "_d:删除到黑洞寄存器(不保存)
  • P:粘贴

这样粘贴后,原来复制的内容还在,可以继续粘贴。

寄存器在宏中的应用

宏本身存储在寄存器中:

qa ... q    宏存储在寄存器 a
:reg a      查看宏内容
"ap         可以粘贴宏内容(即操作序列)

编辑宏:

1. "ap 粘贴宏内容
2. 编辑这行文本
3. "ayy 重新存回寄存器 a
4. @a 执行修改后的宏

常用寄存器速查

寄存器用途
"a-z自定义命名存储
"0最近复制的内容
"+系统剪贴板
"_黑洞寄存器(删除不保存)
".最近插入的文本
"%当前文件名

黑洞寄存器

"_ 是黑洞寄存器,发送到这里的内容会消失:

"_dd    删除行,不保存到任何寄存器
"_diw   删除单词,不保存

用途:删除内容时不想覆盖剪贴板。


本章收获

  • ✅ 理解 Vim 寄存器系统
  • ✅ 掌握命名寄存器的使用
  • ✅ 熟练使用系统剪贴板集成
  • ✅ 学会实用的粘贴技巧

效率提升:多寄存器让你同时保存多段内容,不再为"复制后被覆盖"烦恼。

寄存器系统:剪贴板的终极形态 has loaded