跳到主要内容
ansicode

SGR 2 — 暗淡 / 减弱

以降低亮度(faint/暗淡)渲染后续文本。

字节形式

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

\\x1b[\x1b[2m
\\033[\033[2m
\\e[\e[2m
ESC [ESC [ 2 m
hex1b 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)

示例

bash
printf '\033[2mfaint\033[22m back\033[0m\n'
python
print('\x1b[2mfaint\x1b[0m')
go
fmt.Print("\x1b[2mfaint\x1b[0m")
javascript
console.log('\x1b[2mfaint\x1b[0m')
c
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
支持

相关序列