跳到主要内容
ansicode

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 \
hex1b 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

示例

bash
# Map F6 to literally type 'vim\\n' when pressed (key code 17, hex 76 69 6d 0d):\nprintf '\033P1;1|17/76696D0D\033\\'
python
import sys; sys.stdout.write('\x1bP1;1|17/76696D0D\x1b\\\\')
go
fmt.Print("\x1bP1;1|17/76696D0D\x1b\\\\")
javascript
process.stdout.write('\x1bP1;1|17/76696D0D\x1b\\\\')
c
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
支持

相关序列

在家族食谱中

DCS 食谱 · 4. VT 重映射面 —— DECUDK(用户自定义键)与 DECDLD(下载字形)