跳到主要内容
ansicode

DECKPAM / DECKPNM — 小键盘应用 / 数字模式(ESC = / ESC >)

在数字小键盘发送应用转义序列(\eOM / \eOj …)与发送 ASCII 数字之间切换 —— vim / less / readline 小键盘行为的基础。

字节形式

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

\\x1b[\x1b= (DECKPAM) \x1b> (DECKPNM)
\\033[\033= / \033>
\\e[\e= / \e>
ESC [ESC = / ESC >
hex1b 3d / 1b 3e

说明

两个 C1 级转义序列(无 CSI、无参数 —— 仅 ESC 后跟一个末字节),切换数字小键盘的输入编码。DECKPAM\x1b=)启用应用小键盘模式 —— 数字键 0-9 与运算符 +-*/.、Enter 等各发送 SS3 前缀的序列(\x1bOq 表示 1、\x1bOM 表示 Enter、\x1bOk 表示 + 等),而非字面 ASCII 字节。需要区分小键盘 5 与主键盘 5 的 curses 程序在启动时启用。DECKPNM\x1b>)反向 —— 数字小键盘发送普通 ASCII 字节 0-9+-*/.\n,与主键盘无差。curses 的 keypad(stdscr, TRUE) 进入时映射为 \x1b=,退出时为 \x1b>;vim 在主循环外发这一对;less / man 阅读器界面也类似。注意:方向键 / 编辑键(箭头、Home、End、PgUp、PgDn)由另一个模式控制 —— DECCKM(\x1b[?1h/l),与 DECKPAM 无关 —— 因此启用 DECKPAM 不会改变方向键编码。两者常被一同提及,但实际是独立设置。两个序列都是 2 字节(ESC + 末字节),解析极廉价;任何需要区分小键盘输入的 TUI 都可以在进出循环时发送。

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

参数

示例

bash
# Enable app keypad — read what numpad-Enter sends now:\nprintf '\033='\nread -rsn 3 key   # captures \x1bOM instead of \n\nprintf '\033>'   # always restore on exit
python
import sys, termios, tty\nsys.stdout.write('\x1b=')   # app keypad on\n# … TUI loop with raw stdin …\nsys.stdout.write('\x1b>')   # normal keypad on exit
go
fmt.Print("\x1b=")   // DECKPAM: numpad sends SS3 sequences\ndefer fmt.Print("\x1b>")   // DECKPNM: restore
javascript
process.stdout.write('\x1b=')   // app keypad\nprocess.on('exit', () => process.stdout.write('\x1b>'))
c
fputs("\x1b=", stdout);   /* enter app keypad — pair with atexit handler emitting \x1b> */

终端支持

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

相关序列

在家族食谱中

ESC 食谱 · 3. 小键盘模式 —— `\x1b=` / `\x1b>`(DECKPAM / DECKPNM)