OSC 12 — 设置光标颜色(与查询)
覆写终端光标颜色,或通过 OSC 回报查询当前值。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b]12;#RRGGBB\x07 (set) \x1b]12;?\x07 (query)\\033[
\033]12;#RRGGBB\007\\e[
\e]12;#RRGGBB\aESC [
ESC ] 12 ; COLOR BELhex
1b 5d 31 32 3b ... 07说明
OSC 12 设置文本光标(即输入位置绘制的块状 / 竖条 / 下划线)的颜色。颜色参数与 OSC 10 / 11 接受同样的写法:#RRGGBB、#RGB、rgb:RRRR/GGGG/BBBB、X11 颜色名。将颜色改为 ?(\x1b]12;?\x07),终端会用同一语法回报当前光标色 —— 主题脚本与 :set background=... 自动检测会以此读取实时调色板。用 OSC 112(\x1b]112\x07)恢复用户在终端偏好中设置的默认光标色。与光标形状(\x1b[? q — DECSCUSR)和光标可见性(\x1b[?25h/l)相互独立,OSC 12 只改变颜色。
规范出处: xterm-ctlseqs (OSC 12 / 112)
示例
printf '\033]12;#f38ba8\007' # set cursor to pink\nprintf '\033]12;?\007' # query current cursor colourimport sys; sys.stdout.write('\x1b]12;#f38ba8\x07')fmt.Print("\x1b]12;#f38ba8\x07")process.stdout.write('\x1b]12;#f38ba8\x07')printf("\x1b]12;#f38ba8\x07");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- neovim cursor-shape themes主题先设 `:hi Cursor guibg=...`,再通过 `:set guicursor` 映射驱动 OSC 12 —— 光标按 insert / normal / visual 模式重新着色,无需重绘屏幕
- fish_vi_cursorfish 的 vi 模式在模式切换时发 `\x1b]12;<colour>\x07` —— 命令模式光标闪橙色,插入模式白色,一眼可见 vi 状态
- kitty, wezterm per-mode cursor overrideskitty 的 `cursor_text_color` 和 wezterm 的 `colors.cursor_fg/bg` 接受运行中 shell 发出的动态 OSC 12 —— `tmux` / `nvim` 可在进入时按窗格覆盖终端默认值
- tmux `set -g cursor-color`tmux 从活动窗格透传 OSC 12 —— 每个窗格的光标颜色反映前台程序(vim 红、fish 白),而不是终端范围内的单一颜色
- terminator, konsole config-file cursor colourGTK 终端从配置文件读光标颜色,但运行时接受 OSC 12 作为每会话覆盖 —— 用于让 SSH 远端会话视觉上有提示
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 部分 | 支持 | 部分 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |