DECARM — 按键自动重复模式(CSI ? 8 h / l)
切换终端在按住按键时是否重复发送字节 —— 对游戏与编辑器很重要,按住 `j` 不应狂刷缓冲。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[?8h (repeat) \x1b[?8l (no repeat)\\033[
\033[?8h / \033[?8l\\e[
\e[?8h / \e[?8lESC [
ESC [ ? 8 h / ESC [ ? 8 lhex
1b 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
参数
示例
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 …import sys, atexit\nsys.stdout.write('\x1b[?8l') # roguelike: one move per keypress\natexit.register(lambda: sys.stdout.write('\x1b[?8h'))fmt.Print("\x1b[?8l")\ndefer fmt.Print("\x1b[?8h") // always restoreprocess.stdout.write('\x1b[?8l')\nprocess.on('exit', () => process.stdout.write('\x1b[?8h'))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
- 不支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 部分 | 支持 | 支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 不支持 | 不支持 |