DECUDK — 定义用户自定义键(DCS Pc;Pl|Ky/St;... ST)
运行时重映射 DEC 用户自定义功能键(F6–F20)—— DEC VT 遗留,xterm 及其分叉仍解析。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1bPPc;Pl|Ky/St;Ky/St;...\x1b\\\\033[
\033PPc;Pl|Ky/St;...\033\\\\e[
\ePPc;Pl|Ky/St;...\e\\ESC [
ESC P Pc ; Pl | Ky / St ; ... ESC \hex
1b 50 ... 1b 5c说明
DECUDK —— Define User-Defined Keys。DCS 帧的体以两个数字参数(; 分隔)开头,紧跟字面 |,再是若干 Ky/St 对(; 分隔)。Pc = 清除策略:0 先清空所有键、1 只清除即将定义的键。Pl = 锁定状态:0 锁定定义(后续 DECUDK 被忽略直到 DECSTR)、1 保持解锁。Ky = 键码(17 = F6、18 = F7、…、34 = F20;F1–F5 为终端保留)。St = 替换字节,逐字节两位 ASCII 十六进制。例如 DEC VT520 上把 F6 映射为发送 vim<CR> 即可发出 \x1bP1;1|17/76696D0D\x1b\\。xterm 接受 DECUDK,将十六进制载荷写入对应 PF 键的转译表。自带快捷键 UI 的现代终端(kitty、wezterm)通常忽略 DECUDK 而依赖配置文件;xterm、mintty 与部分工业终端仍实现。今日价值:DEC 遗留软件、终端测试套件(vttest 含 DECUDK 测试页)、终端模拟器开发。
规范出处: DEC STD 070 (DECUDK) / xterm-ctlseqs
示例
# Map F6 to literally type 'vim\\n' when pressed (key code 17, hex 76 69 6d 0d):\nprintf '\033P1;1|17/76696D0D\033\\'import sys; sys.stdout.write('\x1bP1;1|17/76696D0D\x1b\\\\')fmt.Print("\x1bP1;1|17/76696D0D\x1b\\\\")process.stdout.write('\x1bP1;1|17/76696D0D\x1b\\\\')printf("\x1bP1;1|17/76696D0D\x1b\\\\");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- xterm programmable function keys (UDK)xterm 把 DECUDK 实现为 `\x1bP1;1|17/61626364\x1b\\`,其中 `17` 是 F6 键、`61626364` 是按下时键将产出的十六进制字符串 `abcd`。现代 xterm 默认禁用(X 资源 `*allowUserDefinedKeys: false`)以防不可信输出重绑功能键
- GNU screen `bindkey` (parallel mechanism)GNU screen 不会把 DECUDK 透传到外层终端,但其自身 `bindkey -k F6 "some text"` 配置达成相同效果 —— 在 screen 会话内把功能键重绑到字面字符串,作用域限于复用器本地
- DEC VT220 / VT320 firmware demosDEC 自家的 VT220 与 VT320 固件演示程序(1990 年代初作为 VAX/VMS 可执行文件发行)使用 DECUDK 重绑 F11–F20 来驱动演示宏流程 —— 从历史上看正是规范围绕之撰写的经典用例。vt100.net 的模拟器为演示程序保留该行为
- rxvt-unicode `keysym` perl extensionrxvt-unicode 的 `perl-ext-common` 扩展历史上包含 `keysym` 扩展,发出 DECUDK 风格序列在运行时重绑功能键 —— 已被现代 `URxvt.keysym.<key>: <string>` X 资源约定取代,但 DCS 字节仍在老的屏录中出现
- PuTTY saved-session key remappingPuTTY 的 `Connection > Data > Terminal-type string` 与功能键面板在保存配置重绑 F1–F20 时,会话初始化期间发出 DECUDK 序列 —— 让接入 AS/400 或 OpenVMS 系统的用户获得主机式访问键行为
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- DECUDK 实际能重映射哪些 F 键?
- F6 至 F20,键码 17–34。F1–F5 在 DEC 硬件上保留为终端本地用途(用于调出终端设置菜单),针对它们的 DECUDK 定义会被静默忽略。完整码表:F6=17、F7=18、F8=19、F9=20、F10=21、F11=23、F12=24、F13=25、F14=26、F15(Help)=28、F16(Do)=29、F17–F20=31–34 —— 注意 22、27、30 未分配。现代键盘没有 F13–F20,仍可接受这些定义,但用户侧显然按不到;F6–F12 之外的唯一实用场景是回放 DEC VT520 转录的自动化测试。现代快捷键绑定请用模拟器自己的配置(kitty.conf、wezterm.lua 等),别用 DECUDK。
- DECUDK 定义里的替换字节如何编码?
- 每个字节编码为两位 ASCII 十六进制(xterm 大小写皆收)。把 F6 绑定为字面键入
vim\n,四个载荷字节是 0x76 0x69 0x6D 0x0D,Ky/St 对为17/76696D0D。包入完整 DECUDK 帧:\x1bP1;1|17/76696D0D\x1b\\—— Pc=1(仅清此键)、Pl=1(保持解锁让后续 DECUDK 可替换)、|分隔符、键码17(F6)、/、十六进制载荷、ST 终止\x1b\\。一帧多键:用;分隔 Ky/St 对 —— 例如17/76696D0D;18/6C73把 F6 定义为vim<CR>、F7 为ls。避免在载荷字节中直接嵌入\x1b(即便十六进制编码也会干扰解析器)—— 合法用途通常保持载荷短且可打印。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 | 支持 |