Vim的强大功能有很大一部分体如今它丰富的寄存器上。咱们能够灵活使用寄存器存取文本,还能将命令录制于寄存器中。javascript
在Vim中,大部分的修改操做都可以撤销,而这也要归功于背后的寄存器。下面咱们来看看Vim这个神器都有哪些神奇的寄存器。html
在Vim中,寄存器被分为如下10种类型:java
""
"0 ~ "9
"-
"a ~ "z
或 "A ~ "Z
":
".
"%
"#
"=
"*
"+
"~
"_
"/
这10个寄存器都有本身的特定使用场景,等下面分析完以后,你就能很清楚地知道它们都是干吗的了!express
在正常模式(normal mode)下,咱们使用 "reg
来引用某个寄存器。而在其它状况下,咱们使用 @reg
来引用某个寄存器。vim
例如:函数
#正常模式,使用寄存器a来复制当前行
"ayy
#命令行模式,为寄存器a赋值
:let @a="some text..."复制代码
接下来的文章中,咱们将使用 "x
的形式来表示 寄存器x
。spa
OK,下面咱们就来分析上述10种寄存器的具体使用场景,以及它们的做用。命令行
当咱们使用 d, c, s, x
这几个命令修改文本,或者使用 y
复制文本的时候,不管是否指定了寄存器,这些内容会被储存到 ""
寄存器中,除非咱们指定了黑洞寄存器 "_
。code
当咱们进行文本的复制或删除操做时,内容就会存储到数字寄存器中。orm
0号寄存器 "0
储存最近一次复制的内容,除非指定了其它寄存器。
1号寄存器 "1
存储最近一次删除或修改的内容,除非指定了其它寄存器,或内容不到一行(此时将会使用小型删除寄存器 "-
)。
若是删除操做与如下移动命令一块儿使用,那么将老是使用1号寄存器:%
,(
,)
, `
,/
,?
,n
,N
,{
,}
。此时若是内容不到一行,"-
寄存器会被同时使用。
1号寄存器被再次使用时,原先的内容会转移到2号寄存器,而2号寄存器的内容则转移到3号寄存器,以此类推,最后9号寄存器的内容则会被丢弃。
被删除的内容不到一行时,该寄存器将被使用。
若是咱们指定了其它寄存器,则该寄存器不会被使用。
只有当咱们手动指定了字母寄存器时,它们才会被使用。
当咱们使用小写形式的字母寄存器时,新内容会覆盖掉以前的内容。
当咱们使用大写形式的字母寄存器时,新内容会追加到以前的内容后面。
若是 cpoptions
选项中含有 >
标志,则追加内容时会自动添加换行符。
只读寄存器的内容只能被读取,也就是说,只能使用 p
,P
,:put
或 CTRL-R
命令来获取它的内容。
".
存储最后被插入的内容。(与插入模式下使用 CTRL-A
和 CTRL-@
命令的插入内容一致)"%
存储当前文件名。":
存储最后一次在命令行中执行的命令。存储当前视窗中另外一个缓冲区文件的名称。也就是当咱们按下 CTRL-^
时将会跳转到的那个文件的名称。可手动更改它的值,从而让上述命令跳转到指定文件。
let @# = 'buffer_name'复制代码
表达式寄存器与其它寄存器不一样,它并不存储文本内容,而是用于计算表达式的值。在正常模式下输入 "=
,或在插入模式下按 CTRL-R=
时,会进入到命令行,在这输入的命令会通过计算,而后得出结果。
使用表达式寄存器,咱们就能够在编辑文件时方便地让Vim替咱们完成计算(能够是算术计算,也能够是函数调用),而后把结果插入到文本中。总之,表达式寄存器能够进一步简化咱们的工做,很是方便!关于表达式的详细介绍,能够输入命令 :help expression
查看。
这里有两篇介绍表达式寄存器的文章:
这是用于存储和获取GUI剪贴板内容的寄存器。当剪贴板不可用时,会自动使用未命名寄存器 ""
来代替。
只读的 "~
寄存器用于存储拖放到Vim的内容。当有内容拖放到Vim中时,还会触发虚拟按键 <Drop>
,能够经过映射该键来完成特定任务。
正如它的名字同样,写入该寄存器的内容都会消失。咱们可使用该寄存器来避免其它寄存器受到影响。
读取该寄存器时,返回的内容为空。
该寄存器存储了最后一次搜索的模式串,包括使用 /
以及 :g
、:s
等命令进行匹配的模式串。
手动对该寄存器赋值,也可高亮搜索结果,与 /
命令的效果同样。
咱们在正常模式下录制宏的时候,使用的就是上面介绍的寄存器。除了黑洞寄存器和只读寄存器不能用于录制宏之外,其它寄存器都可以用于录制宏。
当咱们录制一串较长的命令时,可能由于某个地方出了错,致使录制失败,须要从新开始。不过,既然录制的宏存放于这些寄存器中,那么咱们就可以像读取普通文本同样读取它们。
例如,我使用寄存器 "a
录制了一个宏,可是中间有个地方出了错。这时我可使用 "ap
将这串命令粘贴下来,而后修改出错的地方,最后选择这串命令,经过 "ay
将它们复制回寄存器 "a
。这样,咱们不用从新录制命令,就完成了宏的修改,是否是很方便?