Vim

寄存器

寄存器就是存储文本的地方。我们常用的「复制」操作就是把文本存储到寄存器,「 粘贴」 操作就是把文本从寄存器中读出来。顺便,在 VIM 中复制的快捷键是 y,粘贴的快捷键是 p。VIM 为我们提供了如下的寄存器:

类型 标识 读写者 是否为只读 包含的字符来源
Unnamed " VIM 最近一次的复制或删除操作 (d, c, s, x, y)
Numbered 09 VIM 寄存器0: 最近一次复制。寄存器 1: 最近一次删除。寄存器 2: 倒数第二次删除,以此类推。对于寄存器 19,他们其实是只读的最多包含 9 个元素的队列。这里的队列即为数据类型 queue
Small delete - VIM 最近一次行内删除
Named az, AZ 用户 如果你通过复制操作存储文本至寄存器a,那么 a 中的文本就会被完全覆盖。如果你存储至 A,那么会将文本添加给寄存器 a,不会覆盖之前已有的文本
Read-only :.% VIM :: 最近一次使用的命令,.: 最近一次添加的文本,%: 当前的文件名
Alternate buffer # VIM 大部分情况下,这个寄存器是当前窗口中,上一次访问的缓冲区。请参阅:h alternate-file 来获取更多帮助
Expression = 用户 复制 VimL 代码时,这个寄存器用于存储代码片段的执行结果。比如,在插入模式下复制<c-r>=5+5<cr>,那么这个寄存器就会存入 10
Selection +* VIM *+剪贴板 寄存器
Drop ~ VIM 最后一次拖拽添加至 VIM 的文本(需要 "+dnd" 支持,暂时只支持 GTK GUI。请参阅:help dnd:help quote~
Black hole _ VIM 一般称为黑洞寄存器。对于当前操作,如果你不希望在其他寄存器中保留文本,那就在命令前加上_。比如,"_dd 命令不会将文本放到寄存器 "1+*
Last search pattern / VIM 最近一次通过/?:global 等命令调用的匹配条件

只要不是只读的寄存器,用户都有权限修改它的内容,比如:

:let @/ = 'register'

这样,我们按 n 的时候就会跳转到单词"register" 出现的地方。

有些时候,你的操作可能已经修改了寄存器,而你没有察觉到。请参阅 :h registers 获取更多帮助。

上面提到过,复制的命令是 y,粘贴的命令是 p 或者 P。但请注意,VIM 会区分「字符选取」与「行选取」。请参阅 :h linewise 获取更多帮助。

  • 行选取 : 命令 yyY 都是复制当前行。这时移动光标至其他位置,按下 p 就可以在光标下方粘贴复制的行,按下 P 就可以在光标上方粘贴至复制的行。
  • 字符选取 : 命令 0yw 可以复制第一个单词。这时移动光标至其他位置,按下 p 就可以在当前行、光标后的位置粘贴单词,按下 P 就可以在当前行、光标前的位置粘贴单词。
  • 将文本存到指定的寄存器中 : 命令 "aY 可以将当前行复制,并存储到寄存器 a 中。这时移动光标至其他位置,通过命令 "AY 就可以把这一行的内容扩展到寄存器 a 中,而之前存储的内容也不会丢失。

为了便于理解和记忆,建议大家现在就试一试上面提到的这些操作。操作过程中,你可以随时通过 :reg 来查看寄存器的变化。

有趣的是 : 在 VIM 中,y 是复制命令,源于单词 "yanking"。而在 Emacs 中,"yanking" 代表的是粘贴(或者说,重新插入刚才删掉的内容),而并不是复制。