跳到主要内容
ansicode
SGR(颜色与属性)

SGR 转义码 —— 颜色与文本属性

Select Graphic Rendition。`ESC [ … m` 这一族 —— 终端中所有上色、加粗、斜体、下划线、闪烁、反相、删除线等文本样式属性的编码。是 ANSI 字母表中最庞大、也最常被检索的角落。

24 条序列

颜色食谱 —— 六步把整族读透

SGR 是 ANSI 字母表里最庞大的一支 —— 凡是给字形上色或加修饰的转义码全在这里。下面六步从浅入深读一遍,就能把整族吃透:怎么收尾、原始 16 色、256 索引调色板、24-bit 真彩色、用 OSC 临时换色,以及标准党更爱的冒号子参数写法。

  1. 1. 一键归零 —— \x1b[0m

    每一段彩色文本都用 \x1b[0m 收尾。它会把上次 SGR 打开的 fg + bg + 全部修饰位(粗体、斜体、下划线之类)一次清零。漏写就会让颜色渗到下一行 prompt、shell 的 PS1、甚至你 pipe 进去的文件里去。把它当作每段彩色输出的「闭括号」。\x1b[m(空参数)按 ECMA-48 是一样的意思,但实际工具几乎清一色写 \x1b[0m

  2. 2. 基础 16 色 —— \x1b[31m 那一票

    ECMA-48 时代的原始调色板:30–37 选 8 个前景色(黑、红、绿、黄、蓝、品红、青、白),40–47 选对应背景色。再加 1; 就是加粗 —— 很多终端在加粗的同时让颜色变亮,所以 \x1b[1;31m\x1b[31m 更红。亮色也可以直接用 90–97(前景)和 100–107(背景)—— 多出来的 8 槽不必依赖加粗。39 / 49 是配套的「默认 fg」与「默认 bg」复位码,需要把颜色还原又想保留 bold / italic 时正好用得上。

  3. 3. 256 索引色 —— \x1b[38;5;n m

    xterm-256color 调色板:0–15 镜像 16 个基础/亮色;16–231 是 6×6×6 RGB 立方体(每档取 0、95、135、175、215、255,不是线性 0–255);232–255 是 24 级灰度,从近黑到近白。要橙色就 \x1b[38;5;208m,要中灰就 \x1b[38;5;244m38 是前景、48 是背景,其余写法完全一致。除非是 1995 年前的老 console,几乎所有终端都支持 —— 连 ssh 套 screentmux 也吃得动,只要里层 $TERMxterm-256color / screen-256color / tmux-256color 之一。

  4. 4. 真彩色 —— \x1b[38;2;r;g;b m

    256 不够用时上 24-bit RGB。\x1b[38;2;255;128;0m 精确画出 #FF8000 橙色;\x1b[48;2;30;30;30m 给一个近黑背景。现代终端(kitty、alacritty、wezterm、iTerm2、Windows Terminal、gnome-terminal ≥ 3.20、konsole、ghostty)全都支持。运行时探测最稳的是看 $COLORTERM 环境变量 —— 等于 truecolor24bit 就放心发 RGB;为空就退化到最接近的 256 索引槽。光看 $TERM 不靠谱:xterm-256color 并不意味着支持真彩色,反过来很多终端 $TERM 只是普通的 xterm 但仍然把 $COLORTERM 设了。

  5. 5. OSC 调色板覆盖 —— 直接把槽位本身改了

    严格来说这是 OSC,不是 SGR —— 但「我那个红能不能调好看一点」的读者大多落在这里。OSC 4 ; n ; rgb:RR/GG/BB ST 临时覆盖调色板第 n 槽(0–255)。所以 \e]4;1;rgb:e0/3a/3a\e\\ 就重调了 \x1b[31m 用的红。配合 OSC 10 改默认前景、OSC 11 改默认背景;再用 OSC 104 ; n ST 把第 n 槽恢复成出厂值,或者干脆 OSC 104 ST(不带参数)一次恢复全部。给 TUI 做主题切换很好用,不用逼用户改终端配置。

  6. 6. SGR 冒号子参数 —— 真正符合标准的写法

    ECMA-48 规定子参数分隔符是冒号(:)而不是分号 —— 38:2::r:g:b 才是标准里的 truecolor 写法(2r 之间空着的那一格是色彩空间 ID,通常省略)。多数终端两种都吃(xterm 历史遗留),但 wezterm、kitty、foot、Linux 内核 console 在新的 SGR 扩展里只认冒号形式 —— 比如下划线颜色。举一个 21 世纪的例子:要在默认色文字下画一条红色波浪下划线就是 \x1b[4:3m\x1b[58:2::255:0:0m4:3 开启卷曲下划线,58:2::r:g:b 把下划线颜色独立于前景色设定。看到 SGR 解析器行为「怪怪的」时,记得它可能就栽在分号/冒号这里。

本家族的全部序列

浏览其他家族