原来在vim粘贴从其他地方复制过来的文本的时候,一直用的shift + inert,那时就想,能不能够直接就像p那样粘贴,不必非得进入插入模式再来粘贴。后来看了《vim实用技巧》上关于vim寄存器的介绍,发现这里面大有文章,所以今天特意拿来和大家分享。
首先对vim中的寄存器来进行个大致浏览,它主要分为这么几个部分:
1.无名寄存器(" )
2.复制专用寄存器 (0)
3.系统剪贴板(X11视窗系统下的主剪贴板)(*)
4.黑洞寄存器 (_)
5.命名寄存器 (a-z)
6.表达式寄存器 (=)
7.其他的一些只读寄存器("/寄存器特殊)
在详细了解这些寄存器之前,我们还得了解几个和寄存器有关的命令:
0.各种复制粘贴命令说明
本文中提到的d命令,y命令,c命令指的是和这个操作符相关联的命令集合,比如和y操作符相关联的一些命令如下:
1 yy //复制当前行 2 yw //当前光标下面的这个单词 3 yit //复制一个html标签中的内容 4 yft //复制当前行上光标到第一个t之间的所有内容 5 6 。。。
1.在普通模式中使用寄存器
在执行粘贴(p)命令,或者复制(y)和剪切(x,s,d,c和他们的大写)命令时,可以在前面加上 "{register}(其中那个{register}代表的是寄存器的名字),这样我们就可以使用相应的寄存器了,如果不加的话,默认使用的是无名寄存器。
比如,%代表的是文件名寄存器,存放的是当前正在编辑的文件名,我现在打开了一个文件file2,并且正处于普通模式,如下图所示:
此时如果我输入以下内容:
1 "%p 2 3 //表示将文件名寄存器的内容粘贴到当前行
文件内容就变成这个样子了:
2.在插入模式中使用寄存器
在插入模式,当我们按下<CTRL> + R键,再加上相应的寄存器的名字,就可以插入寄存器中的内容了。
比如=代表的是表达式寄存器,比如我在vim中输入如下命令:
1 i #进入插入模式 2 <C-r>= #按下<Ctrl>+r键,再按等号键,此时就可以输入表达式了
此时vim的页面如下图所示:
然后,此时光标跳到了vim最底下的任务条(具体这个地方我也不知道叫啥,就是ex模式输入命令的那个地方),在这里就可以输入vim脚本命令了,比如,我输入一个2+3。那么运算的结果5自动就会添加到主窗口,光标也会回到主窗口,如下图所示:
3.查看当前寄存器的内容
在ex模式下输入reg或者dis命令,就可以查看当前所有寄存器的内容了。运行的结果如下图所示:
Ok,了解了这几个常用的关于寄存器的命令之后,我们再来了解一下vim中的各种寄存器。
首先是无名寄存器,它用一个双引号(")来标识,这个是我们接触的最多的寄存器了,如果没有特别指定的话,复制(y),剪切(x,s,d,c和他们的大写),粘贴(p)命令都会将内容存放到这个寄存器里面,或是从这个寄存器里面来读取内容。
第二个是复制专用寄存器,就是使用y命令复制的内容都会存放到这个寄存器中,比如这么一段文本:
1 printf("Hello, "); 2 printf("world! ");
我先把光标停留在第一行上,按下yy命令,将第一行复制,然后再移到第二行,按下dd命令,删除第二行。此时如果我们想要粘贴第一行的内容的话,直接按p是不行的,因为此时的p将引用无名寄存器中的内容,而它的内容已经被第二行的内容给覆盖了,所以此时就轮到复制专用寄存器大显身手了,此时如果按下这个命令:
1 "0p
这时,将会粘贴复制专用寄存器中的内容。这里直接贴结果图可能看不出什么效果,那我就贴一下用dd删除了第二行后所有寄存器的内容给大家看看吧:
从这里可以看出,无名寄存器保存的是dd命令删除的内容,而复制专用寄存器(0)保存的是y命令复制的内容。
第三个是系统剪贴板寄存器(+)和X11视窗系统的主剪贴板寄存器(*)。个人认为这个比较常用,所以就先说了。众所周知,任何操作系统都有一个剪贴版板,而vim就是用+寄存器来代表这个剪贴版,我经常遇到的情况就是在浏览器中复制了一段文本,然后需要在vim中粘贴,感觉这时候这个+寄存器就大显身手了。比如在逛博客的时候看到别人的代码,如下所示:
1 def main(): 2 print "Python is Fun" 3 4 main()
直接复制就都复制到系统剪贴板了,这时打开vim想要粘贴到vim中,那么只需要这个命令就好了
“+p
这样就把系统剪贴板中的内容直接贴进vim的缓冲区了,结果如下图所示(这个是Windows下面的gvim,所以没有主剪贴板这个寄存器,+和*表示的是一个寄存器):
需要声明的一点是这个剪贴板需要vim在编译的时候加上clipboard这个选项,想要查看自己的vim有没有这个选项,只要打开vim,在ex模式下输入version命令,就可以查看自己的vim支不支持这个特性了,如下图所示:
还有一个主剪贴板的寄存器,这个是在Linux下的X11视窗系统中才存在的东西,这个寄存器中存放的就是上次高亮选中的内容。这个由于我Linux上面自带的vim编译的时候没有添加clipboard选项,所以就不演示了。
第四个要说明的就是黑洞寄存器,顾名思义,这个寄存器的功能和/dev/null设备非常地相似,就是将一切输入其中的东西都吞噬掉^ o ^。平常我们经常用x命令来删除某个字符,用dd命令来删除某行,其实这些都不是删除,是剪贴,真正的删除应该是这些命令:
1 "_dd //删除某行 2 "_x //删除光标下的字符
第五个要说明的就是命名寄存器了,这个一共是a-z26个寄存器,分别用英文字母来表示。这个感觉主要需要讲的就是大写字母和小写字母的区别,当向寄存器中写入内容的时候(即复制或者剪切的时候),大写字母表示的是将当前要复制的内容追加到寄存器中,而小写字母表示的是将当前要复制的内容将寄存器中的原有内容给覆盖掉。这个可以类比于数据流重定向中的">"和">>"命令。
举个例子,比如现在有个文件file2,其中的内容是这样
1 printf("Hello, "); 2 printf("World! ");
而a寄存器中的内容刚开始是这样:
我在第一行上执行了 "Ayy命令之后,a寄存器中的内容就变成了这样,第一行的内容被追加到了寄存器中:
接着我再在第二行上执行 "ayy命令之后,a寄存器中的内容就变成了这样,寄存器中原来的内容都被覆盖掉了:
第六个要说的就是表达式寄存器,这个在前面已经举过例子了,可以在normal模式下按"=或者插入模式下按<C-r>,=来进入编辑vim表达式的模式,表达式运行的结果将被插入到vim的缓冲区中。这个我一般用来做运算,比如这样:
第七个要说的就是一些存放特定信息的寄存器了,主要是下面这几个:
7.1 当前文件名寄存器 (%)
7.2 轮换文件名寄存器 (#)
7.3 上次执行的ex命令 (:)
7.4 上次查找的关键字 (/)
这个举例子的话就是下面这个,我打开了两个文件file1和file2,然后切换到了file2,并进行了一次查找,查找了hello关键字,执行了两次reg命令,第二次reg命令执行结果如下图:
最后四行分别就是对应我们上面讲的那四个寄存器,这里需要注意的的是关键字寄存器(/)比较特殊,它是可以通过let命令来更改的,具体的执行命令如下:
let @/="the"
上面这条命令就是让查找的关键字变成了the。
OK,这个就是全部内容了,如果大家想对vim中的寄存器中的内容有进一步的了解,可以参考《vim实用技巧》第10章,或者查看vim中关于寄存器的帮助文档。
:help registers