图片来自 Unsplash
起因
我每次开始写代码,都要做同样一套动作:开终端、分屏、左边跑 AI 编程助手、右上角开文件管理、右下角开 Git。重复了几十次之后我想——这不就该是一条命令的事吗?
于是我给 AI 写了一段提示词,让它帮我实现:在 Ghostty 终端里输入 p3,自动展开三分屏布局,直接进入 coding 状态。
我给 AI 的提示词
Ghostty AppleScript 启动脚本 `/Users/nic/root-scripts/ghostty-3pane.applescript`,
并在 `~/.zshrc` 添加 `p3` alias。
要求:
- 运行 p3 时生成 3 pane 布局:左 1 个,右上 1 个,右下 1 个
- Ghostty 没开时才新建窗口
- Ghostty 已开时,直接在当前窗口当前 tab 当前焦点 pane 上分屏
- 不要出现"额外新开一个窗口,然后新窗口里才有三分屏"的 bug
- 左 pane 跑 codex --yolo
- 右上跑 yazi
- 右下跑 lazygit
- 注意 Ghostty 通过 AppleScript 启动命令时 PATH 可能不完整,
不能依赖交互式 zsh 环境
- 必须避免 yazi: not found 和 lazygit: not found,优先使用绝对路径
- 最后验证 alias 生效,并用 osacompile 验证脚本语法一段不算短的 prompt,但每一条都是踩过的坑。如果只写"帮我做个三分屏脚本",AI 大概率会忽略 PATH 问题,产出一个本地跑不起来的版本。
为什么要写这么细
几个关键约束值得展开说:
“Ghostty 已开时,直接在当前窗口分屏” —— 不加这条,AppleScript 默认行为是先 activate 再 new window,结果你会看到屏幕上突然多出一个空窗口,三分屏在新窗口里,原来的窗口还杵在那里。
“PATH 可能不完整” —— AppleScript 通过 osascript 执行时,走的是 /usr/bin/env 提供的精简 PATH,不会 source 你的 .zshrc。所以 yazi、lazygit、codex 这些通过 Homebrew 或 Volta 装的工具,必须写绝对路径,否则一定报 command not found。
“用 osacompile 验证” —— AppleScript 的语法错误只有在编译时才能暴露,让 AI 在产出后自行验证,免得拿到一个语法都过不了的脚本。
AI 产出了什么
最终生成了一个约 90 行的 AppleScript。核心逻辑很直白:
-- 判断 Ghostty 是否已经在跑
set ghosttyWasRunning to application "Ghostty" is running
tell application "Ghostty"
if ghosttyWasRunning then
-- 已开:在当前 tab 的焦点 pane 上分屏
set baseTerminal to focused terminal of selected tab of front window
else
-- 没开:新建窗口,左 pane 跑 codex
set targetWindow to new window with configuration codexConfig
set baseTerminal to focused terminal of selected tab of targetWindow
end if
-- 右边分出 yazi
set rightTop to split baseTerminal direction right with configuration yaziConfig
-- 右边再往下分出 lazygit
split rightTop direction down with configuration lazygitConfig
-- 焦点回到左 pane
focus baseTerminal
end tell每个 pane 的命令都用绝对路径拼接,并通过 environment variables 手动注入完整 PATH:
property yaziBinaryPath : "/opt/homebrew/bin/yazi"
property lazygitBinaryPath : "/opt/homebrew/bin/lazygit"
property ghosttyPathEnv : "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:...".zshrc 里只需要一行 alias:
alias p3='osascript /Users/nic/root-scripts/ghostty-3pane.applescript "$PWD"'传入 $PWD 是为了让三个 pane 都在当前目录启动——在项目根目录下敲 p3,yazi 和 lazygit 自然打开的就是这个项目。
最终效果
打开终端,cd 到任何一个项目目录,输入 p3,一秒之内屏幕变成:
┌──────────────┬──────────────┐
│ │ yazi │
│ codex │ (文件管理) │
│ --yolo ├──────────────┤
│ │ lazygit │
│ (AI 助手) │ (Git 操作) │
└──────────────┴──────────────┘焦点默认落在左边的 codex 上,可以直接开始对话。需要翻文件就切到右上,需要提交就切到右下。
这件事的感想
整个过程从写 prompt 到脚本跑通,大概十几分钟。如果自己从零写 AppleScript,光查 Ghostty 的 AppleScript API 就要半小时——它没什么文档,得靠 sdef 导出字典慢慢猜。
但 prompt 写得好不好,决定了这十几分钟是一轮过还是来回改五轮。把约束想清楚再动手,比事后 debug 划算得多。 这个道理写代码时成立,写 prompt 时同样成立。
对我来说,AI 最实用的场景不是写业务逻辑,而是这类粘合性质的自动化脚本——你知道自己要什么,只是不想花时间查某个生僻 API 的语法。把需求描述准确,让 AI 去做翻译。