跳到主要内容
ansicode

DECARM — 按键自动重复模式(CSI ? 8 h / l)

切换终端在按住按键时是否重复发送字节 —— 对游戏与编辑器很重要,按住 `j` 不应狂刷缓冲。

字节形式

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

\\x1b[\x1b[?8h (repeat) \x1b[?8l (no repeat)
\\033[\033[?8h / \033[?8l
\\e[\e[?8h / \e[?8l
ESC [ESC [ ? 8 h / ESC [ ? 8 l
hex1b 5b 3f 38 68 / 6c

说明

Auto-Repeat 模式。设置(`\x1b[?8h`,几乎所有终端的默认)时,按键超过 OS 定义的延迟(典型 250 ms)后保持按下会让终端按 OS 定义的速率(典型每秒 30 次)注入重复字节 —— 即标准打字机风格行为。重置(`\x1b[?8l`)时,无论按键保持多久,每次物理按键都只发一个字节 —— 这样把 `j` 解作「下移一格」的 roguelike 在玩家按住按键时不会跨地图狂奔。OS 延迟 / 速率不能通过 DECARM 调整(X11 用 `xset r rate`、macOS 用 `defaults write -g KeyRepeat`、Windows 用辅助功能面板);DECARM 只切开 / 关。对 TUI 游戏(基于 curses 的 roguelike 如 nethack、brogue)、解释单键命令的模式化编辑器、以及希望每次击键都防抖为离散事件的应用至关重要。支持几乎一致 —— 仅 Linux console 偏 partial(取决于 framebuffer 驱动)。退出时务必恢复 `?8h` —— 关着 auto-repeat 退出会污染用户 shell 会话。

规范出处: DEC VT100 (DECARM) / xterm-ctlseqs

参数

示例

bash
printf '\033[?8l'   # turn OFF auto-repeat for the duration of this TUI\ntrap 'printf "\\033[?8h"' EXIT   # restore on any exit\n# … game loop …
python
import sys, atexit\nsys.stdout.write('\x1b[?8l')   # roguelike: one move per keypress\natexit.register(lambda: sys.stdout.write('\x1b[?8h'))
go
fmt.Print("\x1b[?8l")\ndefer fmt.Print("\x1b[?8h")   // always restore
javascript
process.stdout.write('\x1b[?8l')\nprocess.on('exit', () => process.stdout.write('\x1b[?8h'))
c
printf("\x1b[?8l");\natexit_set_restore("\x1b[?8h");   /* paired restore is non-optional */

终端支持

xterm
支持
Linux console (fbcon)
部分
macOS Terminal.app
支持
iTerm2
支持
Windows Terminal
支持
cmd.exe / ConPTY
部分
kitty
支持
alacritty
支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
支持
Konsole
支持
tmux
不支持
GNU screen
不支持

相关序列