跳到主要内容
ansicode
OSC(终端控制)

OSC 转义码 —— 窗口标题、超链接、调色板

Operating System Command。`ESC ] n ; payload BEL`(或以 `ESC \` 结尾)家族 —— 窗口 / 图标标题、OSC 8 超链接协议、动态颜色查询、调色板覆盖、工作目录上报。让终端能与模拟器自身通信、配置自身的协议层。

20 条序列

OSC 食谱 —— 用六道菜驱动终端外壳

OSC 比 CSI 再外一层 —— 它不在网格里画字形,而是驱动终端外壳的方方面面:窗口标题、超链接、调色板本身、shell 集成标记、内联图片、进度条。下面六步:信封语法、作为标准示例的窗口/标签标题、OSC 8 超链接协议、调色板覆盖、把字节流切成结构化块的 FinalTerm OSC 133 提示符标记,以及把状态推到宿主 OS 任务栏的 OSC 1337 + OSC 9;4。

  1. 1. 信封 —— \x1b] …… \x07\x1b\\

    每条 OSC 序列都是 \x1b](ESC ])起头,跟一个数字 Ps08133 等),再跟 ; 分隔的载荷,最后是结束符。两个结束符都合法:\x07(BEL —— xterm 的事实标准,单字节)以及 \x1b\\(ST —— ECMA-48 规范标准,两字节,写法是 ESC \)。现代终端两种都吃;一次性 shell printf 用 BEL,把 OSC 嵌进 DCS 或 tmux 透传时用 ST(那种场景里 BEL 会被外层解释成别的)。还有个 8-bit C1 形式 \x9d … \x9c,老 VT 手册里能见到,实战里基本绝迹。**结束符务必写全** —— 漏掉 BEL/ST 会让解析器一直挂起,直到下个恰好是结束符的字节,于是你输出里下一个意外的 ^G 就把这条 OSC 关掉、把后面全部当作正文。

  2. 2. 窗口与标签标题 —— OSC 0 / 1 / 2

    OSC 最经典的形式:\x1b]0;TITLE\x07 同时设置窗口标题栏和图标名(Windows 下任务栏文本、macOS 下 Dock 图标悬停文字)。两个子码可以拆开:OSC 1 只改图标名,OSC 2 只改窗口标题 —— 想让窗口标题一直钉在项目名而图标闪一个状态时正好用。最常见的 shell 用法是绑到 PROMPT_COMMAND / precmd 上:printf '\033]0;%s — %s\007' "$USER@$HOST" "$(basename "$PWD")",让每次提示符重画时标题随当前目录刷新。在 tmux / screen 里要套上 \ePtmux;\e DCS 包装层,否则内层 OSC 出不到外层终端 —— tmux 的 set-option -g set-titles on 会自动包装。除裸 Linux console 外(没有外壳可设)所有终端都支持。

  3. 4. 调色板覆盖 —— OSC 4 / 10 / 11 / 104

    四个码让你重画调色板本身而不是从中挑色。\x1b]4;n;rgb:RR/GG/BB\x1b\\ 把 xterm 256 调色板的第 n 槽(0–255)改成新色 —— 所以 \e]4;1;rgb:e0/3a/3a\e\\ 之后 \x1b[31m 用的红就是新红。OSC 10OSC 11 改默认前景与默认背景,独立于索引调色板 —— 比如 TUI 弹模态框时想把外层 chrome 调暗而不动任何文本色就用它。对应的复位是 \x1b]104;n\x1b\\(单槽恢复出厂值)或不带参数的 \x1b]104\x1b\\(一次恢复全部);OSC 110 / OSC 111(不带参数)分别复位默认 fg / bg。颜色字符串也吃 X11 的 rgb:RRRR/GGGG/BBBB 长式,多数模拟器还接受 #rrggbb

  4. 5. Shell 提示符标记 —— OSC 133(FinalTerm A / B / C / D)

    FinalTerm 的 OSC 133 把 shell 会话从一串扁平字节变成终端可导航的结构化块。四个码标边界:\x1b]133;A\x07 在提示符之前,\x1b]133;B\x07 在提示符与用户输入之间,\x1b]133;C\x07 在 Enter 与命令 stdout 之间,\x1b]133;D;<exit>\x07 在命令退出后(退出码可选)。Kitty、iTerm2、WezTerm、Ghostty、Warp、VS Code 终端会暴露出没法靠别的手段伪造的 UX:一键跳到上 / 下一个提示符、折叠某条命令的输出、用红三角 / 绿勾装饰提示符行的退出码、按命令而不是按屏滚动。把它绑进 PS1 + preexec + precmd 钩子(atuinstarship、模拟器自带脚本会自动接上)。再配上 \x1b]7;file://host/path\x1b\\(OSC 7,cwd 广告),终端就同时知道每段在哪个目录执行 —— 二者合起来才是完整的 shell 集成故事。

  5. 6. 内联图片与进度 —— OSC 1337OSC 9 ; 4

    两个 OSC 码把字节流推到 OS 窗口外壳而不是画字符。**\x1b]1337;File=name=<b64>;inline=1:<b64-payload>\x07** 是 iTerm2 的内联图片协议 —— 同一套词汇覆盖 PNG、JPEG、动画 GIF、PDF —— 也是 imgcat shell 脚本走的路径(iTerm2 自带,WezTerm 与 Konsole 22.04+ 实现 File= 子集)。同样的 OSC 1337 信封还承载非 File 子码(SetUserVarSetMarkReportCellSize),用于状态栏变量、导航标记、像素精确的 Sixel 缩放。**\x1b]9;4;<state>;<pct>\x07** 是 Windows Terminal 1.18+ 标准化的 ConEmu 进度协议 —— state=1 正常、2 错误、3 不确定、4 暂停、0 清除 —— 终端把它转发给 OS 任务栏(WT)或标签指示器(Ghostty、WezTerm)。别和 iTerm2 的 OSC 9 ; <消息> 通知混淆:第二个 token ;4 就是消歧符,所以始终发完整形状。两者都可无条件发送 —— 不支持的模拟器静默丢字节。

本家族的全部序列

浏览其他家族