计算机中通常所说的寄存器Register一般指的是CPU中的寄存器,用来暂存CPU处理所需要的指令、数据等。
vim中同样也有寄存器,使用的方式和CPU非常类似。
vim中的寄存器(register)作用和windows中的剪切板类似,不过vim中的寄存器不止一个,有不同的类别,有不同的用处。
vim的寄存器是一组用于保存文本的简单容器。它们既可像剪贴板那样,剪切、复制和粘贴文本;也可以记录一系列按键操作,把它们录制成宏。
vim常规使用系统剪贴板进行剪切、复制与粘贴操作,如果再运用寄存器手段,将为删除、复制与粘贴等操作提供更多选择在,而更具灵活性,同时也提高了编辑文本效率。
vim的寄存器可以看成vim中额外用来存储信息的区域,虽然看不见,但是如果使用x、s、y、p等命令,都无意识的使用了vim的寄存器。
你可能已经在复制或删除文本并用p或P粘贴它们到别处的时候使用过Vim的寄存器了。但是,你知道Vim总共有10种不同类型的寄存器吗?如果正确地使用Vim寄存器,将帮助您从重复的输入中解放出来。
总的来说,寄存器就是一个可自定义的多重剪切板,超级剪切板。
vim所拥有的10种寄存器类型:
常用的有匿名寄存器("")和命名寄存器("a-z)。
匿名寄存器""
匿名寄存器,又常称为无名寄存器,是vim默认的寄存器,复制、删除、修改等操作的内容都会保存在该寄存器中。
倘若没有指定要使用的寄存器,vim将缺省使用无名寄存器,它可以用双引号表示。为了显式地引用该寄存器,需要使用两个双引号。例如,""p,它完全等同于p命令。x、s、d、c与y命令(以及它们对应的大写命令)都会覆盖无名寄存器中的内容。无论哪一种情况,都可以通过加"(register}前缀来指定另外一个寄存器,但无名寄存器总是缺省的。事实上,无名寄存器的内容很容易被覆盖,不小心会导致问题发生。
命名寄存器("a-z)
命名寄存器使用字母a-z来命名。a-z命名寄存器可以存储复制的、修改的、和被删除的文本。用户需要显示地告诉vim要使用的命名寄存器。
追加文本:使用大写版本的命名寄存器来向原来的命名寄存器中追加文本。
复制专用寄存器("0)
就是使用y命令复制的内容都会存放到这个寄存器中。
缓存最近操作内容,复制与删除有别。
黑洞寄存器("_)
顾名思义,这个寄存器的功能和/dev/null设备非常地相似,就是将一切输入其中的东西都吞噬掉。我们常用x命令来删除某个字符,用dd命令来删除某行,其实这些都不是删除,是剪切,真正的删除应该是这些命令:
"_dd //删除某行
"_x //删除光标下的字符
文件名寄存器("%)
"%代表的是文件名寄存器,存放的是当前正在编辑的文件名
我们重点讨论无名寄存器的命名、使用等操作。
本文中提到的d命令,y命令,c命令指的是和这个操作符相关联的命令集合,比如和y操作符相关联的一些命令如下:
yy //复制当前行
yw //当前光标下面的这个单词
yit //复制一个html标签中的内容
yft //复制当前行上光标到第一个t之间的所有内容
yiw //复制一个单词的内容(yank in word)
vim的删除、复制与粘贴命令都会用到众多寄存器中的某一个。可以通过给命令加"{register}前缀的方式指定要用的寄存器。若不指明,vim将缺省使用无名寄存器。
如果想把当前单词复制到寄存器a中,可执行"ayiw,或者,可以用"bdd,把当前整行文本剪切至寄存器b中。在此之后,既可以输入"ap粘贴来自寄存器a的单词,也可使用"bp命令粘贴来自寄存器b的一整行文本,两者互不干扰。
比如,%代表的是文件名寄存器,存放的是当前正在编辑的文件名,我们现在打开一个文件demo.txt,处于普通模式,此时输入以下内容:
"%p
//表示将文件名寄存器的内容粘贴到当前行
文件内容就变成这个样子了:
除了普通模式的命令外,vim也提供用于删除、复制与粘贴操作的Ex命令(底行模式下)。例如,可以执行:delete c,把当前行剪切到寄存器c,然后再执行:put c命令将其粘贴至当前光标所在行之下。
delete命令可以简写为d。
执行d b命令,删除当前行,内容存入b寄存器中
执行nd d命令,删除第n行,内容存入d寄存器中。
如下图,n=8
执行粘贴命令时,不能把put简写为p,会报错。
执行put d命令时,将在当前行后粘贴d寄存器中的内容。
执行nput d命令时,将在第n行后粘贴d寄存器中的内容。
如下图,n=3
一个很酷的技巧是将黑洞寄存器("_)传给:put命令。因为黑洞寄存器不保存任何值,:put _命令将插入一个新的空白行。您可将这个与全局命令联合起来,插入多个空行。
在编辑模式,当我们按下ctrl+r键,再加上相应的寄存器的名字,就可以插入寄存器中的内容了。
在编辑模式下,一般用的最多的是选择内容,用ctrl+insert复制,用shift+insert粘贴。
在可视模式下,一般用的最多的是无名寄存器。选择内容后,录入y命令进行复制,录入d命令删除内容。
查看寄存器里面缓存的内容,可以使用多个命令,如dis,registers,register,reg等。
:reg [寄存器名称]
:reg # 查看当前所有寄存器
:reg a b c # 查看命名寄存器
从技术上来说,我们没有必要来清除任何寄存器,因为你下一个使用来存储文本的寄存器会自动覆盖该寄存器中之前的内容。
如果想清除寄存器中的内容,可以使用表达式:let @a=''来将寄存器"a的值设为空的字符串。
寄存器的生命周期是很长的,即使服务器重启什么的,只要能正常进入系统,寄存器里的内容都是一直存在的。