Vim 宏macro的进阶详解

回忆

建立环境

  • vi oeasy.txt
  • 插入一下内容
    • a. oeasy
    • b. o2z
    • c. o3z
    • d. o9z

图片描述

录制新宏

  • qa0W~hjq

    • qa 在a寄存器里面开始录制
    • 0 到行头
    • W 跳一个大词
    • ~ 改变当前光标位置字符的大小写
    • j 向下一行
    • q 停止录制
  • 查看宏

    • :reg a

应用宏

  • 正常模式下直接命令的方式
    • @a
      • 应用到当前行
    • 99@a
      • 应用99行
  • u回来
  • 用命令行的方式
    • :normal @a
      • 切换到normal模式并对当前行执行@a
    • :2,4 normal @a
      • 切换模式并对2-4行执行@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.txto3z.txt
    • :!cp oeasy.txt o2z.txt
    • :!cp oeasy.txt o3z.txt
  • 批量执行
    • :arga *.txt
      • 添加当前文件夹下的所有txt文档
    • :args
      • 列出所有参数
    • :argdo g/.*/normal @a
      • 对于args中的每个文件中的每一行执行a这个宏
      • g global全局执行
      • 匹配任何字符匹配每一行.*
      • 如果是o.*对应的是以o开头的每一行
      • normal @a 正常模式下执行@a
    • :argdo w
      • 保存所有文件修改

快速执行

  • @@
    • 执行上一条宏
  • :2,5@
    • 第2-5行执行上一条宏

递归执行宏

  • 文件还是这样的oeasy.txt

    • a. oeasy
    • b. o2z
    • c. o3z
    • d. o9z
  • qaqqa0W~j@aq

    • qaq
      • 把a宏清空
    • qa
      • 开始录制a
    • 0
      • 到第一列
    • W
      • 跳大词
    • ~
      • 改变大小写
    • j
      • 往下跳一行
    • @a
      • 执行宏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

    • qa
      • 开始录制宏a
    • 0
      • 到第1列
    • f{
      • 跳到{
    • gui{
      • 把{}里面的内容小写
    • j
      • 往下一行
    • q 停止录制
  • 运行宏

    • 99@a
    • 会卡到第4行
    • 因为找不到{
  • 这个时候可以并发执行

    • :1,$ normal @a
    • 从第1行到最后一行每一行都在normal模式下执行@a

总结

  • 关于宏,我们回忆一下
    • qa 开始录制宏
    • q 结束录制宏
    • @a 应用宏
    • qA 追加录制宏
    • 控制寄存器内容其实就是控制宏
  • 宏还有一些特性
    • 可以多文件执行宏
    • 可以并发运行宏
    • 可以递归执行宏
  • 宏是随录随用的的
  • 我想把一些东西固定下来,让他到时候不用定义就能执行
  • 可以么?🤔
  • 下次再说!

教程来源于Github,感谢overmind1980大佬的无私奉献,致敬!

技术教程推荐

如何设计一个秒杀系统 -〔许令波〕

编辑训练营 -〔总编室〕

分布式协议与算法实战 -〔韩健〕

高楼的性能工程实战课 -〔高楼〕

如何成为学习高手 -〔高冷冷〕

程序员的测试课 -〔郑晔〕

eBPF核心技术与实战 -〔倪朋飞〕

手把手带你搭建推荐系统 -〔黄鸿波〕

AI大模型企业应用实战 -〔蔡超〕