如何确定控制台输出的当前颜色?

如何确定控制台输出的当前颜色?

我知道,如果有彩色终端可用,就可以使用转义字符为其输出着色

但是是否有可能知道输出当前显示为哪种颜色?或者更好的是,如果我现在输出文本,文本会是什么颜色?

我要求在使用这些转义字符时不要破坏任何以前的颜色设置。 “默认前景色”转义字符是从配色方案获取信息,而不是从更改之前的文本颜色获取信息。

答案1

在其中,xterm您可以通过更改查询的颜色更改转义来获取报告的当前颜色 RGB 颜色代码。使用ESC ] Ps m- 但添加?问号。来自文档:

  • 如果"?"给出 a 而不是名称或 RGB 规范,xterm则以相同形式的控制序列进行回复,该控制序列可用于设置相应的动态颜色。由于在一个控制序列中可以给出多于一对的色号和规格,因此xterm可以做出多于一个的回复。
    • P s = 1 0 → 将 VT100 文本前景色更改为 P t 。
    • P s = 1 1 → 将 VT100 文本背景颜色更改为 P t 。
    • P s = 1 2 → 将文本光标颜色更改为 P t 。
    • P s = 1 3 → 将鼠标前景色更改为 P t 。
    • P s = 1 4 → 将鼠标背景颜色更改为 P t 。
    • P s = 1 5 → 将 Tektronix 前景色更改为 P t 。
    • P s = 1 6 → 将 Tektronix 背景颜色更改为 P t 。
    • P s = 1 7 → 将突出显示背景颜色更改为 P t 。
    • P s = 1 8 → 将泰克光标颜色更改为 P t 。
    • P s = 1 9 → 将突出显示前景色更改为 P t 。

我严重怀疑这是否可能在另一个终端模拟器中工作,但如果xterm你运行...

printf '\033]11;?\007'

...xterm将把如下序列推回终端的输入缓冲区...

11;rgb:ffff/ffff/ffff

...用于背景或前景:

printf '\033]10;?\007'

10;rgb:0000/0000/0000

答案2

一般来说,获取当前颜色是不可能的。终端的控制序列处理发生在终端“内部”,无论终端位于何处。带终端模拟器例如,xterm或者内置于提供内核虚拟终端的操作系统内核中的模拟器,模拟器的内部状态,包括其当前“图形再现”的概念(即颜色和属性),位于机器本身上并且理论上是无障碍。但对于真实终端,此信息位于通过串行链路连接的物理独立机器上的某个 RAM 位置。

也就是说,一些终端包括一种用于读出此类信息的机制,作为其终端协议的一部分,该信息通过串行链路发送。它们提供程序可以发送到终端的控制序列,从而使其退还有关其内部状态的信息,作为终端输入。 已向您展示了终端仿真器响应mikeserv的控制序列。xterm但这些都是特定于xterm.例如,Linux 内核和各种 BSD 内核中的内置终端仿真器是不同的终端类型,并且根本不实现任何此类控制序列。这同样适用于整个真实终端系列。

DEC VT525 终端实现了读出机制,但具有一组与 所使用的控制序列无关的控制序列xterm。发送 DECRQSS(请求选择或设置)序列来请求当前图形再现,终端通过发送 DECRPSS(报告选择或设置)进行响应。具体来说:

  1. 主机发送:DCS $ q mST(以SGR的控制功能部分为设置的DECRQSS)
  2. 终端响应:DCS 0 $ r 0 ; 3 3 ; 4 4 mST(DECRPSS 具有设置当前前景色和背景色的 SGR 控制序列的参数和控制功能部分)

当然,仔细阅读你的问题就会发现,你再次向那些欧洲货币体系挥舞着巧克力香蕉。你是什​​么实际上尝试做的事情是,您选择了一个解决方案,然后询问如何执行该解决方案的一部分保留之前的状态当你写一些彩色输出时。不仅有一个用于执行此操作的 DEC VT 控制序列,还有一个可以被xterm各种内核内置终端仿真器识别的 SCO 控制台终端序列,以及一个 termcap/terminfo 条目,可以告诉您它们对于您的终端而言是什么。

termcap 条目是scrc。 terminfo 条目是save_cursorrestore_cursor。这些名称在效果上有些误导(尽管它们确实起到了警告作用,表明您所依赖的东西是事实上的而不是法律上的)。实际的 DECSC、DECRC、SCOSC 和 SCORC 控制序列也会保存和恢复当前的图形再现。

鉴于您指出的文章都是关于从 shell 脚本生成控制序列,您所使用的命令现在寻找的是tput.

进一步阅读

相关内容