惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
I
InfoQ
B
Blog RSS Feed
D
DataBreaches.Net
S
SegmentFault 最新的问题
P
Proofpoint News Feed
A
About on SuperTechFans
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
小众软件
小众软件
博客园 - Franky
有赞技术团队
有赞技术团队
D
Docker
T
Tailwind CSS Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
V
Visual Studio Blog
宝玉的分享
宝玉的分享
爱范儿
爱范儿

博客园 - 水车

踩坑记录:Keyboard Maestro 截取 Chrome 浏览器窗口报错的终极避坑方案 Riverpod3 注解方式写api 请求的provider在其他地方调用方式 2026 避坑首选:用专属域名发邮件的极致方案(Gmail + Cloudflare + Resend) Keyboard Maestro 逻辑控制深度指南:If Then Else 与多模态条件 深度解析 Keyboard Maestro 变量系统:从全局持久化到局部作用域 零门槛打造 4K 家庭影院:Mac mini M4 + 小米电视 + Jellyfin + Tailscale 全攻略 出墙记录 Mac 电脑用终端格式化移动硬盘/内存卡教程 IDEA中,如何切换Gemini Code Assist 登录的账号 Mac、Windows电脑怎么安装Java|JDK环境安装 Mac电脑设置chrome浏览器语言为英文办法 Mac 电脑安装Ruby新版本 Mac电脑:FVM4.x版本 安装教程 AWS S3服务,将当前桶设置成公开访问教程 Keyboard Maestro Tokens 使用方法 Chrome 下载文件时总是提示“已阻止不安全的下载”的解决方案 gin框架在BindJSON解析参数时,遇到错误直接返回400状态码的坑 Mac电脑下,关于Redis的一些使用记录 Mac电脑 docker 修改镜像源 ubuntu24 安装 caddy Ubuntu 24.04安装MySQL,并且配置外网访问
Keyboard Maestro 进阶指南:如何像写代码一样调用宏(Macro)
水车 · 2026-02-28 · via 博客园 - 水车

在 Keyboard Maestro (KM) 的世界里,随着自动化逻辑的复杂化,如果你把所有 Action 都堆在一个宏里,那简直是维护噩梦。作为程序员,我们需要“函数化”。

虽然官方的 Execute a Macro 动作非常基础,但通过以下两种方案,我们可以完美实现参数传递与结果返回。


方案一:正统函数式 —— Subroutines (推荐)

KM 10+ 引入的 Subroutine(子程序) 是最接近现代编程语言“函数调用”的实现方式。它支持显式参数定义和返回值。

1. 定义子宏 (The Function)

  • 添加 Trigger:在子宏的触发器列表中选择 Subroutine Trigger
  • 定义形参:在 Trigger 界面点击 + 号,定义变量名(例如 local_Path)。KM 会自动将其设为局部变量。
  • 执行返回:在子宏逻辑结束处,添加 Return to Subroutine 动作,填入你想返回的结果(字符串、变量或计算结果)。
    image

2. 调用子宏 (The Call)

  • 动作选择:在主宏中使用 Execute a Subroutine 动作(注意:不是 Execute a Macro)。
  • 传参:KM 会根据子宏的定义,自动在 UI 上生成对应的输入框。
  • 接收返回:在动作底部的 store return value in variable 下拉框中,指定一个变量来接收结果。
    image

优点:强类型感、参数清晰、原生支持返回值,是模块化开发的首选。


方案二:上下文共享法 —— Instance Variables

如果你需要传递大量结构化数据(如整个 JSON),或者在复杂的异步调用链中传递上下文,利用 Instance 变量 的作用域特性是最灵活的方案。

1. 原理:利用实例作用域

在 KM 中,以 Instance__ 开头的变量在整个“调用链”中是共享的。如果宏 A 调用了宏 B,宏 B 可以直接读写宏 A 创建的 Instance 变量。

2. 实现流程

  • 主宏 (Caller)
    1. Set Variable "Instance__InputData" to "SomeValue"
    2. 执行 Execute a Macro "Your_Sub_Macro"
  • 子宏 (Callee)
    1. 直接使用变量 %Variable%Instance__InputData% 进行逻辑处理。
    2. 处理完成后,修改 Set Variable "Instance__Result" to "Success"
  • 主宏 (Caller)
    1. 在调用动作之后,直接读取 %Variable%Instance__Result%

优点:支持多参数传递(不需要拆分字符串)、支持双向数据同步、对 Execute a Macro 动作完全通用。


总结:该选哪一个?

维度 方案一:Subroutine 方案二:Instance Variables
可读性 极高,像调用 API 一般,依赖命名约定
返回值 原生支持 需手动约定变量名
参数数量 显式定义,数量固定 无限制,随调随用
适用场景 通用工具类函数、逻辑计算 复杂上下文传递、多参数重型任务

程序员建议:优先使用 Subroutine,因为它能让你的宏结构清晰可见;只有当 Subroutine 的参数界面变得过于臃肿,或者需要跨多级异步调用时,再考虑使用 Instance 变量