OSC 1 — 设置图标名(与窗口标题分离)
独立于可见窗口标题设置 X11 风格的图标名 —— 历史上为窗口最小化时显示的标签。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b]1;ICON-NAME\x07\\033[
\033]1;ICON-NAME\007\\e[
\e]1;ICON-NAME\aESC [
ESC ] 1 ; ICON-NAME BELhex
1b 5d 31 3b ... 07说明
OSC 1 设置图标名 —— 历史上为 X11 在最小化窗口处显示的短标签(OSC 2 设置标题栏可见的长标题)。OSC 0 一次设置两者;OSC 1 只设置图标名;OSC 2 只设置标题。在 X11/xterm + gnome-terminal + konsole + mlterm + foot 上仍按设计工作 —— 窗口管理器通过 XSetWMIconName 读取图标名属性。在非 X11 终端(Windows Terminal、iTerm2、kitty、alacritty、wezterm、ghostty)上没有独立的图标名渲染面,因此多数完全忽略 OSC 1,或当作无操作。希望同步更新两者(跨平台工具的安全默认)请用 OSC 0;只在需要保留标题栏不动而更新最小化标签时才用 OSC 1。
规范出处: xterm-ctlseqs (OSC 1)
示例
printf '\033]1;build-watch\007' # icon name only; title bar untouchedimport sys; sys.stdout.write('\x1b]1;build-watch\x07')fmt.Print("\x1b]1;build-watch\x07")process.stdout.write('\x1b]1;build-watch\x07')printf("\x1b]1;build-watch\x07");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- xterm, urxvt, gnome-terminal, konsole, mlterm, foot所有 X11 原生终端都遵守 OSC 1 —— 图标名通过 `WM_ICON_NAME` 发布,窗口管理器可在任务栏 / 活动切换器上显示短标签(`vim`、`htop`),同时标题栏保留完整的 `vim — ~/proj/foo.c`
- tmux `set-titles-string` + `icon-string`tmux 在 `titles-string` 之外提供独立的 `icon-string` —— 当外层终端为 X11 原生时,tmux 用 OSC 1 发送短形式(`#W`)作图标,用 OSC 2 发送长形式(`#S:#W -- #T`)作标题,沿用 xterm 惯例
- screen `caption` / `hardstatus`GNU screen 跑在 xterm 家族终端里时,每次焦点窗口变化都发 OSC 1 —— Alt-Tab 风格切换器显示内层窗口名(`screen 0: vim`)而不是外层静态标签
- i3wm / sway / xmonad — minimised icon labels回退到浮动布局的平铺 WM(i3 暂存区、sway 的 `move workspace`)在窗口最小化或被移到非可见工作区时显示图标名 —— 让长任务(`make all 2>&1 | tee >(grep -q ERROR && printf '\\x1b]1;BUILD FAILED\\x07')`)发 OSC 1,工作区标签就闪出有意义的内容
- non-X11 terminals (iTerm2, kitty, alacritty, wezterm, ghostty, Windows Terminal)这些终端都没有独立的图标渲染面 —— OSC 1 被解析后丢弃(部分构建里当 OSC 0 处理)。可移植脚本应使用 OSC 0(`\x1b]0;<name>\x07`)一次性更新图标和标题,除非确实需要 X11 的分离语义
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- OSC 0、OSC 1、OSC 2 有什么区别 —— 为什么有三个标题转义?
- OSC 0 一次设置图标名和窗口标题(简写)。OSC 1 *仅*设置图标名(窗口最小化 / 图标化时显示的短标签)。OSC 2 *仅*设置窗口标题(标题栏 / 标签上的长字符串)。这种拆分源于 X11 / ICCCM —— 图标化窗口会显示独立的紧凑标签。现代终端不支持图标化(Windows Terminal、macOS Terminal.app、kitty)时,OSC 1 常常静默空操作;OSC 0 与 OSC 2 处处可用。SSH 远端标签建议用 OSC 2 —— OSC 0 在仍尊重 X11 区分的终端上可能覆盖图标。
- 为什么我设的图标名在 tmux 每次开新标签都会被重置?
- tmux 自维护每窗口的图标名,并在活动窗口切换时向外层终端重发 OSC 1。从内层 shell 设 OSC 1 会更新*tmux 窗口的*已记录图标名,但
Ctrl-b n切到下一窗口时,tmux 把那个窗口已存的图标推回(通常为空 → 终端回退到二进制名如tmux)。要让图标跨窗口持续,请设set-option -g set-titles-string '#W',让 tmux 通过内层 shell 的automatic-rename机制驱动标题 —— 单窗口手动 OSC 1 无法穿越下次切换。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 支持 | 支持 |