oeasy教您玩转vim - 81 - # 宏macro的进阶
宏的进阶 macro
回忆
关于宏,上次有4个要点
qa 开始录制宏
q 结束录制宏
@a 应用宏
qA 追加录制宏
甚至可以编辑宏
"ap 把宏作为文本粘贴出来
编辑之后
"ayy把新的宏装在进入a寄存器reg
这个宏还可以怎么玩呢?🤔
建立环境
vi
oeasy.txt
插入一下内容
a. oeasy
b. o2z
c. o3z
d. o9z

录制新宏
qa0W~hjq
qa 在a寄存器里面开始录制
0 到行头
W 跳一个大词
~ 改变当前光标位置字符的大小写
j 向下一行
q 停止录制
查看宏
:reg a
应用宏
正常模式下直接命令的方式
应用99行
应用到当前行
@a
99@a
u回来
用命令行的方式
切换模式并对2-4行执行@a
切换到normal模式并对当前行执行@a
:normal @a
:2,4 normal @a
u回来
追加宏
gg
回到最初qAkA.<Esc>jq
qA
追加录制宏到a寄存器k
是为了抵消上面的j
A
追加在本行最后.
写一个.
<Esc>
退回到正常模式j
向下一行q
退出录制这部分内容,就被追加到宏a里面
可以
:reg a
看到0W~hjkA.<esc>j
:% normal @a
u回来
修改宏 macro
:reg a
目前
0W~hjkA.<esc>j
中jk
彼此抵消在文档最后把寄存器a中的存储的宏粘贴出来
Go"ap出来
修改为
0W~A.<esc>j
重新定义宏a
"ay$
观察宏a
:reg a
批量执行
:% normal @a
多文件执行
除了
oeasy.txt
之外还有
o2z.txt
、o3z.txt
:!cp oeasy.txt o2z.txt
:!cp oeasy.txt o3z.txt
批量执行
保存所有文件修改
对于args中的每个文件中的每一行执行a这个宏
g global全局执行
匹配任何字符匹配每一行.*
如果是
o.*
对应的是以o开头的每一行normal @a 正常模式下执行@a
列出所有参数
添加当前文件夹下的所有txt文档
:arga *.txt
:args
:argdo g/.*/normal @a
:argdo w
快速执行
@@
执行上一条宏
:2,5@
第2-5行执行上一条宏
递归执行宏
文件还是这样的
oeasy.txt
a. oeasy
b. o2z
c. o3z
d. o9z
qaqqa0W~j@aq
停止录制
执行宏a
往下跳一行
改变大小写
跳大词
到第一列
开始录制a
把a宏清空
qaq
qa
0
W
~
j
@a
q
然后运行
这样他就是自己执行自己
直到最后一行无法再递归调用
就自动跳出了
并行执行
有素材如下
-录制宏
import { FUNC1 } from "oeasy";
import { FUNC2 } from "o2z";
import { FUNC3 } from "o3z";
import function from "o9z";
import { FUNC4 } from "o9z";
import { FUNC5 } from "orz";
qa0f{gui{jq
往下一行
把{}里面的内容小写
跳到{
到第1列
开始录制宏a
qa
0
f{
gui{
j
q 停止录制
运行宏
99@a
会卡到第4行
因为找不到{
这个时候可以并发执行
:1,$ normal @a
从第1行到最后一行每一行都在normal模式下执行@a
总结
关于宏,我们回忆一下
qa 开始录制宏
q 结束录制宏
@a 应用宏
qA 追加录制宏
控制寄存器内容其实就是控制宏
宏还有一些特性
可以多文件执行宏
可以并发运行宏
可以递归执行宏
宏是随录随用的的
我想把一些东西固定下来,让他到时候不用定义就能执行
可以么?🤔
下次再说!
[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (https://gitee.com/overmind1980/oeasyvim)
[蓝桥实验楼 邀请码FJWYIMGB] (https://www.lanqiao.cn/courses/2840)