OSC 133 — 语义化提示符标记(FinalTerm A / B / C / D)
标注提示符开始 / 命令开始 / 输出开始 / 命令结束,让终端能在提示符之间跳转、折叠输出、装饰退出码。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b]133;A\x07 (prompt start) \x1b]133;B\x07 (command start) \x1b]133;C\x07 (output start) \x1b]133;D;<exit>\x07 (command end)\033]133;A\007 / \033]133;B\007 / \033]133;C\007 / \033]133;D;0\007\e]133;A\a / \e]133;B\a / \e]133;C\a / \e]133;D;0\aESC ] 133 ; A BEL etc.1b 5d 31 33 33 3b 41 07 / ...3b 42 07 / ...3b 43 07 / ...3b 44 ... 07说明
FinalTerm 定义的 **shell 集成**协议,现已被 Kitty、WezTerm、Ghostty、iTerm2、Warp、VS Code 终端、(部分)Windows Terminal 广泛采用。四个标记码把一个 shell 会话切成结构化块: - **`OSC 133 ; A ST`** —— 提示符开始(`PS1` 渲染前发送)。 - **`OSC 133 ; B ST`** —— 命令开始(提示符与用户输入之间)。 - **`OSC 133 ; C ST`** —— 输出开始(按 Enter 后,命令 stdout / stderr 开始之前)。 - **`OSC 133 ; D [ ; <退出码> ] ST`** —— 命令结束(命令退出后,可选的数字退出码)。 终端把它们转成 UX:**跳到上 / 下一个提示符**(kitty `kitten select-prompt`、iTerm2 ⌘↑/⌘↓、WezTerm `ActivateCommandPalette`);**折叠某条命令的输出**(iTerm2、WezTerm);**在提示符行内装饰退出码**(红三角 / 绿勾 —— kitty、iTerm2、Ghostty);**按一条命令滚屏**而不是按一屏滚屏。多数现代 shell 集成插件(`atuin`、`starship` 的包装层、kitty / wezterm / iTerm2 自带的 bash/zsh 钩子)自动注入这些标记 —— `__prompt_command` 发 A,`PS1` 结尾发 B,`DEBUG` / `preexec` 钩子发 C,`precmd` 用 `$?` 发 D。常见子参数:`aid=<unique>`(Warp / kitty 用于区分并发 shell)、`A` 上的 `cl=m`(「多行提示符」提示)、`B` 上的 `k=i` / `k=r`(输入 vs 续行)。协议为加入式 —— 对不识别的终端发出后字节被丢弃;可无条件发送。
规范出处: FinalTerm Semantic Prompts / xterm-ctlseqs (OSC 133)
参数
| A / B / C / D | 标记类型:A 提示符开始、B 命令开始、C 输出开始、D 命令结束。每个划出终端可导航的结构边界。 |
| exit-code | `D;` 后可选整数 —— 刚结束命令的 `$?`。用于在提示符行装饰成功 / 失败标识。 |
示例
# zsh/bash shell-integration sketch (real impls handle PS1 specially):\nPS1='\[\e]133;A\a\]\u@\h \W $ \[\e]133;B\a\]'\npreexec() { printf '\033]133;C\007'; }\nprecmd() { printf '\033]133;D;%d\007' "$?"; }# Manually frame a command exec inside a Python REPL:\nimport sys, subprocess\nsys.stdout.write('\x1b]133;C\x07') # output starts\nrc = subprocess.run(['ls']).returncode\nsys.stdout.write(f'\x1b]133;D;{rc}\x07') # command ends with exit codefmt.Print("\x1b]133;A\x07") // before prompt\nfmt.Print("$ \x1b]133;B\x07") // command waiting\n// … run command, capture rc …\nfmt.Printf("\x1b]133;D;%d\x07", rc)// Node REPL wrapping a child:\nprocess.stdout.write('\x1b]133;C\x07')\nconst child = spawn('npm', ['test'])\nchild.on('close', code => process.stdout.write(`\x1b]133;D;${code}\x07`))printf("\x1b]133;A\x07"); /* prompt-start */\nprintf("%s$ ", cwd);\nprintf("\x1b]133;B\x07"); /* command-start */\n/* … fork+exec, wait … */\nprintf("\x1b]133;D;%d\x07", WEXITSTATUS(status));终端支持
- xterm
- 不支持
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 不支持
- iTerm2
- 支持
- Windows Terminal
- 部分
- cmd.exe / ConPTY
- 不支持
- kitty
- 支持
- alacritty
- 不支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 部分
- Konsole
- 部分
- tmux
- 不支持
- GNU screen
- 不支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 不支持 | 不支持 | 不支持 | 支持 | 部分 | 不支持 | 支持 | 不支持 | 支持 | 支持 | 部分 | 部分 | 不支持 | 不支持 |
相关序列
在家族食谱中
OSC 食谱 · 5. Shell 提示符标记 —— `OSC 133`(FinalTerm A / B / C / D)