跳到主要内容
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)