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

Nat*_*man 29 colors xterm ansi

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

如果这是可能的:

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

Maj*_*nko 33

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

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

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

\e[<number>m
Run Code Online (Sandbox Code Playgroud)

其中<number>之一是:

前景:

  • 30黑色
  • 31红
  • 32绿色
  • 33黄色
  • 34蓝
  • 35 洋红色
  • 36 青色
  • 37白

背景:

  • 40黑色
  • 41红色
  • 42绿色
  • 43黄色
  • 44蓝
  • 45 洋红色
  • 46 青色
  • 47白

  • 0 全部重置

  • 1 粗体

因此,要使您的前景为红色,背景为黄色:

$ echo -e "\e[31m\e[43m"
Run Code Online (Sandbox Code Playgroud)

并启用粗体:

$ echo -e "\e[1m"
Run Code Online (Sandbox Code Playgroud)

当然,您可以将它们全部组合在一起:

$ echo -e "\e[31m\e[43m\e[1m"
Run Code Online (Sandbox Code Playgroud)

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

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

$ echo -e "\e[2J\e[1;1H"
Run Code Online (Sandbox Code Playgroud)

这在更改颜色时很有用:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"
Run Code Online (Sandbox Code Playgroud)

这将改变颜色,清除屏幕,并将光标放在左上角。好吧,几乎是左上角。Echo 输入一个回车,所以它向下移动一行。-n如果你很挑剔,你可以添加到 echo 来防止这种情况。

如果您搞砸了一切并且看不到您正在输入的内容,您可以通过按以下键将终端颜​​色重置为正常:

Ctrl+v [ 0 m Return

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

  • 但是需要注意的是,多个颜色代码可以用“;”分隔。所以为了让你的前景红色和你的背景黄色你也可以使用较短的:`echo -ne '\e[31;43m'`(而不是上面的 `echo -e "\e[31m\e[43m"` )。 (3认同)

小智 29

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

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

echo -ne "\033]11;#53186f\007"
Run Code Online (Sandbox Code Playgroud)

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

您可以在网上花费 HOURS 寻找此信息 - 大多数文档只讨论原始的 16 种 ANSI 颜色。

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

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

  • 这对我有用,而其他人没有 - 非常有帮助,谢谢 (2认同)
  • 我建议改进这个答案,以便它告诉如何设置前景色和光标颜色。将 fg 的 11 更改为 10,将光标更改为 12。 (2认同)

小智 5

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

ESC[<<<CODE>>>
Run Code Online (Sandbox Code Playgroud)

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

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

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

ESC[<<<SGR>>>m
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)
Run Code Online (Sandbox Code Playgroud)

注意:替代用途包括\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
Run Code Online (Sandbox Code Playgroud)

要获得浅色,可以使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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