跳到主要内容
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/3linux-* 条目中仍展开为 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 仅当终端类型为 linuxloadkeys 未重映射 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
支持

相关序列