前言
从2020年的vim笔记中摘选出来单独做内容的说明;
理解 vim 寄存器
在以前的笔记中只提到一点点,这里多做一些说明。 vim 不使用单一的剪贴板进行剪切、复制与粘贴操作,而是为这些操作提供了多组寄存器。当使用删除、复制与粘贴命令时,可以明确指定某一个进行操作. vim 的删除、复制与粘贴命令都会用到众多寄存器中的某一个。可以通过给命令加"{register} 前缀的方式指定要用的寄存器。若不指明,vim 将缺省使用无名寄存器。
看一些引用寄存器的例子,如果想把当前单词复制到寄存器 a 中,可执行 "ayiw;或者可以用 "bdd,把当前整行文本剪切至寄存器 b 中。在此之后,既可以输入 "ap 粘贴来自寄存器 a 的单词,也可使用 "bp 命令粘贴来自寄存器 b 的一整行文本,两者互不干扰。
寄存器速查表
| 类型 | 标识 | 说明 |
|---|---|---|
| 无名寄存器 | " |
最近一次复制、删除或修改操作默认使用的寄存器。 |
| 复制专用寄存器 | 0 |
最近一次 yank 的内容;不会被普通删除覆盖。 |
| 数字寄存器 | 1 至 9 |
最近几次删除内容,类似一个删除历史队列。 |
| 小删除寄存器 | - |
最近一次行内删除内容。 |
| 有名寄存器 | a 至 z,A 至 Z |
小写覆盖,大写追加;适合临时保存多段文本。 |
| 只读寄存器 | :、.、% |
分别表示最近一次命令、最近插入文本、当前文件名。 |
| 交替文件寄存器 | # |
大多数情况下是当前窗口上一次访问的缓冲区。 |
| 表达式寄存器 | = |
输入 VimL 表达式,返回值会插入当前位置。 |
| 系统剪贴板 | +、* |
与系统剪贴板 / 选择缓冲区交互。 |
| 黑洞寄存器 | _ |
删除但不保存内容,例如 "_dd。 |
| 搜索寄存器 | / |
最近一次搜索模式。 |
复制专用寄存器(")
当使用 y{motion}命令时,要复制的文本不仅会被拷贝到无名寄存器中,而且也被拷贝到了复制专用寄存器中,后者可用数字 0 加以引用。 复制专用寄存器,顾名思义,仅当使用 y{motion}命令时才会被赋值。换句话讲,使用 x、s、c{ motion}以及 d motion}命令均不会覆盖该寄存器。如果复制了些文本,可以确信该文本会一直保存于寄存器 0 中,直到复制其他文本时才会被覆盖。复制专用寄存器是稳定的,而无名寄存器是易变的.
有名寄存器("a-"z)
vim 提供了组以 26 个英文字母,命名的有名寄存器。这意味着我们可以剪切("ad{motion})、复制("ay{motion})或者粘贴("ap)多达 26 段文本。 用小写字母引用有名寄存器,会覆盖该寄存器的原有内容,而换用大写字母的话,则会将新内容添加到该寄存器的原有内容之后。
系统剪贴板(“+)与选择专用寄存器(”*)
当然,这个在windows/Linux里用的是比较多的,在mac上直接cmd+v就好了,没那么费事。如果想从 vim 复制文本到外部程序(反之亦然),则必须使用系统剪贴板. 如果在外部程序中用剪切或复制命令获取了文本,就可以通过"+p 命令(或在插入模式下用ctrl-r +)将其粘贴到 vim 内部。相反地,如果在 vim 的复制或删除命令之前加入相应的文本将被捕获至系统剪贴板。
表达式寄存器("=)
vim 的寄存器通常被认为是保存一段文本的容器。然而,通过=号引用的表达式寄存器却是个例外。当从表达式寄存器获取内容时,vim 将跳到命令行模式,并显示提示符“=”。这时,我们可以输入一段 vim 脚本表达式并按Enter执行,如果返回的是字符串(或者可被强制转换成字符串的数据), vim 将会使用它。
参考
[1] Vim 7.2
[2] Practice Vim
[3] 感受Vim的强大:进阶技巧