Vim的寄存器是只有你先知道它是什么后才会想到使用的特性,一旦你学会使用寄存器后,它就会成为你的Vim工作流程中不可缺少的一部分,但是学习如何使用寄存器比较困难,换句话说,有很多使用vim多年的人也不知道如何合理的使用寄存器,接下来跟着我学习如何使用寄存器,你就不会成为他们中的一员!
如果你不知道我在说什么
你可以认为寄存器就是很多块内存空间,vim使用这些空间保存一些文本,每个空间都有一个唯一的标识,而后,可以通过标识访问对应的内存空间中的文本。
把文本复制到剪切板中并不困难,有时感到困难的是剪切板无法同时保存多个文本,所以,vim的寄存器的作用就体现出来了,寄存器就是可以保存多个文本的剪切板!
核心用法
每个寄存器都可以使用双引号加上寄存器名称来访问,比如,我们可以使用"r这个语法来访问名为r的寄存器。
在命令模式下,通过"ry这个语法把选中的文本复制到寄存器r中,y是复制选中的文本的意思。通过"rp这个语法把寄存器r中保存的内容粘贴到当前光标后面,使用的逻辑和"ry相同,不过这里的p表示的是粘贴的意思。你也可以在插入模式下使用Ctrl-r + 寄存器的名字来访问寄存器,比如Ctrl- r命令,把r寄存器中的内容粘贴到当前光标后面。
使用:reg命令查看当前的所有寄存器中保存的内容,或者通过:reg a b c命令查看指定的a,b和c这三个寄存器中的内容
未命名的寄存器
vim有一个未命名的寄存器(又称默认寄存器)可以通过命令""(两个引号)来访问,任何你刚刚删除的(通过d,c,s或者x命令)或者复制的(通过y命令)文本都会被保存在这个寄存器中,当不指定寄存器名称时,vim默认使用这个未命名的寄存器,比如""p命令就是把这个未命名寄存器中的内容粘贴到当前光标后面。
不再丢失已复制的文本
使用vim时,不时发生丢失复制或者删除的文本,比如当我们复制了一些文本,接着又删除了一些文本,然后当我们试着粘贴之前复制的文本时,之前复制的文本已经消失了(vim用删除的文本替换了前一步复制的文本),然后你又重复的去将文本复制一份。
所以,我们得出一个结论,vim总是会替换那个未命名寄存器中的内容,当然,我们并不想重复的去将文本复制一份,如果vim不能做到这点,那么vim不会保留这个愚蠢的特性,你觉得呢?
vim的做法是自动把内容保存到多个以数字命名的寄存器中,就像我们期望的那样,这些寄存器是数字0到数字9。
寄存器"0总是保存最后一次复制的文本,其它9个寄存器保留最后9次删除的文本,"1寄存器保留最后一次删除的文本,"9寄存器保留最先删除的文本。所以,如果你复制了一些文本,你总是可以通过命令"0p来访问。
只读寄存器
vim有4个只读寄存器:"., "%, ":和"#
最后插入的文本被保存在寄存器 ". 中,当你需要重复文本多次的时候非常有用,换句话说,就不用复制粘贴多次了。
"% 寄存器保存了当前文件的相对路径(相对于vim启动的目录),我经常使用这个寄存器把当前文件的路径复制到系统剪切板中,然后我就可以在vim之外使用这个文件路径了(比如在外部的脚本使用这个路径)。你可以执行 :let @+=@% 实现这个操作。let 命令用来向寄存器中写入文本,"+命令是代表剪切板的寄存器,所以我们才可以把当前文件的路径复制到系统剪切板中。
": 寄存器保存了最后一次执行的命令。如果你使用:w保存了当前正在编辑的文件,那么"w"将保存在":寄存器中。这个寄存器常见的用法是执行 @: 命令,再次执行这个命令,比如你执行了一个文本替换命令 :s/foo/bar,你可以在另一行使用@:再执行一次刚刚执行的替换命令。
"# 寄存器保存了和当前文件"交替"的文件,你可以认为是最后一次被编辑的文件(其实比这个还要复杂,如果你想了解得更深入,可以使用:h alternate-file查看更多信息)。vim使用这个寄存器结合Ctrl-命令来切换打开的文件,也可以使用 :e Ctrl-r #命令。我很少这样用,但是我希望你能用这个命令做得更好。
表达式寄存器和搜索寄存器
表达式寄存器("=)通常用来得到表达式的结果,通过例子,这将非常容易理解,比如在插入模式中,执行Ctrl-r =命令后,你将会在命令行中看到“=”号,接着输入2+2然后敲回车,你将看到2+2的结果4出现在了界面上。表达式寄存器通常用来执行一系列的表达式,甚至通过表达式寄存器来执行外部命令,比如执行Ctrl-r =命令后,在命令行中输入system('ls')然后回车,ls命令输出的结果将会粘贴在当前光标的后面。
搜索寄存器,就向这个名字所表达的一样,保存了你使用/,?,*或者#命令进行搜索时的搜索的文本,比如你使用/Nietzsche命令进行搜索,接着你想要对这个搜索的文本进行替换,你不得不把Nietzsche这个文本再次输入一遍,如果你知道搜索寄存器,就可以使用:%s/
宏
你可能已经熟悉vim的宏操作了,它可以记录一系列的操作动作,然后再次或者多次重复执行这些操作的动作(:h recording命令可以查看更多的信息)。你可能并不知道vim使用寄存器保存了这些操作动作,如果你使用qw命令记录一个宏,那么寄存器"w将保存你所有的操作,这些操作都在寄存器中使用纯文本记录。
酷酷的事情就在这里,宏功能只用一个简单的寄存器就实现了,你甚至可以修改这个宏寄存器,你以前可能多次在宏记录中途漏掉了几个步骤,然后不得不重新录制宏?ok,这种事情不会再次发生,你可以通过寄存器编辑这个宏,比如,你在w这个宏中漏掉了添加分号这个操作,只需要执行:let @W='i;'命令。注意这是个大写的W,这个命令是向寄存器w中追加一个值,使用的是大写的寄存器名字,这里我们往寄存器中追加了命令i;,进入插入模式(i)然后添加了一个分号。
如果你需要在寄存器中进行编辑,只需要执行:let @w='
另一件酷酷的事情就是,宏在寄存器中是以纯文本形式存在,那么你就可以很容易的移动宏,比如把宏复制到另一vim实例中,或者把宏分享给其他人,想想,如果你的宏在系统剪切板中,只需要执行@+命令执行这个宏("+代表系统剪切板的寄存器),这难道不酷吗?
总结
理解寄存器是如何工作的非常简单,尽管你可能5分钟都不会用它一次,但是它的确在某些时候避免了让人恼火,比如丢失了刚刚复制的字符串,或者一次又一次重复的录制一个宏。我只是写出了我用得最多的寄存器相关的知识,但是关于寄存器还有更多的内容。如果你对一小部分没有涉及或者觉得一些神秘的寄存器感到好奇,我认为你绝对应该阅读一下:h registers命令生成的关于寄存器的文档。