用途
gpui-screenshots 用于查看、点击操作和截图 GPUI 客户端(crates/but-gpui),典型场景包括验证 UI 改动是否生效、复现 UI 缺陷、展示交互效果。脚本化运行时窗口不显示,应用不进入 Dock,不抢用户按键,并使用独立的应用数据,因此不会影响用户自己的项目或设置。以其他方式启动应用则会在用户屏幕上打开窗口。
主要能力
- 脚本驱动:
crates/but-gpui/scripts/drive.sh以--features dev-script构建并运行客户端,支持一行一条命令的脚本,如add(添加仓库)、wait(等待加载)、shot(截图)、click(按窗口坐标点击)、key(按键)、type(输入)等,完整命令列表见src/dev.rs。 - 单步探索:通过
drive.sh start、step、stop逐条执行命令,每步保存截图并打印路径(位于target/gpui-drive/shots)及 KEYS 行,便于从屏幕上推断下一步点击位置。 - 动画录制:
clock stop可暂停脚本时钟,film在指定区域按毫秒间隔逐帧保存截图(如before.png、000.png、001.png),并生成sheet.png网格总览;每帧附带变化说明,列出变化像素簇的位置、尺寸、像素数与最大通道变化量。可区分起始跳变、中途停滞、结束突变与闪烁。 - 区域截图:
shot path x y w h按逻辑坐标截取区域,并以显示器全分辨率保存(Retina Mac 为 2×)。 - 主题与性能:可通过
GITBUTLER_GPUI_APPEARANCE=dark(或light)选择主题;run --release以优化构建运行,用于性能与保持时长测试。
使用方式
- 准备一个一次性仓库,不要添加当前工作检出或用户的任何仓库(应用会写入工作区、refs、oplog):
repo=$(mktemp -d)/repo
git init -q -b main "$repo"
git -C "$repo" -c user.name=Tester -c user.email=t@example.com commit -q --allow-empty -m "Initial commit"
echo hello > "$repo/notes.txt"
也可在此用 git 或后续 sh 步骤构建所需状态(分支、提交、未提交修改)。如需使用真实仓库,可按 crates/but-gpui/AGENTS.md(Sandboxes and fixtures)使用 APFS 克隆。
2. 编写脚本并运行:
add /path/to/repo
wait 1000
shot /tmp/before.png
click 400 184
key cmd-k
type history
shot /tmp/after.png
crates/but-gpui/scripts/drive.sh run script.txt
脚本结束即退出,超过 --timeout 秒(默认 300)会被终止。运行会打印应用报告(失败步骤为 script line N: …,提示为 PROMPT …,以及警告和错误)和应用数据、日志位置。
3. 单步探索:
crates/but-gpui/scripts/drive.sh start
crates/but-gpui/scripts/drive.sh step "add /path/to/repo" "wait 1000"
crates/but-gpui/scripts/drive.sh step "click 400 184" "key down"
crates/but-gpui/scripts/drive.sh stop
会话超过 --timeout 秒(默认 1800)自动退出,完成后应始终 stop。每个检出只能有一个会话。
4. 动画录制示例:
film /tmp/fold 200 8 0 40 340 540 -- click 306 66
该命令停止时钟,保存输入前帧为 before.png,执行输入,并按 8ms 间隔保存 200ms 内该区域的帧,然后恢复时钟。输入须为一行脚本。拖拽需在 film 前先按下并做至少两次小幅移动,触发运动的移动放在 -- 之后;GPUI 在第一次移动开始拖拽、从下一次移动才开始发送,因此帧数过少时 000 帧显示的是拖拽建立而非运动本身。
按键与坐标注意
- 执行
add后导航器(Navigator)持有按键焦点,输入前应先点击目标文本框。type或单字母按键前先查看 KEYS 行(如KEYS Workspace > Navigator > TextInput),确认键入到达的位置;在列表或 diff 中字母会触发快捷键(如 b 创建分支、⇧P 推送、e 在用户屏幕上打开编辑器)。 - 窗口逻辑尺寸为 1360×860,
click、move、drag、scroll均使用该坐标;截图也按此尺寸保存,屏幕上的位置即点击位置。区域截图坐标为区域原点加上像素偏移的一半。
适用场景
验证 GPUI 界面改动、复现界面缺陷、展示交互效果、逐帧分析折叠与滑动等动画表现。
限制与注意事项
- 需要
cargo在 PATH 中;否则需在仓库开发环境中运行:nix develop --command crates/but-gpui/scripts/drive.sh …(run和start需要构建,step和stop不需要)。 - 窗口从不成为 key window,因此
on_focus与on_blur监听不会触发,光标不闪烁,这些需手动检查。 - 复制操作会写入真实剪贴板,设置 › AI 会读取钥匙串;
add使用添加项目的文件夹选择器,会在用户屏幕上打开。 - 动画必须读取
crate::clock::now()而非Instant::now(),否则会在真实时间上运行而其余部分静止;GPUI 自身的with_animation、with_spring、折叠箭头与加载指示器,以及计时器(如工具提示延迟、拖拽边缘滚动)使用真实时间,会在帧间跳变,因此录制的拖拽应远离列表上下边缘。不要通过拉长代码中的时长来观察慢动作。 - 更多细节(悬停需第二次小幅移动、文本链接需按下再释放、提示需点击按钮、拖拽专用命令等)见
crates/but-gpui/AGENTS.md的 Scripted runs 章节;性能与保持时长测量见同文件的 Measuring performance 章节。