Vim 学习笔记 No.5

寄存器与宏

基础部分省略

寄存器

1 调换字符

若有两个字母顺序颠倒,将光标置于第一个字母,按下xp即可达到调换两个字母的功能。通常的做法是删掉两个字母后重新插入,可以习惯一下更高效的做法。

2 寄存器与 Ex 命令

{range}delete {register}即可将选中内容剪切到寄存器中,同理还有putyank命令。

3 各种寄存器

黑洞寄存器

emmm 如此中二的名字……用下划线 _ 代表黑洞寄存器,放到黑洞寄存器里的内容哪个寄存器也没去(被吃掉了),不会覆盖无名寄存器。

复制专用寄存器

复制的内容不仅会进入无名寄存器,还会放入 0 寄存器。这样就不用担心无名寄存器被覆盖啦。

有名寄存器

名字就是 a-z 26 个小写字母。不过注意,在把一段内容放入有名寄存器时,若用大写字母指代,则原有内容不会被覆盖,新内容会被添加到其后。

系统剪切板

+ 代表系统剪切板。

表达式寄存器

= 代表表达式寄存器,使用时 vim 会转到命令行模式。此时可输入一段 vim 脚本,按下 \<CR> 后可得到转换为字符串的数据。

感觉非常有用!比如在编程的时候,可当作一个计算器使用!配合上 vim 脚本会得到更好的效果!

其他寄存器

  • % 表示当前文件名
  • # 表示轮换文件名(按下 <C-^> 后转到的缓存区)
  • . 上次插入的文本
  • : 上次执行的 Ex 命令
  • / 上次查找的模式

6 查看寄存器内容

:registers可打印寄存器内容,也可以使用简写:reg

5 可视模式下使用寄存器

在可视模式下使用寄存器粘贴,选中区域的内容和寄存器中的内容会被交换。或许能用在一些有趣的地方。

6 使用gp

pP的作用就不多说了。在这两个按键前加上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]保存当前文件并切换至下一个缓存区。

tandf

Tsinghua University, Department of Automation
One thing at a time. One thing done well.