跳到主要内容
ansicode

SGR 7 — 反相显示

交换前景色与背景色。

字节形式

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

\\x1b[\x1b[7m
\\033[\033[7m
\\e[\e[7m
ESC [ESC [ 7 m
hex1b 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。经典应用是 lessvimfzfhtoptmux 中的选区高亮 —— 它们都首选反相视频,正是看中其通用性。terminfo cap 为 revtput rev / 关闭用 tput sgr0 —— 多数 terminfo 条目没有精准的 rmrev,不过部分终端上 smso / rmso「standout」映射到 SGR 7 / 27)。watch --differences=cumulative 用 SGR 7 标记变更单元;TUI 菜单库(dialogwhiptailbubbletea 的默认高亮样式)把焦点行默认设为反相,因为掺入显式颜色有撞用户主题的风险。

使用 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)

示例

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

相关序列