进一步阅读

进一步阅读

我知道如何在终端中使用 256 种颜色的文本:

printf "\033[38;5;196mhello\n"

但对于背景颜色,我似乎仅限于基本的 8 种颜色,即:

printf "\033[41mhello\n"

如何也使用 256 色作为背景色?

我的意思是,终端已经知道颜色,所以应该是可能的。但语法是什么?

如果相关的话,我将用作terminator我的终端模拟器和zsh外壳。

答案1

在 中zsh,您不需要对转义序列进行硬编码,因为它有几种内置方法来设置背景和前景色。

您可以使用echoti setaf终端setnsia背景f颜色并echoti setab设置b背景颜色(setaf并且是相应erm nfo 功能setab的名称)ti

假设您的终端支持 256 种颜色(正如基于 VTE 的终端,例如您的 gnome-terminator 所做的那样)并且$TERM正确设置为一个值,该值标识具有正确转义序列的 terminfo 条目,那么它应该可以工作。

$ echoti setab 196 | sed -n l
\033[48;5;196m$

或者您可以使用带有print -P%参数扩展标志的提示扩展:

$ print -rP '%K{196}' | sed -n l
\033[48;5;196m$

(这里sed -n l用于显示正在发送的相应转义序列,$只是显示行的结束位置,它不是输出的一部分,\033是 GNUsed命令l对 ESC 字符的表示(具有 ASCII 中的八进制 033 字节值) )

某些终端(包括基于 VTE 的终端,例如 gnome-terminator)也支持 RGB 规格。在这些方面,你可以做

$ print -rP '%K{#ffffff}' | sed -n l
\033[48;2;255;255;255m$

(此处表示fffffff亮白色,因为这是ff所有红色、绿色和蓝色分量的最大值)。在这种情况下,zsh对 xterm 样式序列进行硬编码(请参阅那里为背景),因为没有相应的 terminfo 功能。虽然不是标准,这是目前现代 FLOSS 终端仿真器中支持最广泛的。

%K%F设置前景的背景颜色。 %k/%f恢复默认颜色。

对于不支持但支持 88 或 256 调色板的终端,zsh还有一个zsh/nearcolor模块可以让您获得最接近该 RGB 规格的颜色:

$ zmodload zsh/nearcolor
$ echoti colors
256
$ print -rP '%K{#ffffff}' | sed -n l
\033[48;5;231m$

(这里我的256色终端上的颜色231是最接近亮白色的,它实际上是亮白色)。

如果您有权访问 X11rgb.txt文件,您还可以为每个X11 颜色名称类似的东西:

typeset -A X11_bg X11_fg
while read -r r g b c; do
  [[ $r = [0-9]* ]] || continue
  printf -v hex %02x $r $g $b
  X11_fg[$c]=${(%):-%F{#$hex}}
  X11_bg[$c]=${(%):-%K{#$hex}}
done < /etc/X11/rgb.txt
X11_bg[default]=${(%):-%k} X11_fg[default]=${(%):-%f}

(类似 Debian 的系统已/etc/X11/rgb.txt作为软件包的一部分x11-common)。

做这样的事情:

print -r "$X11_bg[dark olive green]text$X11_bg[default]"

有关更多详细信息,请参阅:

  • man 5 terminfo
  • info zsh echoti
  • info zsh print
  • info zsh "Prompt Expansion"
  • info zsh "The zsh/nearcolor Module"

(请注意,在某些系统上,您需要安装zsh-doc软件包或等效程序才能info使页面可用)。

答案2

printf "\033[48;5;226mhello\e[m\n"

printf "\033[48;2;255;255;0mhello\e[m\n"

越多标准变体旧版本的 VTE 库不支持第二种 (RGB) 形式(其中包括 后未使用的“颜色空间标识符” 2)(例如 Debian 10 上的 Terminator 1.91 使用的 libvte-2.91)。

答案3

前景的直接颜色和索引颜色 ITU T.416 控制序列为 SGR 38:2 和 SGR 38:5。背景的控制序列类似地是SGR 48:2和SGR 48:5。

阅读 ITU T.416 第 13.1.8 节。

%TERM=rxvt-256color setterm -7 --背景“137”|十六进制转储-C
00000000 1b 5b 34 38 3b 35 3b 31 33 37 6d |.[48;5;137m|
0000000b
%

顺便说一句,如果您超越了索引颜色,您需要知道实际上现在有终端仿真器可以正确实现 SGR 38:2 和 SGR 48:2。两个历史错误,现在被一些人纠正,就是没有使用子参数和忘记了色彩空间标识符子参数。 iTerm2 早在 2013 年就修复了这个问题; libvte(在 GNOME Terminator 中使用)添加了:对子参数分隔符的支持2014年,以及(忽略的)颜色空间标识符2017年

%TERM=iterm setterm -7 --背景“137” |十六进制转储-C
00000000 1b 5b 34 38 3a 32 3a 3a 31 37 35 3a 31 33 35 3a |.[48:2::175:135:|
00000010 39 35 6d |95m|
00000014
%

进一步阅读

相关内容