我知道如何在终端中使用 256 种颜色的文本:
printf "\033[38;5;196mhello\n"
但对于背景颜色,我似乎仅限于基本的 8 种颜色,即:
printf "\033[41mhello\n"
如何也使用 256 色作为背景色?
我的意思是,终端已经知道颜色,所以应该是可能的。但语法是什么?
如果相关的话,我将用作terminator
我的终端模拟器和zsh
外壳。
答案1
在 中zsh
,您不需要对转义序列进行硬编码,因为它有几种内置方法来设置背景和前景色。
您可以使用echoti setaf
终端set
nsia
背景f
颜色并echoti setab
设置b
背景颜色(setaf
并且是相应erm nfo 功能setab
的名称)t
i
假设您的终端支持 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 %
进一步阅读
- 编码字符集的控制函数。 ECMA-48。第 5 版。 1991。ECMA 国际。
- 信息技术 — 开放文档架构 (ODA) 和交换格式:字符内容架构。 T.416。国际电信联盟。
- 乔纳森·德博因·波拉德 (2018)。
setterm
。 小吃指南。软件。