目录
奇怪的vim
复制、粘贴操作 (y + p
)
作为一个vim
“重度患者”,在平常使用idea
写代码的时候没有vim
模拟器,简直要命。
习惯了一些操作命令后,总想着有没有更简洁的命令可以完成同一个操作。
今天,在编辑文本的时候发现,vim
的复制/粘贴(y + p
)功能,好像只能复制/粘贴一次。比如说,当你复制一个词 mysql
,随后你把这个词粘贴到另一个词 oracle
上,这就把oracle
词替换成了mysql
这个词。但是,当你想要再 粘贴一次时,按下键位p
, 你会发现,粘贴出来的内容是oracle
。
这就有点蒙了,我明明复制了mysql
啊,怎么粘贴出来就变成了oracle
了呢?这vim
复制/粘贴是不是有个 BUG 啊?
不不不,vim
到现在还这么多人用,不可能还会出现这样的 BUG。
我知道,问题出在自己身上。
于是,我开始查资料。我在搜索引擎搜索栏上输入关键字:vim
一次复制 多次粘贴。果然,这压根不是 BUG,而是我不会使用,不知道vim
复制/粘贴的内部实现原理。
中文查找有了一些线索,显示这跟 ”vim
寄存器有关”,于是,我又在搜索引擎重新输入新的关键词:vim registers
.
这下,终于搞明白为啥我只能复制/粘贴一次,以及怎么实现一次复制多次粘贴了!
vim
寄存器是啥?
查了资料才发现,原来在平常使用vim
的过程中,就一直在使用”寄存器“这玩意儿,只是我们没有意识到它的存在而已。
就拿这次想搞明白的操作”复制/粘贴“来说,我们就是在使用”寄存器“实现的操作。
当我们执行复制(y
)命令的时候,被复制的文本内容就被存储到了一个寄存器上(这个寄存器叫:unnamed register ""
,中文就是:未命名的寄存器 ""
)。之后,当我们执行粘贴命令时,就会读取unnamed register
里面的内容然后进行粘贴操作。
那寄存器到底是啥? 寄存器是vim
用来存储一些文本或操作细节的内存空间。每个空间都有一个标识符,以便随后可以访问它。
咋使用寄存器呢?
在上面的复制/粘贴操作中,就已经使用了寄存器。只不过是使用的默认的那个,也就是 unnamed register ""
。
当我们想要显示使用某个寄存器时,我们可以使用 双引号后面再跟某个寄存器的名字。比如,"a
表示寄存器 a
,":
表示寄存器 :
。
那如何获取有哪些寄存器以及它们的名字呢?很简单,使用命令:reg
就可以获得整个寄存器列表;或者你可以带上寄存器的名字,表示查特定的一个或几个寄存器信息,如命令:reg 0 a b
,表示获取寄存器0、a、b
的信息。
如下代码所示:
# 获取整个寄存器列表信息
:reg
Type Name Content
c "" editor
c "0 editor
l "1 ...
b "2 ...
b "3 ^J ^J ^J
b "4 3. ^J7. ^J9. ^J10.
...
c ": s/powerful/wonderful/
# 获取部分寄存器信息
:reg 0 : "
Type Name Content
c "" editor
c "0 editor
c ": s/powerful/wonderful/
# 上面列表中的Type一栏,想详细了解的话可以自己去查查资料。这里就不展开。
其实,寄存器在vim
中到处被使用。常见的例子有
- 在移除文本的时候。比如,使用 x 命令,这个时候,被删除的命令就存在了 unnamed register “” 里面
- 在使用 “/ 搜索字符 ”搜索文本的时候。搜索字符就被存在 “/” 寄存器中。
至于寄存器的具体使用方法,内容比较多,以后可能会再单独整一篇文章出来。
终于可以快乐的一次复制多次粘贴了
了解了上面的一些前置知识后,我们终于可以愉快的开始使用一次复制多次粘贴操作了。
使用方式是:
- 选中你要复制的内容,按下复制命令
y
。此时 未命名寄存器""
和 名字为0
的寄存器"0
都存下了刚刚复制的内容。 - 然会选中你要粘贴的内容,按下粘贴命令
p
。注意:此时 未命名寄存器""
里面的内容已经变成刚刚粘贴替换掉的内容了。此时,再使用p
,就会直接把 未命名寄存器""
里面的内容粘贴出来。 - 当你想要继续粘贴复制的内容时,需要使用 名字为
0
的寄存器。它还保留着刚刚复制的内容。 使用命令"0p
即可。
不多说了,继续做 Crtl-C / V 工程狮了,噢~不,是 y / p 工程狮……
参考资料:
1. Using vim Registers