如何使用 Ansi 转义序列更改 xterm 的颜色?

如何使用 Ansi 转义序列更改 xterm 的颜色?

我想从命令行更改 xterm 的颜色(背景、字体、前景)。我听说这可以使用 ANSI 转义序列来实现。

如果可能的话:

  • 如何完成?
  • 我可以使用颜色名称吗?还是必须使用它们的 RGB 代码?

答案1

ANSI 转义序列由以转义字符(字符 27)开头的一系列字符组成。下一个字符通常(但不总是)是开方括号:[

-e如果您指定并用于\e转义,echo 命令可以发送转义字符。

ANSI 标准定义了 8 种颜色,加上一种明亮模式,总共有 16 种可能性。顺序如下:

\e[<number>m

其中之一在哪里<number>

前景:

  • 三十 黑色
  • 三十一 红色
  • 三十二 绿色
  • 三十三 黄色
  • 三十四 蓝色
  • 三十五 洋红色
  • 三十六 青色
  • 三十七 白色

背景:

  • 四十 黑色
  • 四十一 红色
  • 四十二 绿色
  • 43 黄色
  • 四十四 蓝色
  • 45 洋红色
  • 四十六 青色
  • 四十七 白色

  • 0 全部重置

  • 1 粗体

要使前景变为红色,背景变为黄色,请执行以下操作:

$ echo -e "\e[31m\e[43m"

并启用粗体:

$ echo -e "\e[1m"

当然,你可以将它们组合在一起:

$ echo -e "\e[31m\e[43m\e[1m"

还有许多其他的转义代码可以用于做其他事情。

例如 - 清除屏幕并将光标移动到左上角:

$ echo -e "\e[2J\e[1;1H"

改变颜色时这很有用:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

这将改变颜色,清除屏幕,并将光标放在左上角。嗯,几乎是左上角。Echo 会输入回车符,因此它会向下移动一行。-n如果您很挑剔,可以添加到 echo 中以防止这种情况发生。

如果你搞乱了一切,看不到你输入的内容,你可以按以下方法将终端颜色重置为正常:

Ctrl+v [ 0 m Return

您希望看到命令提示符。它会抱怨未知命令,但您将能够再次看到您正在做什么。

答案2

请注意,现代 Xterms 支持 32 位颜色!

简单的例子。要设置一个漂亮的深紫色背景(嘿,每个人都有自己的背景)值为 #53186f,你可以这样做:

echo -ne "\033]11;#53186f\007"

请注意,这会立即改变整个窗口的颜色,而不仅仅是后续文本的颜色。这对于在 ssh 连接到服务器后使窗口明显不同(例如)尤其有用。将上面的“echo”放入您的 .bashrc 中,当您登录该服务器时,您的终端会自动更改颜色(但当您按 Ctrl-D 退出时不会变回原样)

您可以花几个小时在网上寻找这个 - 大多数文档只讨论原始的 16 种 ANSI 颜色。

资料来源:http://www.steike.com/code/xterm-colors/http://rtfm.etla.org/xterm/ctlseq.html(查看“操作系统控制”)

请注意:上述转义序列对 XTerms 有效,可能不适用于其他“类似 XTerm”的窗口终端仿真器实现,这些仿真器可能“看起来”像 XTerm。例如,“gnome-terminal”或“konsole”具有不同的转义序列,或者可能根本没有实现颜色变化。

答案3

是的。ANSI 终端支持ANSI 转义码. 每个Control Sequence IntroducerCSI)代码的格式如下:

ESC[<<<CODE>>>

Ascii 字符27ESC字符)或1b十六进制,后跟左方括号,然后是表示要使用的操作的字母。

;请注意,可以在参数之前直接提供分隔参数的列表<<<CODE>>>

CSI现在,颜色使用代码的子集,即Select Graphic Rendition代码。这些代码的形式为:

ESC[<<<SGR>>>m

代码SGR作为参数传递CSI。与您的问题相关的是SGR代码 30-49。代码 30-39 设置前景色。代码 40-49 设置背景色。

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

代码 38 和 48 是特殊代码。这些代码允许您使用 RGB 值。它们的格式为:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

注意:其他用途包括\x1b[<3 or 4>8;5;<web safe color index>m。这种用法有完全不同的颜色编码。有关更多信息,请参阅此答案顶部的链接。

代码 39 和 49 将前景色和背景色设置为其默认值,这些默认值是根据每个终端定义的。

实际上,30-37 和 40-47 的颜色与其标签所示的颜色略有不同。

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

要获得浅色,可以使用 SGI 表示粗体1。粗体是一个误导性的名称。它不会使字体变粗。它实际上增加了文本的亮度。应用粗体后,颜色变为:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

注意:最后两个颜色块的数字与前景和背景都相关(<index> + (30 or 40))。

要删除所有样式(返回默认/正常模式),请使用SGR0。

CSI代码并非全部都是图形化的。例如,ESC[2J将清除您的终端。ESC[<y>;<x>H设置光标位置(1 索引)。有关更多信息,请参阅维基百科文章。

注意:要测试这些,请使用echo -eprintf

答案4

还检查一个项目ScriptEchoColor
它完全由 bash 脚本编写,
有适用于 ubuntu 的软件包这里
但是如果您知道如何操作,这些脚本可以在任何发行版上安装(最新的也可以从其 git 下载)。

您可以使用缩短或扩展的颜色名称,例如:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

一个样品: 在此处输入图片描述

另外,一定要看看终端控制,以便对 xterm 本身进行更广泛的控制(而不仅仅是字符)。

相关内容