DECSET ?12 — 光标闪烁
启用或关闭光标闪烁属性 —— 与光标形状无关。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[?12h (start blinking) \x1b[?12l (stop blinking)\\033[
\033[?12h / \033[?12l\\e[
\e[?12h / \e[?12lESC [
ESC [ ? 1 2 h / lhex
1b 5b 3f 31 32 68 / 6c说明
切换光标的闪烁属性。与 DECSCUSR(\x1b[N SP q)不同 —— 后者把形状与闪烁合并在一个参数中。使用 ?12 可保留用户偏好的形状(方块 / 竖线 / 下划线)只控制是否闪烁。编辑器常用:普通模式稳定光标、插入模式闪烁,但不动用户选择的形状。配合 DECSCUSR \x1b[0 q 或 DECSTR(\x1b[!p)恢复终端默认。
规范出处: xterm-ctlseqs (Private mode 12)
示例
printf '\033[?12h' # start blinking\nprintf '\033[?12l' # stop blinkingimport sys; sys.stdout.write('\x1b[?12l')fmt.Print("\x1b[?12l")process.stdout.write('\x1b[?12l')printf("\x1b[?12l");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- vim / neovim `'guicursor'` per-mode blinkvim 的 `:set guicursor=n-v-c:block-Cursor/lCursor-blinkwait300-blinkon200-blinkoff150,i-ci:ver25-iCursor` 在进入插入模式时发 `\x1b[?12h`、退出时发 `\x1b[?12l` —— 保留用户偏好的方块 / 竖线 / 下划线形状(通过 DECSCUSR 设置),只切换闪烁。neovim ≥ 0.5 遵循同一语法
- helix editor `cursor-shape` blink modeshelix 的 `[editor.cursor-shape]` 配置(`insert = "bar"`、`normal = "block"`)加 `[editor] cursor-blink = true` 在获得焦点时发 `\x1b[?12h`、失去时发 `\x1b[?12l` —— 与 kakoune 的全有或全无方法不同。`script -q -c hx /dev/null` 后 grep `\x1b\[?12` 可验证
- kitty `cursor_blink_interval` configkitty 在 `~/.config/kitty/kitty.conf` 的 `cursor_blink_interval 0.5` 在*终端侧*执行 —— 但发 `\x1b[?12l` 的应用(如 midnight commander、htop)可按应用覆盖;kitty 在用户配置设非零闪烁时仍尊重运行进程发的 DECSET ?12。间隔设为 `0` 全局禁用闪烁
- Alacritty `cursor.style.blinking` profileAlacritty 在 `alacritty.toml` 的 `cursor.style.blinking = "On"` 尊重运行应用发的 `\x1b[?12h` / `\x1b[?12l` —— 应用为短暂的插入模式闪烁覆盖用户选择,之后恢复。`cursor.blink_interval = 750`(默认)设置闪烁活跃时的周期
- midnight commander (mc) cursor-blink suppressionGNU `mc` 启动时发 `\x1b[?12l`、退出时发 `\x1b[?12h`,在 TUI 面板期间抑制闪烁 —— `script -c 'mc' /dev/null; grep -a '\x1b\[?12' typescript` 可见。`ranger`、`nnn`、`lf` 同模式(各自的 `cursor.blink = false` 配置开关都映射到此字节序列)
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 如何关闭光标闪烁 ——
\x1b[?12l还是 DECSCUSR\x1b[<n> q? - 存在两种不同机制,哪种生效取决于终端。
\x1b[?12l(ATT 610 DEC 私有模式)是仅控制*闪烁*属性的旧 xterm 兼容开关 —— xterm、foot、gnome-terminal、konsole 支持;macOS Terminal 与 Windows Terminal 不支持(静默忽略)。DECSCUSR\x1b[<n> q(偶数n不闪烁、奇数闪烁 —— 0/1=闪烁块、2=稳定块、3=闪烁下划线、4=稳定下划线、5=闪烁竖线、6=稳定竖线)是现代路径,几乎到处都支持(xterm、kitty、alacritty、wezterm、ghostty、foot、Windows Terminal、iTerm2、gnome-terminal、konsole)。最广兼容请用 DECSCUSR 发期望的偶数(如\x1b[2 q稳定块);对仅认?12的老终端再加发\x1b[?12l。二者不冲突。 - 为什么我的 TUI 设置光标闪烁会泄漏到用户的 shell 里?
?12和 DECSCUSR 按设计都跨进程退出持续 —— 终端没有「随 PID 死亡而重置」的概念。必须在 atexit /defer/trap EXIT处理器里显式恢复先前状态。可移植的恢复是\x1b[0 q(DECSCUSR 参数 0 = 终端默认 —— 块形 + 用户配置的闪烁),在所有支持 DECSCUSR 的终端都生效。要往返保险,启动时用 DECRQSS\x1bP$q q\x1b\\查询确切n值、保存,退出时发\x1b[<saved> q。常见 bug:为编辑器光标设\x1b[5 q(闪烁竖线)、崩溃、留用户的bash提示符闪烁 —— 持续到他们手动重置或重启终端。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 部分 | 部分 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |