跳到主要内容
ansicode

OSC 1 — 设置图标名(与窗口标题分离)

独立于可见窗口标题设置 X11 风格的图标名 —— 历史上为窗口最小化时显示的标签。

字节形式

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

\\x1b[\x1b]1;ICON-NAME\x07
\\033[\033]1;ICON-NAME\007
\\e[\e]1;ICON-NAME\a
ESC [ESC ] 1 ; ICON-NAME BEL
hex1b 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)

示例

bash
printf '\033]1;build-watch\007'   # icon name only; title bar untouched
python
import sys; sys.stdout.write('\x1b]1;build-watch\x07')
go
fmt.Print("\x1b]1;build-watch\x07")
javascript
process.stdout.write('\x1b]1;build-watch\x07')
c
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
支持

相关序列

在家族食谱中

OSC 食谱 · 2. 窗口与标签标题 —— `OSC 0 / 1 / 2`