DECLL —— 加载 LED 灯(`CSI Ps q`,无 SP 中间字节)
开关键盘前面板 L1–L4 LED(`CSI Ps q`)。在 Linux 控制台 terminfo 里以 `KEYBOARD_LED 1/2/3/4` 留存 —— 现代模拟器除 xterm + Linux console 外静默忽略。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[Ps q\033[Ps q\e[Ps qESC [ <Ps> q1b 5b <Ps> 71说明
**DECLL**(*加载 LED*,`\x1b[<Ps>q`)控制 DEC VT100 系列终端键盘前面板的四只 LED(L1、L2、L3、L4)—— 功能键行下方的小灯,主机可点亮以呈现状态(caps lock、模式标记、注意提示)。该序列在 2026 年仍存活,仅因 Linux 控制台把自己的三只键盘 LED(NumLock、CapsLock、ScrollLock)接到它上,且 terminfo 的 `KEYBOARD_LED 1`/`2`/`3` 在 `linux-*` 条目中仍展开为 DECLL。 **消歧陷阱。** DECLL 是 `CSI Ps q`,**无中间字节**。`dec-cursor-shape`(DECSCUSR)是 `CSI Ps SP q` —— 注意 **空格(0x20)中间字节**。一个把空白扁平化的解析器会把二者合一,于是主机想切状态 LED 时却改了光标形状。字节流 `\x1b[3q` 是 DECLL「L3 亮」;`\x1b[3 q`(带真空格)是 DECSCUSR「下划线闪烁光标」。真正的 terminfo `setab` / `setaf` 串发 DECLL 时不带空格;写解析器时请按中间字节槽位区分,而非按末字节。 **参数编码**(DEC VT100): - `0` —— **全部 LED 灭**(省略 `Ps` 时默认;也作为从部分点亮状态「重置」) - `1` —— **L1 亮**(Linux 控制台的 NumLock;真 VT100 的「L1」灯) - `2` —— **L2 亮**(Linux 控制台的 CapsLock;VT100 的「L2」灯) - `3` —— **L3 亮**(Linux 控制台的 ScrollLock;VT100 的「L3」灯) - `4` —— **L4 亮**(Linux 无映射;VT100 的「L4」灯 —— 历史上主机程序用作「需注意」) - `21` —— **L1 灭**(单独关一只 LED,不影响其它) - `22` —— **L2 灭** - `23` —— **L3 灭** - `24` —— **L4 灭** **语义。** DECLL 是*累加性*的 —— `\x1b[1q` 仅点 L1,不动 L2/L3/L4。「关」码(21–24)同样作用于单只 LED。只有 `\x1b[0q`(或无参数的 `\x1b[q`,默认 `Ps=0`)一次清空四只。 **边界** - 单序列内允许多参数:`\x1b[1;3q` 同时点 L1 + L3,关码同样可组合:`\x1b[21;22;23q` 一次关 L1、L2、L3。(这是少数 ECMA-48「每个 Ps 应用相同末字节语义」的解读真正契合 DEC 原意的场景之一。) - Linux 控制台的内核驱动要求 `CAP_SYS_TTY_CONFIG` 才能从内核外部点 LED;普通用户态向 `/dev/tty` 写 DECLL 仅当终端类型为 `linux` 且 `loadkeys` 未重映射 LED 位时有效。 - 在 xterm 上,DECLL 切换标题栏区域的小指示点(通过 `showLed` X 资源配置)。默认关(无可视反馈),需用户启用。 - **勿与**:`dec-cursor-shape`(CSI Ps SP q —— 加空格中间字节)或 `xtversion`(CSI > q —— 加 `>` 参数前缀,无 `Ps`)混淆。 **覆盖度** —— **xterm** = 完整(需 `showLed` X 资源启用可视反馈)。**Linux console** = 完整(驱动内核管理的三只 LED)。**mlterm** + **Konsole** = 部分(解析 + 确认,无可视反馈除非配 X 资源)。**WezTerm** + **iTerm2** + **Kitty** + **Alacritty** + **Ghostty** + **Windows Terminal** + **cmd / ConPTY** + **macOS Terminal** + **gnome-terminal** = 无作用(静默解析丢弃 —— 2026 的 GUI 模拟器无硬件 LED 可控)。实际上 DECLL 在现代栈里不可见 —— 想做可视状态指示请改用 `osc-set-fg-bg` / `osc-cursor-color` / 状态栏文本。
规范出处: DEC VT100 User Guide §5.4 (DECLL) / ECMA-48 §8.3.69 (LL — Load LEDs)
参数
| Ps = 0 (default) | 全部 LED 灭。省略 Ps(\x1b[q)时的默认。 |
| Ps = 1..4 | 点亮 L1..L4(Linux 控制台:L1=NumLock、L2=CapsLock、L3=ScrollLock、L4 未用)。 |
| Ps = 21..24 | 单独熄灭 L1..L4,不动其它 LED。 |
| Multi-param | \x1b[1;3q 同点 L1+L3;\x1b[21;22q 同熄 L1+L2 —— 与 SGR 同样以分号分隔。 |
示例
# Light L1 (NumLock on Linux console).\nprintf '\\033[1q'\n# Light L1 + L3 in one shot.\nprintf '\\033[1;3q'\n# Clear all LEDs.\nprintf '\\033[0q'\n# Mind the disambiguation: \\x1b[3 q is DECSCUSR (cursor blinking underline), not DECLL.\nprintf '\\033[3q' # DECLL L3 on\nprintf '\\033[3 q' # DECSCUSR — note literal spaceimport sys\n# Use DECLL as a poor-man's status indicator on a serial console.\ndef set_leds(*on):\n if not on: sys.stdout.write('\\x1b[0q'); return\n sys.stdout.write('\\x1b[' + ';'.join(str(i) for i in on) + 'q')\n sys.stdout.flush()\nset_leds(1, 3) # L1 + L3 on\nset_leds() # all off// Toggle Linux console NumLock LED based on app state.\nfunc setNumLock(on bool) {\n if on {\n fmt.Print(\"\\x1b[1q\") // L1 on\n } else {\n fmt.Print(\"\\x1b[21q\") // L1 off (don't touch L2/L3)\n }\n}// Avoid the DECSCUSR collision: emit DECLL with NO space between Ps and 'q'.\nfunction decll(...ps) {\n const body = ps.length === 0 ? '0' : ps.join(';');\n process.stdout.write('\\x1b[' + body + 'q'); // no space — DECLL, not DECSCUSR\n}\ndecll(1, 3); // L1 + L3 on/* DECLL on Linux console — L1 corresponds to NumLock LED. */\n#include <stdio.h>\nvoid set_status_led(int led, int on) {\n if (on) printf(\"\\x1b[%dq\", led); /* 1..4 = on */\n else printf(\"\\x1b[%dq\", 20 + led); /* 21..24 = off */\n fflush(stdout);\n}终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 部分 | 不支持 | 不支持 |