跳到主要内容
ansicode

OSC 133 — 语义化提示符标记(FinalTerm A / B / C / D)

标注提示符开始 / 命令开始 / 输出开始 / 命令结束,让终端能在提示符之间跳转、折叠输出、装饰退出码。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\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[\033]133;A\007 / \033]133;B\007 / \033]133;C\007 / \033]133;D;0\007
\\e[\e]133;A\a / \e]133;B\a / \e]133;C\a / \e]133;D;0\a
ESC [ESC ] 133 ; A BEL etc.
hex1b 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;` 后可选整数 —— 刚结束命令的 `$?`。用于在提示符行装饰成功 / 失败标识。

示例

bash
# 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' "$?"; }
python
# 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 code
go
fmt.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)
javascript
// 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`))
c
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
不支持

相关序列

在家族食谱中

OSC 食谱 · 5. Shell 提示符标记 —— `OSC 133`(FinalTerm A / B / C / D)