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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 部分 | 支持 | 支持 |