跳到主要内容
ansicode

DECSET ?12 — 光标闪烁

启用或关闭光标闪烁属性 —— 与光标形状无关。

字节形式

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

\\x1b[\x1b[?12h (start blinking) \x1b[?12l (stop blinking)
\\033[\033[?12h / \033[?12l
\\e[\e[?12h / \e[?12l
ESC [ESC [ ? 1 2 h / l
hex1b 5b 3f 31 32 68 / 6c

说明

切换光标的闪烁属性。与 DECSCUSR(\x1b[N SP q)不同 —— 后者把形状与闪烁合并在一个参数中。使用 ?12 可保留用户偏好的形状(方块 / 竖线 / 下划线)只控制是否闪烁。编辑器常用:普通模式稳定光标、插入模式闪烁,但不动用户选择的形状。配合 DECSCUSR \x1b[0 q 或 DECSTR(\x1b[!p)恢复终端默认。

规范出处: xterm-ctlseqs (Private mode 12)

示例

bash
printf '\033[?12h'   # start blinking\nprintf '\033[?12l'   # stop blinking
python
import sys; sys.stdout.write('\x1b[?12l')
go
fmt.Print("\x1b[?12l")
javascript
process.stdout.write('\x1b[?12l')
c
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
支持

相关序列

在家族食谱中

DEC 食谱 · 3. 光标显隐与闪烁 —— `?25`、`?12`