Vim 学习笔记 No.5
寄存器与宏
基础部分省略
寄存器
1 调换字符
若有两个字母顺序颠倒,将光标置于第一个字母,按下xp
即可达到调换两个字母的功能。通常的做法是删掉两个字母后重新插入,可以习惯一下更高效的做法。
2 寄存器与 Ex 命令
{range}delete {register}
即可将选中内容剪切到寄存器中,同理还有put
和yank
命令。
3 各种寄存器
黑洞寄存器
emmm 如此中二的名字……用下划线 _
代表黑洞寄存器,放到黑洞寄存器里的内容哪个寄存器也没去(被吃掉了),不会覆盖无名寄存器。
复制专用寄存器
复制的内容不仅会进入无名寄存器,还会放入 0 寄存器。这样就不用担心无名寄存器被覆盖啦。
有名寄存器
名字就是 a-z
26 个小写字母。不过注意,在把一段内容放入有名寄存器时,若用大写字母指代,则原有内容不会被覆盖,新内容会被添加到其后。
系统剪切板
+
代表系统剪切板。
表达式寄存器
=
代表表达式寄存器,使用时 vim 会转到命令行模式。此时可输入一段 vim 脚本,按下 \<CR>
后可得到转换为字符串的数据。
感觉非常有用!比如在编程的时候,可当作一个计算器使用!配合上 vim 脚本会得到更好的效果!
其他寄存器
%
表示当前文件名#
表示轮换文件名(按下 <C-^> 后转到的缓存区).
上次插入的文本:
上次执行的 Ex 命令/
上次查找的模式
6 查看寄存器内容
:registers
可打印寄存器内容,也可以使用简写:reg
。
5 可视模式下使用寄存器
在可视模式下使用寄存器粘贴,选中区域的内容和寄存器中的内容会被交换。或许能用在一些有趣的地方。
6 使用gp
p
和P
的作用就不多说了。在这两个按键前加上g
,可以使粘贴后的光标移动到被粘贴出来的文本的末尾而不是开头。这个特性在多次粘贴时比较方便。
一个可以参考的操作流程: yap
-> gP
-> 对第二段文本进行编辑
宏
1 录制、回放宏
按下q{register}
开始宏录制,录制结束后按下q
即可。用大写字母作为{register}时命令会追加到寄存器最后。
想要回放一个宏,按下@{register}
。之前提到过,可以用@:
回放上一次的 Ex 命令,这是因为:
寄存器会自动储存上一次的 Ex 命令。
2 值得注意的技巧
- 规范光标的位置,起始命令通常应该是
0
这样的,而终止命令可以选择将光标移动到下一行。 - 可重复动作,通常应当避免多个
l
而选用w
这样的移动动作 - 动作命令失败时宏自动终止,一个技巧是用
f
来定位某个字符,宏会在字符不存在时自动停止。此时便可以用{num}@{register}
多次调用宏,且{num}可以任意选用足够大的数字。
3 两种执行宏的方式
串行
也即{num}@{register}
这样指定重复次数的执行方式。假如重复 100 次,每次对一行进行修改并移动光标至下一行,在第 30 次的时候出现命令失败而导致宏终止,则之后所有的 70 次都不会再执行。
并行
{range}norm @{register}
对选中范围的每一行执行宏,某一行的失败并不会影响其他行。
应当根据具体情况在两种方式中选用
4 对一组文件执行宏
并行
使用:argdo {command}
可对参数列表中所有文件执行一条 Ex 语句,用这个方法可以对一组文件执行宏,并且某一文件中宏执行失败不会影响其他文件中的执行。
串行
在一条宏的最后加入文件跳转的命令(比如next
),便可使用:{num}@{register}
的方式串行执行宏了。
保存问题
如果设置了
" 切换文件前不一定要保存当前文件,退出时询问是否保存
set hidden
那么宏中可以不对文件进行保存,退出时确认更改无误再一一保存。
也可使用:wa[ll]
命令保存缓存区所有文件,或者使用:wn[ext]
保存当前文件并切换至下一个缓存区。