SGR 2 — 暗淡 / 减弱
以降低亮度(faint/暗淡)渲染后续文本。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[2m\033[2m\e[2mESC [ 2 m1b 5b 32 6d实时预览
在浏览器中通过与解码器相同的分词器渲染 —— 无需打开终端。
说明
ECMA-48 §8.3.117 称 SGR 2 为「faint, decreased intensity, or second colour」(暗淡 / 降低强度 / 次要色)。字节序列为 \x1b[2m —— CSI 后跟 2 再以 m 收尾。规范对视觉表现的措辞刻意宽松(「为强调…而降低强度的字符」),因此实现各异:多数现代 GUI 终端把前景色向背景色 alpha 混合到约 60% 不透明度(xterm、iTerm2、kitty、alacritty、wezterm、gnome-terminal、Konsole、Ghostty),较老的 xterm 构建把它映射为切换到灰色调色板,framebuffer Linux console 干脆忽略。SGR 22(\x1b[22m)是配对的关闭码 —— 重要的是它与 sgr-bold *共享同一个* 关闭码,因为规范将「加粗 / 正常 / 暗淡」视为单一的三态强度属性。
浅色主题下的可见性是最常见的意外:把近白前景向近白背景 alpha 混合得到的还是近白文本 —— 与非暗淡几乎无差别。深色主题效果显著更好,因为黑底灰字本身对比清晰。Linux console / fbcon 完全忽略 SGR 2(16 槽内核调色板没有中间强度槽位),Windows 旧 cmd.exe(ConPTY 之前)亦如是,ConPTY 1809+ 将其透传至外层终端(因此 Windows Terminal 渲染正确,但同一二进制写入旧 console host 时就没有效果)。terminfo cap 为 dim —— tput dim 是可移植写法,但许多 terminfo 条目即使模拟器实现了 SGR 2 仍把 dim 留空,因此用 [ -n "$(tput dim)" ] 探测会漏报。tmux 原样转发 SGR 2。
使用 SGR 22(\x1b[22m)关闭。陷阱在于:SGR 22 *同时* 清除加粗 —— 因此如果你叠了 \x1b[1;2m(加粗 + 暗淡,偶尔有用的「暗淡强调」组合),\x1b[22m 会完全回到普通强度。想保留加粗只取消暗淡时,唯一可移植的写法是 \x1b[0m\x1b[1m(完整重置 + 重新应用加粗)—— 没有「只取消暗淡但保留加粗」的精准参数。绝不要单独用暗淡作为「次要」信号:color-only-signal 这条 pitfall 同样适用于纯强度信号(读屏完全忽略属性,浅色主题下的低视力用户可能看不出对比)。相关:sgr-bold(SGR 1 —— 另一端强度,与之共享 SGR 22 关闭码)、sgr-reset(SGR 0 —— 完整重置)、sgr-italic(SGR 3 —— 相邻样式属性,常与暗淡组合用于内联元数据)。
规范出处: ECMA-48 §8.3.117 (SGR parameter 2)
示例
printf '\033[2mfaint\033[22m back\033[0m\n'print('\x1b[2mfaint\x1b[0m')fmt.Print("\x1b[2mfaint\x1b[0m")console.log('\x1b[2mfaint\x1b[0m')printf("\x1b[2mfaint\x1b[0m\n");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- git log --oneline暗灰色的简写提交哈希
- starship secondary segments (jobs, hostname)
- bat line-number gutter
- delta (git diff pager) line numbers
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 为什么
\x1b[2m在 macOS Terminal.app 上和普通文本看起来一样? - ECMA-48 §8.3.117 对视觉表现的措辞刻意宽松(「降低强度」),并未规定具体的暗淡程度。Terminal.app 只做轻微 alpha 混合,在低对比度主题下与未暗淡几乎无差别。iTerm2、kitty、alacritty、wezterm、ghostty 按约 60% 不透明度混合——同样的代码在那里能看出明显暗淡。换终端或换高对比度主题;不要单独用 SGR 2 作为「次要内容」的信号载体。
\x1b[22m是只关加粗,还是连暗淡也关?- 都关。ECMA-48 把加粗(SGR 1)/ 正常(默认)/ 暗淡(SGR 2)视为单一的三态强度属性,所以
\x1b[22m(「正常强度」)会清掉当前生效的加粗或暗淡。没有「只关暗淡保留加粗」的参数——要这样做,发\x1b[0m然后用\x1b[1m重新加粗。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 支持 | 支持 | 支持 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |