ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用 VHS 编写 `.tape` 脚本:为 gws(Google Workspace CLI)制作终端演示 GIF/MP4 的完整指南

2026/9/19 18:32:23 拓冰建站 浏览量
使用 VHS 编写 `.tape` 脚本:为 gws(Google Workspace CLI)制作终端演示 GIF/MP4 的完整指南 使用 VHS 编写.tape脚本为 gwsGoogle Workspace CLI制作终端演示 GIF/MP4 的完整指南【免费下载链接】cliGoogle Workspace CLI — one command-line tool for Drive, Gmail, Calendar, Sheets, Docs, Chat, Admin, and more. Dynamically built from Google Discovery Service. Includes AI agent skills.项目地址: https://gitcode.com/gh_mirrors/cli413/cliVHS 是 Charmbracelet 出品的终端录屏工具它通过读取.tape脚本文件把终端会话录制为 GIF、MP4 或 WebM。本指南以 gwsGoogle Workspace CLI仓库的演示录制实践为核心讲解.tape文件的语法规则、引号陷阱、录制参数与常见命令并结合 docs/demo.tape 这一真实工程示例让读者既能学会编写可复现的终端演示脚本也能掌握本仓库场景化 隐藏 setup的录屏编排方法论。为什么用脚本录制终端演示终端演示Demo是开源项目 README、发布公告和功能宣传中最直观的表达方式但手工录屏存在几个痛点手速不稳定、容易打错字、难以重录、无法版本化。VHS 用.tape文本脚本解决了这些问题——录制内容是一份可提交进 Git 仓库的普通文本文件任何改动都能走 code review任何机器都能重放。在 gws 仓库中演示录制是开发流程的一等公民AGENTS.md 明确说明Demo recordings are generated with VHS (.tapefiles)并给出运行命令vhs docs/demo.tape仓库根目录存放着最终产物 demo.gif由 docs/demo.tape 生成仓库提供 npm 包googleworkspace/cli发布流程与录制脚本相互独立docs/demo.tape只负责展示 CLI 能力不参与构建。基本使用方式只需一条命令vhs docs/demo.tapeVHS 会按脚本从上到下逐条执行指令最终在Output指定的路径产出录屏文件。关键语法规则指令分隔与引号闭合.tape脚本最容易出错的地方不是命令本身而是一行里同时出现多个指令时的解析规则。Type、Sleep、Enter 是同一行上的独立指令Type、Sleep、Enter是同一行内用空格分隔的独立指令Type字符串的右引号是它们之间的分界符。最常见的 bug 是忘记闭合Type字符串导致Sleep/Enter被当成字面文本敲进终端# ✅ CORRECT — closing before Sleep Type echo hello Sleep 300ms Enter # ❌ WRONG — Sleep and Enter are typed as literal text Type echo hello Sleep 300ms Enter检查每一条Type行时务必确认只要该行后面还跟着Sleep或Enter字符串必须先闭合引号。用Typetime覆盖单条命令的打字速度TypingSpeed设置的是全局打字速度但有时需要在某一条命令上放慢例如 JSON 参数想让观众看清或加快。VHS 支持在Type后紧跟加时间中间不能有空格Type80ms {pageSize: 2} Sleep 100ms这条指令以每字符 80ms 的速度敲入{pageSize: 2}。仓库的 docs/demo.tape 中就有实战用例——在演示自动分页时用Type30ms慢速敲入 JSON 参数制造观众能看清关键载荷的节奏Type gws drive files list Type --params Sleep 50ms Type30ms {pageSize:2,fields:nextPageToken,files(id)} Sleep 50ms Type Type --page-all Type | jq -r .files[]?.id Enter Sleep 6s引号的三条规则双引号...是Type的标准分隔符单引号...同样可用当敲入的内容本身含双引号如 JSON时优先使用单引号避免转义地狱反引号用于在双引号字符串内部转义引号Type VARvalue。AGENTS.md 补充了一个重要限制VHS 不支持双引号Type字符串内的\转义强行使用会直接导致解析错误。因此当要敲入含双引号的 JSON 时正确姿势是整行改用反引号Type gws drive files list --params {pageSize:5} Enter嵌套引号把一条命令拆成多行 Type当构建包含多层嵌套引号的 shell 命令例如gws的--params要传 JSON、JSON 里又要写含双引号的fields表达式时不要试图一行写完而是拆成多段Type每段之间用Sleep制造打字节奏Type gws drive files list --params Sleep 100ms Type80ms {pageSize: 2, fields: nextPageToken,files(id)} Sleep 100ms Type --page-all Sleep 300ms EnterPitfall 总结凡是一行Type后面还跟着Sleep或Enter必须先把字符串闭合。逐行审计是编辑.tape文件的基本功。Settings文件顶部的录制参数Settings指令只能出现在文件顶部——任何非设置指令Output除外出现之前。唯一的例外是TypingSpeed它是唯一允许在脚本中途改动的设置。仓库 docs/demo.tape 顶部的实际配置如下Output docs/demo.mp4 Output docs/demo.gif Set Shell bash Set FontSize 18 Set Width 800 Set Height 500 Set TypingSpeed 1ms Set Padding 30 Set LineHeight 1.3与技能文档中的标准配置对比可以观察到两个值得注意的点设置项技能文档示例demo.tape 实际值说明Shellbashbash录制使用的 shellFontSize1418字号越大终端行数越少适合竖屏展示Width/Height1200/1200800/500横屏宽高比接近视频封面比例TypingSpeed40ms1msdemo 里几乎瞬间敲完靠Sleep控制节奏Padding2030画面内边距WindowBar/ThemeColorful/Catppuccin Mocha未设置默认主题与窗口栏样式可选配置注意 docs/demo.tape 使用了两条Output指令同时产出 MP4 和 GIF——这是一次录制、多格式分发的实用技巧可适配 README 内嵌与视频平台两种场景。一个完整的标准设置块长这样Output demo.gif Set Shell bash Set FontSize 14 Set Width 1200 Set Height 1200 Set Theme Catppuccin Mocha Set WindowBar Colorful Set WindowBarSize 40 Set TypingSpeed 40ms Set Padding 20常用命令速查命令示例说明OutputOutput demo.gif输出文件支持.gif、.mp4、.webm可多次指定TypeType ls -la逐字符敲入文本TypetimeType80ms slow覆盖该条指令的打字速度SleepSleep 2s、Sleep 300ms暂停录制等待命令输出或控制节奏EnterEnter回车Hide/ShowHide...Show隐藏/显示录制内容常用于跳过 setup 命令CtrlkeyCtrlC组合键Tab、Space、BackspaceTab 2可带重复次数Up、Down、Left、RightUp 3方向键可带次数WaitWait /pattern/等待屏幕出现匹配正则的内容ScreenshotScreenshot out.png截取当前帧为图片EnvEnv FOO bar设置环境变量SourceSource other.tape引入另一个 tape 文件RequireRequire jq断言外部程序存在不存在则报错Hide/Show把 setup 藏起来录屏时export PATH、创建测试数据、clear这类准备工作既冗长又不该出现在成片里。Hide之后的指令不进入画面直到Show恢复录制。技能文档给出的标准模式Hide Type export PATH$PWD/target/release:$PATH Enter Type clear Enter Sleep 2s Showdocs/demo.tape 把这个模式用到了极致开头一大段隐藏的 setup 里先 mock 一个gemini命令保证演示结果确定性再设置 PATH然后用真实的gws drive files create在 Google Drive 上创建一个gws-demo文件夹和三个演示文件最后clear后Show观众看到的直接是干净的演示起点Hide # Mock gemini CLI for deterministic demo Type function gemini() { echo Why do Java developers wear glasses? Because they dont C#.; } Enter Type export -f gemini Enter Type export PATH$PWD/target/release:$PWD/target/debug:$PATH Enter Type set -e Enter Sleep 1s Type DEMO$(gws drive files create --json {name:gws-demo,mimeType:application/vnd.google-apps.folder} | jq -r .id) Enter Sleep 3s Type gws drive files create --json {\name\:\meeting-notes.md\,\mimeType\:\text/markdown\,\parents\:[\$DEMO\]} /dev/null Enter Sleep 2s ... Type clear Enter Sleep 1s Show这段代码还示范了几个进阶技巧用function gemini()mock 外部 AI 命令让演示输出可预测deterministic demo用DEMO$(...) | jq -r .id把 API 返回值存进 shell 变量后续命令引用$DEMO每条真实 API 调用后都给了Sleep 2s~3s而纯本地操作clear只给Sleep 1s甚至500ms——这与技能文档检查清单第 3 条网络调用可能需要 8s 的等待的原则一致。场景化编排ASCII 标题卡与章节节奏一份好的 demo 不只是命令流水账而是有起承转合的剧本。gws 仓库的做法是用 ASCII art 标题卡切分章节art/ 目录下存放intro.txt、scene1.txtscene9.txt、outro.txt等标题卡scripts/show-art.sh负责清屏 打印#!/bin/bash clear cat $1每张标题卡都是一幅纯文本场景画例如 art/scene1.txt━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ WHAT IS GWS? ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ A single CLI for ALL Google Workspace APIs. Perfect for: AI agents Shell scripts ⚡ Power users Automation在 docs/demo.tape 中每个场景的编排套路是固定的Hide→Type ./scripts/show-art.sh art/sceneN.txt Enter→Sleep 1s→Show→Sleep 1s→ 敲入该场景要演示的真实命令 → 等待输出。例如 Scene 4 展示按文件夹查询文件列表Type gws drive files list Type --params {\q\:\$Q\,\fields\:\files(name,mimeType)\} Enter Sleep 3sScene 6 展示 Gmail 发信base64 编码 raw 消息 jq美化输出Scene 8 展示 Sheets 追加数据--params传spreadsheetId/range/valueInputOption--json传valuesScene 9 展示自动分页--page-all。整个脚本从 intro 到 outro 共 9 个场景最后隐藏执行清理删除演示文件夹形成完整闭环。该--page-all自动分页能力对应 gws 的--page-all全局参数与 crates/google-workspace-cli/src 中的分页处理逻辑配套录制脚本直接以真实 CLI 行为作为演示内容保证了所见即所得。编辑 Tape 文件的自检清单技能文档给出的五条检查项是每个.tape文件提交前的必备体检每条Type字符串必须闭合——在Sleep/Enter出现在同一行之前多行 Type 拼接的 shell 命令——确保最后一行闭合字符串且包含EnterSleep 时长要够命令执行完——网络调用可能需要 8sSettings 放在顶部——只有TypingSpeed可以出现在后面提交前本地测试——运行vhs file.tape完整重放一遍。对照 docs/demo.tape 可以再加三条仓库级经验单行命令更可靠脚本开头注释写着 Single line commands for reliability——需要多行拼接时尽量用Type分段 反引号包裹 JSON而不是依赖 shell 续行符注释即剧本用# ╔═...╗这类分隔注释标注章节边界让脚本本身可读、可评审善用 /dev/nullsetup 阶段的创建命令输出会干扰画面重定向掉只保留正式演示的输出。何时使用、何时放弃.tape脚本适合README 功能演示、PR 行为验证、发布公告视频、需要可评审 可重放的录屏。但它也有适用边界高度交互式的 TUI 操作如 gws 的 setup_tui.rs 这类需要光标定位的界面录制难度较高画面比例需要按目标平台规划横屏适合 README竖屏适合短视频录制依赖真实网络时如本 demo 中的 Drive/Gmail/Calendar API 调用需要提前准备好凭据与测试数据并给足Sleep时间。对于 gws 这样的命令行项目vhs docs/demo.tape一行命令即可复现整条演示链路从.tape脚本 → VHS 解析执行 →docs/demo.gif与docs/demo.mp4双格式产物。掌握本文的语法规则与场景编排方法后你完全可以把这套脚本化录屏流程复制到自己的项目中。【免费下载链接】cliGoogle Workspace CLI — one command-line tool for Drive, Gmail, Calendar, Sheets, Docs, Chat, Admin, and more. Dynamically built from Google Discovery Service. Includes AI agent skills.项目地址: https://gitcode.com/gh_mirrors/cli413/cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考