SGR 7 — 反相显示
交换前景色与背景色。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[7m\033[7m\e[7mESC [ 7 m1b 5b 37 6d实时预览
在浏览器中通过与解码器相同的分词器渲染 —— 无需打开终端。
说明
ECMA-48 §8.3.117 把 SGR 7 命名为「negative image」(负像),日常说法是「reverse video」或「inverse video」(反相 / 反白)。字节序列为 \x1b[7m。终端把*当前活动*的前景与背景色交换给后续字符 —— 如果你的提示符是默认前景叠默认背景,反相就翻成默认背景叠默认前景。关键在于:交换作用于*当前活动*的前 / 背景对,而非终端主题默认色:\x1b[31;43m(红字黄底)后接 \x1b[7m 得到的是黄字红底,而非主题默认反相。配对关闭码 SGR 27(\x1b[27m)恢复正像,不动底层前 / 背景状态。
SGR 7 在所有 SGR 属性中支持面最广 —— 上方矩阵中的每个终端都渲染,包括 Linux console / fbcon 与旧 Windows cmd.exe(而 SGR 2 / 3 / 4:N / 9 在那里都以不同方式退化)。这使其成为无法确定用户是否在现代 GUI 终端时最安全的信号载体属性:救援提示符、嵌入式开发板、受限 CI 日志、Apple 上的 screen 5.0 会话都正确渲染 SGR 7。经典应用是 less、vim、fzf、htop、tmux 中的选区高亮 —— 它们都首选反相视频,正是看中其通用性。terminfo cap 为 rev(tput rev / 关闭用 tput sgr0 —— 多数 terminfo 条目没有精准的 rmrev,不过部分终端上 smso / rmso「standout」映射到 SGR 7 / 27)。watch --differences=cumulative 用 SGR 7 标记变更单元;TUI 菜单库(dialog、whiptail、bubbletea 的默认高亮样式)把焦点行默认设为反相,因为掺入显式颜色有撞用户主题的风险。
使用 SGR 27(\x1b[27m)关闭 —— 精准,不动前 / 背景 / 加粗 / 斜体 / 下划线 / 删除线。要避开的 pitfall:把 SGR 7 叠在一个*未知*的颜色对上(例如 cat 任意 ANSI 日志时)—— 结果取决于先前活动的前 / 背景,而非稳定的「主题默认反相」。修复办法是在 SGR 7 之前显式发 \x1b[39;49m(把前景与背景都重置为默认值),使主题相对反相可预测。在无障碍方面,反相视频是为数不多读屏能间接传达的属性(NVDA / JAWS 视终端集成情况会把带反相的单元朗读为「selected」或「highlighted」)—— 但按 color-only-signal,在意义关键时仍应同步搭配显式文本。相关:sgr-fg-basic / sgr-bg-basic(想要主题稳定高亮时与反相组合的显式颜色对)、sgr-reset(SGR 0 —— 完整重置)。
规范出处: ECMA-48 §8.3.117 (SGR parameter 7)
示例
printf '\033[7m highlighted \033[0m\n'print('\x1b[7m highlighted \x1b[0m')fmt.Print("\x1b[7m highlighted \x1b[0m")console.log('\x1b[7m highlighted \x1b[0m')printf("\x1b[7m highlighted \x1b[0m\n");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- less在当前搜索匹配行上反显
- fzf选择器中当前光标所在行使用反显作为指示
- vim, neovim在单色终端上 CursorLine 和 Visual 高亮组默认使用反显
- man (search highlight on /pattern)
- htop — selected row indicator
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 为什么
\x1b[7m文本被选区高亮覆盖后看不见了? - 终端的文本选区高亮本身就是用反相视频实现的。选中一段已经设了 SGR 7 的文本时,两次反相 XOR——单元渲染回正像,反相区段就跟周围非反相文本视觉一致了。xterm / iTerm2 / kitty / wezterm / ghostty 都是有意为之,不是 bug。需要不受选区影响的高亮,就用显式前 / 背景对(如
\x1b[37;41m)代替 SGR 7。 - 关闭
\x1b[7m用\x1b[27m还是\x1b[0m? \x1b[27m是「正像」精准关闭码——只取消反相,不动前 / 背景、加粗、斜体、下划线、删除线。\x1b[0m也能取消反相,但会同时清掉同一段内你设置的所有其他 SGR 属性。已经处于带样式段落中时优先用\x1b[27m;只在整段样式末尾用\x1b[0m。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |