VIM中的寄存器简介
原来在vim粘贴从其他地方复制过来的文本的时候,一直用的shift + inert,那时就想,能不能够直接就像p那样粘贴,不必非得进入插入模式再来粘贴。后来看了《vim实用技巧》上关于vim寄存器的介绍,发现这里面大有文章,所以今天特意拿来和大家分享。
首先对vim中的寄存器来进行个大致浏览,它主要分为这么几个部分:
1.无名寄存器(" )
2.复制专用寄存器 (0)
3.系统剪贴板(X11视窗系统下的主剪贴板)(*)
4.黑洞寄存器 (_)
5.命名寄存器 (a-z)
6.表达式寄存器 (=)
7.其他的一些只读寄存器("/寄存器特殊)
在详细了解这些寄存器之前,我们还得了解几个和寄存器有关的命令:
0.各种复制粘贴命令说明
本文中提到的d命令,y命令,c命令指的是和这个操作符相关联的命令集合,比如和y操作符相关联的一些命令如下:
yy //复制当前行
yw //当前光标下面的这个单词
yit //复制一个html标签中的内容
yft //复制当前行上光标到第一个t之间的所有内容 。。。
1.在普通模式中使用寄存器
在执行粘贴(p)命令,或者复制(y)和剪切(x,s,d,c和他们的大写)命令时,可以在前面加上 "{register}(其中那个{register}代表的是寄存器的名字),这样我们就可以使用相应的寄存器了,如果不加的话,默认使用的是无名寄存器。
比如,%代表的是文件名寄存器,存放的是当前正在编辑的文件名,我现在打开了一个文件file2,并且正处于普通模式,如下图所示:
此时如果我输入以下内容:
"%p //表示将文件名寄存器的内容粘贴到当前行
文件内容就变成这个样子了:
2.在插入模式中使用寄存器
在插入模式,当我们按下<CTRL> + R键,再加上相应的寄存器的名字,就可以插入寄存器中的内容了。
比如=代表的是表达式寄存器,比如我在vim中输入如下命令:
i #进入插入模式
<C-r>= #按下<Ctrl>+r键,再按等号键,此时就可以输入表达式了
此时vim的页面如下图所示:
然后,此时光标跳到了vim最底下的任务条(具体这个地方我也不知道叫啥,就是ex模式输入命令的那个地方),在这里就可以输入vim脚本命令了,比如,我输入一个2+3。那么运算的结果5自动就会添加到主窗口,光标也会回到主窗口,如下图所示:
3.查看当前寄存器的内容
在ex模式下输入reg或者dis命令,就可以查看当前所有寄存器的内容了。运行的结果如下图所示:
Ok,了解了这几个常用的关于寄存器的命令之后,我们再来了解一下vim中的各种寄存器。
首先是无名寄存器,它用一个双引号(")来标识,这个是我们接触的最多的寄存器了,如果没有特别指定的话,复制(y),剪切(x,s,d,c和他们的大写),粘贴(p)命令都会将内容存放到这个寄存器里面,或是从这个寄存器里面来读取内容。
第二个是复制专用寄存器,就是使用y命令复制的内容都会存放到这个寄存器中,比如这么一段文本:
printf("Hello, ");
printf("world!\n");
我先把光标停留在第一行上,按下yy命令,将第一行复制,然后再移到第二行,按下dd命令,删除第二行。此时如果我们想要粘贴第一行的内容的话,直接按p是不行的,因为此时的p将引用无名寄存器中的内容,而它的内容已经被第二行的内容给覆盖了,所以此时就轮到复制专用寄存器大显身手了,此时如果按下这个命令:
"0p
这时,将会粘贴复制专用寄存器中的内容。这里直接贴结果图可能看不出什么效果,那我就贴一下用dd删除了第二行后所有寄存器的内容给大家看看吧:
从这里可以看出,无名寄存器保存的是dd命令删除的内容,而复制专用寄存器(0)保存的是y命令复制的内容。
第三个是系统剪贴板寄存器(+)和X11视窗系统的主剪贴板寄存器(*)。个人认为这个比较常用,所以就先说了。众所周知,任何操作系统都有一个剪贴版板,而vim就是用+寄存器来代表这个剪贴版,我经常遇到的情况就是在浏览器中复制了一段文本,然后需要在vim中粘贴,感觉这时候这个+寄存器就大显身手了。比如在逛博客的时候看到别人的代码,如下所示:
def main():
print "Python is Fun" main()
直接复制就都复制到系统剪贴板了,这时打开vim想要粘贴到vim中,那么只需要这个命令就好了
“+p
这样就把系统剪贴板中的内容直接贴进vim的缓冲区了,结果如下图所示(这个是Windows下面的gvim,所以没有主剪贴板这个寄存器,+和*表示的是一个寄存器):

需要声明的一点是这个剪贴板需要vim在编译的时候加上clipboard这个选项,想要查看自己的vim有没有这个选项,只要打开vim,在ex模式下输入version命令,就可以查看自己的vim支不支持这个特性了,如下图所示:

还有一个主剪贴板的寄存器,这个是在Linux下的X11视窗系统中才存在的东西,这个寄存器中存放的就是上次高亮选中的内容。这个由于我Linux上面自带的vim编译的时候没有添加clipboard选项,所以就不演示了。

第四个要说明的就是黑洞寄存器,顾名思义,这个寄存器的功能和/dev/null设备非常地相似,就是将一切输入其中的东西都吞噬掉^ o ^。平常我们经常用x命令来删除某个字符,用dd命令来删除某行,其实这些都不是删除,是剪贴,真正的删除应该是这些命令:
"_dd //删除某行
"_x //删除光标下的字符
第五个要说明的就是命名寄存器了,这个一共是a-z26个寄存器,分别用英文字母来表示。这个感觉主要需要讲的就是大写字母和小写字母的区别,当向寄存器中写入内容的时候(即复制或者剪切的时候),大写字母表示的是将当前要复制的内容追加到寄存器中,而小写字母表示的是将当前要复制的内容将寄存器中的原有内容给覆盖掉。这个可以类比于数据流重定向中的">"和">>"命令。
举个例子,比如现在有个文件file2,其中的内容是这样
printf("Hello, ");
printf("World!\n");
而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
VIM中的寄存器简介的更多相关文章
- Vim中的寄存器
# Vim中的寄存器 ### 文件名寄存器---- 粘贴文件名 `"%p"` ### 查看vim中的寄存器---- 查看寄存器 `reg` 或 `dis` ### 详细介绍---- ...
- Linux环境下shell和vim中乱码原因及消除办法
shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...
- VIM 中鼠标选择不选中行号
VIM 中鼠标选择不选中行号 在Vim中,我们一般会使用 :set nu 打开行号开关. 但是打开行号后,有个弊端,那就是在用鼠标进行选择的时候,会将前面的行号也一起进行拷贝了.但是在gVim中进行选 ...
- vim 中乱码问题
在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些命令来解决的.一直没有理解为什么会出乱码,本文就是想认真分析 ...
- 解决vim中鼠标右键无法复制的问题
转:http://www.cnblogs.com/jianyungsun/archive/2011/03/19/1988855.html 这是我的vim配置文件:jeffy-vim-v2.4.tar ...
- Vim中如何全选并复制?
全部删除:按esc后,然后dG全部复制:按esc后,然后ggyG 全选高亮显示:按esc后,然后ggvG(这个好像有点问题)或者ggVG正确 vim如何与剪贴板交互(将vim的内容复制出来) 习惯了在 ...
- VIM中的特殊字符
0.简介 在linux中vim查看一个windows下的文本文件, 经常在行尾有一个 ^M. 这其实是windows/linux/mac系统中文本换行不一致的原因导致的, 系统类别 文本换行符 转义字 ...
- [20170617]vim中调用sqlplus.txt
[20170617]vim中调用sqlplus.txt --//以前写过一篇emacs下调用sqlplus的文章,一直想学emacs,受限制自己掌握vim,对学习它没有兴趣,原链接如下:--//htt ...
- 【转】vim中多标签和多窗口的使用
原文:https://my.oschina.net/kutengshe/blog/464602 ---------------------------------------------------- ...
随机推荐
- Feister network
在密码学中,Feister network(又叫Feister Function, 一下简称 F函数)是一种用在块加密上的对称结构,很多种块加密算法都是使用这种结构. 优点: 1.加解密的过程非常相似 ...
- OSG的HUD抬头文字显示
原文:http://blog.csdn.net/tmljs1988/article/details/7562926 可以运行 1. HUD流程图: 完整源代码如下: /*OSG中的HUD, ...
- flume+kafka+storm
centos06.6+JDK1.7 flume1.4+kafka2.10+storm0.9.3 zookeeper3.4.6 集群: 192.168.80.133 x01 192.168.80.134 ...
- what is docker
尽管之前久闻Docker的大名了,但是天资愚钝,对其到底是个啥东西一直摸不清,最近花了一段时间整理了一下,算是整理出一点头绪来. 官网的介绍是这样的: Docker is an open platfo ...
- BootStrap2学习日记20---定制缩略图
先看看效果: 代码: <ul class="thumbnails"> <li class="span3"> <div class= ...
- 浅析jQuery中常用的元素查找方法总结
本篇文章是对jQuery中常用的元素查找方法进行了详细的总结和介绍,需要的朋友参考下 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文 ...
- (转)乐观的并发策略——基于CAS的自旋
悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题:而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后 ...
- java产生不重复的随机数
/** *产生9位不同的随机数 */ private String getRandomString(){ StringBuffer sb = new StringBuffer(); for(int i ...
- java执行程序
执行jar java -jar x.jar 执行jar里边指定class java -cp x.jar x.x.x
- 基本java类-In.java
package com.algorithm.api; /************************************************************************ ...