跳到主要内容
ansicode

DECLL —— 加载 LED 灯(`CSI Ps q`,无 SP 中间字节)

开关键盘前面板 L1–L4 LED(`CSI Ps q`)。在 Linux 控制台 terminfo 里以 `KEYBOARD_LED 1/2/3/4` 留存 —— 现代模拟器除 xterm + Linux console 外静默忽略。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[Ps q
\\033[\033[Ps q
\\e[\e[Ps q
ESC [ESC [ <Ps> q
hex1b 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 同样以分号分隔。

示例

bash
# 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 space
python
import 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
go
// 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}
javascript
// 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
c
/* 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
不支持

相关序列