内容提要
作者为 Ghostty 开发了 Alfred workflow:gt 可检索所有分屏,按标题、目录、进程、tty 等模糊匹配,回车跳转、⌃回车复制路径;go 可在指定目录新开 Tab 或窗口。文章记录了利用 Ghostty 1.4 的 AppleScript 字典实现跳转,以及配置键名、目录参数、换行与僵尸进程等踩坑,并介绍了测试与自动发布。
延伸解读
为什么按分屏而不是按 Tab 检索
作者把检索单位定为分屏,因为每个分屏通常跑着独立任务,按分屏枚举才能精确到具体窗格;普通 Tab 只有一个分屏,自然退化为 Tab 项。跳转时同时完成窗口置前、选中 Tab、聚焦分屏,切 Tab 和切分屏变成同一个动作,减少了多任务下的上下文切换成本。
配置键名与 AppleScript 类型是主要坑点
文中两个典型问题都出在胶水层:Alfred 的可选参数配置键被误写成近似名,导致输入空格时列表清空;给 go 传工作目录时,AppleScript 报类型错误,JXA 则静默忽略,最终发现 record 属性需要四字符代码。作者的经验是,不确定的配置键名应参考成熟项目,胶水层管道要自己验证。
测试与发布如何绕开 Alfred 的限制
Alfred 没有官方测试设施,作者把调用契约模拟出来,用一条 make test 覆盖 plist 连线、脚本输出 JSON 规范和真连 Ghostty 的集成测试。集成测试在临时目录自建 Tab 中运行,不碰真实分屏;清理时需按目录反查 shell 进程并 SIGKILL,因为交互式 zsh 无视 SIGTERM。发布由 tag 驱动 GitHub Actions 自动完成。
Q&A
Ghostty 1.4 的 AppleScript 字典能做什么?
Ghostty 1.4.0 自带完整的 AppleScript 字典,可通过 sdef 命令导出。字典层级为 application → windows → tabs → terminals,对应窗口、Tab、分屏三层。分屏(surface)有 working directory(完整路径)、pid(反查前台进程)、tty(唯一标识)等属性,跳转命令包括 activate window、select tab、focus。
alfred-ghostty 的 gt 和 go 分别怎么用?
gt 用于检索所有分屏:按标题、目录、进程、tty 等模糊匹配,回车跳转到对应分屏,⌃回车复制完整路径。go 用于在指定目录新开 Tab 或窗口:不带参数时打开 Finder 当前目录(无 Finder 则个人目录),带路径则目录补全、Tab 逐级下钻,回车开新 Tab,⌘回车开新窗口,Ghostty 未运行则冷启动。
为什么选择按分屏而不是按 Tab 来枚举列表?
因为分屏里跑的都是独立任务,检索粒度就应该是分屏;普通 Tab 只有一个分屏,自然退化成“Tab 项”。这样切换 Tab 和切换分屏成为同一个动作,跳转时执行窗口置前、选中 Tab、聚焦分屏三连。
开发过程中遇到了哪些坑?
主要三个坑:1) Alfred 配置键名写错(argumenttreatemptyqueryasnil 误写为 asnone),导致空格过渡时列表清空;2) 传工作目录给 AppleScript 报类型错误,JXA 静默忽略,需用四字符代码 {«class GScD»:"/path"};3) JXA 的 doShellScript 将换行转为 \r,且进程死后返回 pid=0 的僵尸分屏,需统一归一换行并按 ps 判活过滤。
如何测试和发布这个 Alfred workflow?
测试方面,模拟 Alfred 调用契约,用 make test 分三层:plist 连线契约、脚本输出的 JSON 规范、真连 Ghostty 的动作集成。集成测试在临时目录自建 Tab 中运行,清理时用 lsof 反查 shell 进程再 SIGKILL。发布用 tag 驱动的 GitHub Actions:推 v* 标签自动完成版本互验、测试、打包和挂 Release。
这个 workflow 在哪里下载和安装?
项目放在 GitHub 的 alfred-ghostty 仓库,在 Release 中下载 .alfredworkflow 文件双击导入即可。首次使用时需允许 Alfred 控制 Ghostty。