OSC 4 — 设置调色板颜色(与查询)
设置 256 色调色板中某一项颜色,或查询其当前值。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b]4;N;#RRGGBB\x07 (set) \x1b]4;N;?\x07 (query)\\033[
\033]4;N;...\007\\e[
\e]4;N;...\aESC [
ESC ] 4 ; N ; COLOR BELhex
1b 5d 34 3b <N> 3b ... 07说明
设置终端工作调色板中第 N 项(0..255)的颜色。0..7 为基本色(黑 / 红 / 绿 / 黄 / 蓝 / 品红 / 青 / 白),8..15 为亮色版本,16..231 为 6×6×6 颜色立方,232..255 为 24 级灰度。颜色语法与 OSC 10/11 相同:#RRGGBB、#RGB、rgb:RRRR/GGGG/BBBB、X11 颜色名。将颜色改为 ?(\x1b]4;N;?\x07)会让终端回报当前值 —— base16 主题、pywal、主题检测脚本都用这个查询/设置循环在启动时读取并改写调色板。使用 OSC 104(\x1b]104;N\x07)重置单个索引;不带参数的 OSC 104 重置整个调色板。
规范出处: xterm-ctlseqs (OSC 4)
示例
printf '\033]4;1;#ff5555\007' # remap colour 1 (red) to #ff5555\nprintf '\033]4;1;?\007' # query current colour 1import sys; sys.stdout.write('\x1b]4;1;#ff5555\x07')fmt.Print("\x1b]4;1;#ff5555\x07")process.stdout.write('\x1b]4;1;#ff5555\x07')printf("\x1b]4;1;#ff5555\x07");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- pywal (`wal -i image.jpg`)pywal 从图片提取 16 色调色板,再用 `\x1b]4;<n>;rgb:rr/gg/bb\x07` 在所有已打开终端里扫过槽位 0–15 —— 跑一次 `wal` 让 tmux、vim、ranger、裸 shell 同时换色
- base16-shell, base16-fzf live theme switch`base16_<theme>` source 一个 shell 脚本,依次发 16 条 OSC 4 转义 —— `base16_solarized-dark` → `base16_gruvbox-light` 切换无需重启 shell,所有可见的彩色输出立即重绘
- xtermcontrol --get-color / --color<n>`xtermcontrol` 是 OSC 4 的标准可脚本化接口 —— `xtermcontrol --get-color1` 用 `\x1b]4;1;?\x07` 查询当前红色槽位,`--color1 '#ff5555'` 写入
- alacritty, kitty, WezTerm runtime colour reload三款现代终端都支持 OSC 4 —— 既覆盖标准 16 个 ANSI 槽,也覆盖扩展的 256 色方块;`wezterm cli set-cwd` 类命令可即时重绘,无需 SIGUSR1 重载配置
- tmux `set -g terminal-overrides` palette passthroughtmux 默认剥离 OSC;设 `terminal-overrides 'xterm*:RGB'` 和 `allow-passthrough on` 后,内层窗格里的 pywal 可以重绘外层终端 —— `base16_*` 在 tmux 内行为像没有复用器
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 为什么
\x1b]4;<n>;rgb:对屏幕上已有的文本不生效? - 终端行为分两类。xterm 与 kitty 在调色板索引变化时重绘整屏,已有字形立即翻新色。gnome-terminal(VTE)、iTerm2、alacritty、wezterm 只在后续绘制时用新调色板——缓冲区上已有的文本保留绘制时的颜色。如果在不自动重绘的终端上需要强制视觉切换,调色板切换后再发
\x1b[2J\x1b[H(清屏 + 光标回原点)触发整屏重绘。 - 如何只重置一个调色板索引而不重写全部 256 项?
- 用 OSC 104——
\x1b]104;<n>\x07把索引<n>重置为终端编译期默认值;\x1b]104\x07(无参数)一次性重置全部 256 项。xterm-ctlseqs 把这对作为 OSC 4 的标准反向操作——pywal、base16-shell、theme.sh这类主题加载器退出时都发不带参数的 OSC 104,恢复用户的主题前调色板。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 部分 | 部分 | 支持 | 支持 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |