Vim寄存器主要从复制与粘贴、宏两个板块总结。
Vim复制与粘贴
(一)用无名寄存器实现复制、粘贴和删除
之前讲到过的命令之中, 'x'、 'dd' 命令都是将文本内容剪切存储到寄存器中。由于未指定寄存器所以实际上内容都寄存到了一个未命名的寄存器中。
常见的命令有
dd : 剪切一整行
x : 剪切光标下的字符
yy : 复制一整行
当然,这些命令只是将目标内容保存到寄存器中,通过 'p' 命令完成粘贴操作。之前在文档动作中所讲的命令,例如 'iw' 等,配合 'd' , 'y' 等命令也可以完成剪切等操作,但会覆盖寄存器原有的内容。比如:

输入 'diw' 剪切当前单词。

之后到其他单词位置

执行 'yiw' 命令,之后执行 'p' 命令

并没有输出之前 'diw' 命令的内容,而是输出了 'yiw' 的内容。说明寄存器的内容被覆盖。
(二)深入理解Vim寄存器
为了防止(一)中的尴尬状况发生,可以将内容寄存到不同的寄存器中。使用指定寄存器通过命令 ' "{register} ' 完成。(一)中的例子可以通过 ' "ayiw ' 、' "bdd ' 将内容存储到不同的寄存器中。通过 ' "ap ' 、 ' "bp ' 来完成粘贴操作。其中a、b分别为寄存器的名称,当然,名称不是随便起的,Vim只提供了 a-z 26个有名寄存器。
除此之外,Vim还提供了复制专用的寄存器 ' "0 ' ,(一)中的例子,可以不使用有名寄存器进行寄存。可以通过 ' "0p ' 的方式打印之前通过 ' y ' 命令复制的内容。
黑洞寄存器
黑洞寄存器是一个有去无回的地方,使用 '_' 引用他。黑洞寄存器用于只想删除文本而不想覆盖无名寄存器中的内容的情况。例如:

使用 'yiw' 复制当前单词,之后跳转到其他单词,执行 ' "_diw ' 命令。

之后执行 'p' 命令,效果

其他寄存器有
"% : 当前文件名 "%p即可在光标处粘贴当前文件名
"# : 轮换文件名 与"%类似,用于多个文件在缓冲区时的情况
". : 上次插入的文本
": : 上次执行的Ex命令 注意寄存的是命令,不是命令的执行结果
"/ : 上次查找的内容 存储的是查找的内容
宏
宏在编程中常用于定义常量或者一些固定的操作。Vim同样支持宏。
(一)宏的读取与执行
宏通过 'q' 命令开始录制,结束录制也是通过 'q' 命令。两个 'q' 之间的操作将保存到寄存器中,可以使用有名寄存器寄存。
把一系列命令录制到宏之后,通过 '@{register}' 命令调用录制的宏。也可以通过 '@@' 命令调用之前一次调用的宏。
例如利用宏处理一段文本:

输入命令 'qa' 开始向寄存器a中录制宏。之后通过 'A;<Esc>' 向行尾插入';'。结束宏录制,使用 'q' 结束。

在未安q结束录制时,会提示正在向寄存器a中录制宏。结束录制之后,通过 'j' 命令到达下一行,输入 '@a' 完成相同操作。

当宏操作执行失败时,宏将会终止。举个例子,现在文本最后一行还没加 ';' ,红的执行除了一次一次使用 '@@' 或者 '@{register}' 来实现,还可以通过 '次数@{register}' 的方式实现。如果当前文本执行 '10@a' 会发生什么情况呢?答案是执行一次。所以次数过多可能不会导致严重的后果。
(二)宏的串行和并行
串行顾名思义就是一个一个执行,其实就是(一)中所讲通过设置执行次数的方式执行。
并行是同时执行,通过选中目标内容后同意通过 '@{register}' 的方式执行。
现在有一段文本需要转变
原文本 转变
1. one 1) One
2. two 2) Two
3. three 3) Three
4. four 4) Four
通过串行的方式,先录制宏到寄存器a
qa 开始录制
f. 匹配 '.' 光标移至 '.'

r) 替换 '.' 为 ')'
W~ 选中句子第一个字符转换大小写
j 到下一行
0 光标到行首
q 结束录制

串行的方式,通过 '3@a' 来执行剩下三次

并行的方式下,需要选中所有待操作的内容然后通过 ':normal @a' 来执行。
例如完成同样的宏录制,通过 'jVG' 选中余下内容,使用 ':' 之后输入 'normal @a' 完成操作。


结果自然和串行一样。
(三)给宏追加命令
如果发现宏的命令缺失,可以通过一定方式将缺失的命令追加,注意是追加到当前宏的所有命令之后,不是在之间插入。
查看当前宏可以通过 ':reg {register}' 的方式,比如查看(二)中的a寄存器中定义的宏。
输入 ':reg a'

追加操作,对于有名寄存器的追加操作,如果是在寄存器a中寄存,则追加时需要通过 'qA' 之后输入操作,按 'q' 结束追加。寄存器b则通过qB来追加,以此类推。如果直接使用寄存器名称,则会覆盖原有的宏。
使用 'qA' 追加宏操作,输入 'kkq' ,再调用 ':reg a',查看寄存器a,会出现下面的情况。

网友评论