跳到主要内容
ansicode

OSC 4 — 设置调色板颜色(与查询)

设置 256 色调色板中某一项颜色,或查询其当前值。

字节形式

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

\\x1b[\x1b]4;N;#RRGGBB\x07 (set) \x1b]4;N;?\x07 (query)
\\033[\033]4;N;...\007
\\e[\e]4;N;...\a
ESC [ESC ] 4 ; N ; COLOR BEL
hex1b 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#RGBrgb:RRRR/GGGG/BBBB、X11 颜色名。将颜色改为 ?\x1b]4;N;?\x07)会让终端回报当前值 —— base16 主题、pywal、主题检测脚本都用这个查询/设置循环在启动时读取并改写调色板。使用 OSC 104(\x1b]104;N\x07)重置单个索引;不带参数的 OSC 104 重置整个调色板。

规范出处: xterm-ctlseqs (OSC 4)

示例

bash
printf '\033]4;1;#ff5555\007'   # remap colour 1 (red) to #ff5555\nprintf '\033]4;1;?\007'        # query current colour 1
python
import sys; sys.stdout.write('\x1b]4;1;#ff5555\x07')
go
fmt.Print("\x1b]4;1;#ff5555\x07")
javascript
process.stdout.write('\x1b]4;1;#ff5555\x07')
c
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 的标准反向操作——pywalbase16-shelltheme.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
支持

相关序列

在家族食谱中

SGR 食谱 · 5. OSC 调色板覆盖 —— 直接把槽位本身改了