Skip to content

Latest commit

 

History

History
95 lines (60 loc) · 4.39 KB

register.md

File metadata and controls

95 lines (60 loc) · 4.39 KB

寄存器

使用寄存器时,一般使用 "{register}{operator} 这种方式来读取指定 {register} 寄存器中的内容并进行操作。所以,如果想指定使用特定的寄存器的话,需要使用 "{register} 前缀来指定寄存器。

无名寄存器

寄存器,通俗点说就是一个用来寄存内容的容器,功能类似于系统中的剪贴板。在 Vim 中,很多操作都会使用到寄存器,除非特别说明,一般情况下都会使用默认寄存器来临时存放一段文本字符串内容。例如,下面这些命令都会使用默认寄存器:

y{motion}
d{motion}
x
s
c{motion}

上面这些操作符都会在执行时将 {motion} 选中的内容粘贴在无名寄存器中,使用 p 等命令时会读取无名寄存器中的内容;上面的命令,每次使用都会用新的内容覆盖老的内容,所以无名寄存器只能保存最后一次操作的内容。

无名寄存器使用 " 来表示,所以如果想要粘贴无名寄存器中的内容,可以通过使用 ""p 来将无名寄存器中的文本粘贴在光标后面。

复制寄存器

在执行复制(yank) 操作时,除了会将内容存放在默认寄存器(无名寄存器)中之外,还会将内容存放在复制专用的寄存器中。复制寄存器用 0 来表示,所以可以通过下面的命令将复制操作的内容从复制寄存器中粘贴到光标之后:

yiw " 复制一个 word
"0p " "0 表示复制寄存器,p表示粘贴操作

黑洞寄存器

"_ 表示黑洞寄存器,作用同 Linux 操作系统中的 /dev/null 一样,放进去的内容会被永久删除;但是 Vim 默认使用无名寄存器,所以如果想要删除一个内容并且不覆盖默认寄存器的话,需要手动指定黑洞寄存器来进行删除操作:

"_d{motion}

有名寄存器("a - "Z)

Vim 中提供了 72 个有名字的寄存器,用 26 个英文字母的大小写来表示。使用方式同上面的寄存器。

加号寄存器("+)

加号寄存器的作用等同于系统剪贴板,所以复制/剪切到加号寄存器中的内容,同样复制到来系统剪贴板中;同样的,在系统中复制的内容,也可以在 Vim 用通过加号寄存器来进行粘贴:

"+yiw - 将 word 复制到加号寄存器中
"+p - 将加号寄存器/系统剪贴板中的内容粘贴到 buffer 中

其他寄存器

  • "% - 当前文件名
  • "# - 轮换文件名
  • ". - 上次插入的文本
  • ": - 上次执行的 Ex 命令
  • "/ - 上次查找的模式

粘贴寄存器中的内容

p P 可用于粘贴寄存器中内容,前者将内容粘贴在光标之后,后者将内容粘贴在光标之前。

gp gP 也用于粘贴寄存器中的内容,与上面两条命令的区别之处在于,在粘贴之后,Vim 会将光标移动到粘贴内容的结尾。

另,针对不同的操作,可能会创造出面向行的寄存器以及面向字符的寄存器,这取决于复制/剪切操作的是一行内容还是几个字符:如果操作的是行,则生成一个面向行的寄存器,粘贴时就会出现在当前行之前/之后的一行;如果操作的是几个字符,则生成一个面向字符的寄存器,粘贴时就会出现在光标之前/之后。

也可以通过 <C-r> 进入选择寄存器的模式,在插入模式中使用该命令时,Vim 会暂停让你选择寄存器,在选择后将寄存器中的内容进行粘贴。

Ex command

也可以在使用 Ex 命令时指定寄存器,例如:

:delete c
:put c

上面的第一条命令会将删除的内容放入寄存器 c 中;第二条命令会从寄存器 c 中取出内容放在光标之后。

在 Ex 命令中直接使用寄存器比较麻烦,不如直接在普通模式中使用;但是如果配合 vim 脚本的话,就会方便很多。

给寄存器赋值

在使用寄存器时,可以通过下面的命令手动编程式给寄存器赋值(只要被赋值的寄存器不是只读寄存器):

let @a = 'register'

这样,寄存器 a 的值就为 register; 如果使用 :let @/ = 'register' 给寄存器 / 进行赋值的话,相当于对查找模式进行赋值,确定了查找 register,所以此时按 n 就会直接跳转到下一个包含 register 的位置。

Author 🦏