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. 信封 ——
\x1b]……\x07或\x1b\\每条 OSC 序列都是
\x1b](ESC])起头,跟一个数字Ps(0、8、133等),再跟;分隔的载荷,最后是结束符。两个结束符都合法:\x07(BEL —— xterm 的事实标准,单字节)以及\x1b\\(ST —— ECMA-48 规范标准,两字节,写法是ESC \)。现代终端两种都吃;一次性 shellprintf用 BEL,把 OSC 嵌进 DCS 或 tmux 透传时用 ST(那种场景里 BEL 会被外层解释成别的)。还有个 8-bit C1 形式\x9d … \x9c,老 VT 手册里能见到,实战里基本绝迹。**结束符务必写全** —— 漏掉 BEL/ST 会让解析器一直挂起,直到下个恰好是结束符的字节,于是你输出里下一个意外的^G就把这条 OSC 关掉、把后面全部当作正文。2. 窗口与标签标题 ——
OSC 0 / 1 / 2OSC 最经典的形式:
\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;\eDCS 包装层,否则内层 OSC 出不到外层终端 —— tmux 的set-option -g set-titles on会自动包装。除裸 Linux console 外(没有外壳可设)所有终端都支持。3. OSC 8 超链接 ——
\x1b]8;;URI\x07TEXT\x1b]8;;\x07由 gnome-terminal 2017 年提出,现已被广泛采用 —— iTerm2、kitty、wezterm、ghostty、Windows Terminal、konsole、gnome-terminal 3.26+ 全在列。两段式:前一段设 URI,后一段(URI 为空)关闭。中间内容(含进一步的 SGR 颜色 / 粗细)都成为可点击文本。两个
;之间可选id=<token>,让模拟器把同一逻辑链接的多行去重,悬停一格会高亮所有匹配格 —— 但**同一会话中绝不要让两个不同 URL 共用同一个id**:Konsole 21.04 之前、gnome-terminal 3.36 之前以 id 作为唯一去重键,会把第二个 URL 静默改写成第一个。普通 HTTPS 到处可用;file://仅在自带渲染器的模拟器上生效。不支持的终端(Linux console、macOS Terminal、alacritty)会按纯文本显示而忽略链接 —— 可无条件发送。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 10与OSC 11改默认前景与默认背景,独立于索引调色板 —— 比如 TUI 弹模态框时想把外层 chrome 调暗而不动任何文本色就用它。对应的复位是\x1b]104;n\x1b\\(单槽恢复出厂值)或不带参数的\x1b]104\x1b\\(一次恢复全部);OSC 110/OSC 111(不带参数)分别复位默认 fg / bg。颜色字符串也吃 X11 的rgb:RRRR/GGGG/BBBB长式,多数模拟器还接受#rrggbb。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钩子(atuin、starship、模拟器自带脚本会自动接上)。再配上\x1b]7;file://host/path\x1b\\(OSC 7,cwd 广告),终端就同时知道每段在哪个目录执行 —— 二者合起来才是完整的 shell 集成故事。6. 内联图片与进度 ——
OSC 1337与OSC 9 ; 4两个 OSC 码把字节流推到 OS 窗口外壳而不是画字符。**
\x1b]1337;File=name=<b64>;inline=1:<b64-payload>\x07** 是 iTerm2 的内联图片协议 —— 同一套词汇覆盖 PNG、JPEG、动画 GIF、PDF —— 也是imgcatshell 脚本走的路径(iTerm2 自带,WezTerm 与 Konsole 22.04+ 实现File=子集)。同样的OSC 1337信封还承载非 File 子码(SetUserVar、SetMark、ReportCellSize),用于状态栏变量、导航标记、像素精确的 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就是消歧符,所以始终发完整形状。两者都可无条件发送 —— 不支持的模拟器静默丢字节。
本家族的全部序列
- OSC 0 / 2 — 设置窗口/图标标题
\x1b]0;TITLE\x07修改终端窗口的标题栏文本。
- OSC 8 — 内联超链接
\x1b]8;;URI\x07TEXT\x1b]8;;\x07在终端输出中渲染可点击超链接(gnome-terminal 3.26+、iTerm2、Windows Terminal、kitty 等)。
- OSC 10 / 11 — 设置默认前景 / 背景色
\x1b]10;#RRGGBB\x07 (set fg) \x1b]11;#RRGGBB\x07 (set bg)设置终端的默认前景色(OSC 10)或背景色(OSC 11),或查询当前值。
- OSC 52 — 系统剪贴板读写
\x1b]52;c;BASE64\x07 (set clipboard 'c' to BASE64 decoded bytes)通过终端设置(或查询)宿主系统剪贴板 —— 可跨 SSH 工作,无需 X11 转发。
- OSC 4 — 设置调色板颜色(与查询)
\x1b]4;N;#RRGGBB\x07 (set) \x1b]4;N;?\x07 (query)设置 256 色调色板中某一项颜色,或查询其当前值。
- OSC 9 — 桌面通知(iTerm2 / Windows Terminal)
\x1b]9;MESSAGE\x07从终端触发原生桌面通知 —— 长任务完成、构建结束等场景。
- OSC 7 — 当前工作目录提示
\x1b]7;file://HOST/PATH\x07把当前 shell 所在目录告知终端 —— 用于标签名、「在此目录新开标签」、远程感知的分屏工作流。
- OSC 110 / 111 / 112 — 重置默认前景 / 背景 / 光标颜色
\x1b]110\x07 (reset fg) \x1b]111\x07 (reset bg) \x1b]112\x07 (reset cursor)在 OSC 10 / 11 / 12 修改后,把终端的默认前景、背景或光标色恢复为用户设置。
- OSC 12 — 设置光标颜色(与查询)
\x1b]12;#RRGGBB\x07 (set) \x1b]12;?\x07 (query)覆写终端光标颜色,或通过 OSC 回报查询当前值。
- OSC 17 — 设置高亮(选区)背景色
\x1b]17;#RRGGBB\x07 (set) \x1b]17;?\x07 (query)修改终端在选中(高亮)文字后面绘制的背景色。
- OSC 19 — 设置高亮(选区)前景色
\x1b]19;#RRGGBB\x07 (set) \x1b]19;?\x07 (query)修改终端为选中(高亮)文字渲染的前景色。
- OSC 104 — 重置调色板颜色(单项或全部)
\x1b]104;N\x07 (reset index N) \x1b]104\x07 (reset all)把调色板中某一项 —— 或整个 256 色调色板 —— 恢复为终端用户配置的默认值。
- OSC 1 — 设置图标名(与窗口标题分离)
\x1b]1;ICON-NAME\x07独立于可见窗口标题设置 X11 风格的图标名 —— 历史上为窗口最小化时显示的标签。
- OSC 22 — 设置 X11 鼠标指针 / 光标名
\x1b]22;CURSOR-NAME\x07覆写终端窗口绘制的鼠标指针图形 —— 历史上为 xterm 特有,通过标准 X 光标名暴露。
- OSC 50 — 设置或查询字体(xterm 字体选择器)
\x1b]50;FONT-SPEC\x07 (set) \x1b]50;?\x07 (query)运行时切换终端显示字体,或查询当前字体 —— xterm 扩展,少数分叉亦实现。
- 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)标注提示符开始 / 命令开始 / 输出开始 / 命令结束,让终端能在提示符之间跳转、折叠输出、装饰退出码。
- OSC 1337 — iTerm2 内联图片与文件传输
\x1b]1337;File=name=<base64>;size=<bytes>;inline=1:<base64-data>\x07把图片、文件、或 iTerm2 私有状态嵌入终端字节流 —— Kitty / Sixel 后来主要取代的前身协议。
- OSC 9 ; 4 — ConEmu 进度指示器(Windows Terminal / Ghostty)
\x1b]9;4;<state>;<percent>\x07把实时进度百分比 / 暂停 / 错误状态推送到任务栏或标签图标 —— ConEmu 协议,被 Windows Terminal 1.18+ 标准化。
- OSC 10 / 11 / 12 查询 — 探测默认前景 / 背景 / 光标色(深色对浅色)
\x1b]10;?\x07 (fg) \x1b]11;?\x07 (bg) \x1b]12;?\x07 (cursor)向终端查询当前默认前景(10)/ 背景(11)/ 光标(12)色 —— 自动选择深色或浅色主题的标准做法。
- OSC 4 查询 — 读取 256 色调色板索引(`\x1b]4;<n>;?\x07`)
\x1b]4;<n>;?\x07向终端查询调色板索引 `n`(0–255)当前绑定的 RGB 值 —— 主题检查器、截屏工具与调色板迁移脚本常用。