一个 alias 进入写代码状态

用 AI 写了一段 AppleScript,让 Ghostty 终端输入 p3 就展开三分屏 coding 布局。

终端界面

图片来自 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 默认行为是先 activatenew window,结果你会看到屏幕上突然多出一个空窗口,三分屏在新窗口里,原来的窗口还杵在那里。

“PATH 可能不完整” —— AppleScript 通过 osascript 执行时,走的是 /usr/bin/env 提供的精简 PATH,不会 source 你的 .zshrc。所以 yazilazygitcodex 这些通过 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 去做翻译。

Continue Reading