进一步阅读

进一步阅读

如何反转控制台颜色,在白屏上显示黑色字母?

tput rev

有点作品,但只有一些角色的背景是白色的,屏幕的其余部分仍然是黑色的,看起来有点奇怪。如何将整个控制台背景更改为白色,即使没有字符?

问题的延伸是如何使它成为其他颜色,例如黄色背景,黑色前景?

tput setaf 0 && tput setab 3

确实如此,但同样 - 没有字符的背景仍然是黑色的。

我说的是不使用 X 的文本控制台,或者是当您在 X 中按 Cltr+Alt+F1 并获得全黑屏控制台登录时得到的控制台,而不是在 x 终端窗口中。

这是 Debian不稳定/sid。

答案1

倒车影像很有趣。

terminfo 模型过于简单且错误。它与终端仿真器和真实终端的实际操作方式不匹配。在这里,您实际上不会对 terminfo 有太多了解。

真实终端的模型乍一看非常简单:

  • 存在一组当前的颜色和属性,其中之一是反视频属性。反转视频会导致字符字形中的像素反转:像素是背景颜色和离开像素是前景色。
  • 有一个全屏反相视频设置,可以反转所有单元格的反相视频属性的意义。将其设置为打开,所有反转的字符单元都将不反转显示,反之亦然。

对于单色视频终端,这只是硬件中的一些异或逻辑。

反视频属性当然是SGR 7和SGR 27,几十年来几乎没有人做除ECMA-48之外的任何事情。全屏反相视频设置由源自 DEC VT 的控制序列控制,称为 DECSCNM(DEC 屏幕模式)。这是一种供应商私有模式,ECMA-48 为其提供了机制。这些序列只是 DEC 私有模式 #5 的 ECMA-48 SM 和 RM。

如果你真的如果想要反转整个屏幕,而不仅仅是下一行输出,DECSCNM 是最佳选择。许多终端模拟器都可以识别并响应 DECSCNM,包括 Unicode rxvt、基于 VTE 库的终端模拟器、Konsole、kitty、KiTTY、PuTTY、XTerm、Linux 内置终端模拟器以及 my console-terminal-emulatorin the nosh 工具集。

您可以使用 打印 DECSCNM 控制序列printf。它没有 terminfo 功能。这超出了有限的 terminfo 模型。对于那些不想记住控制序列的人,我的便携式设备setterm提供了一种方便的方法来执行此操作:

%setterm -7 --反转屏幕打开
%setterm -7 --反转屏幕关闭

这就是事情变得糟糕的地方。

现实中,有颜色和属性集。有用于绘制打印字符的集合,还有用于擦除字符和绘制通过滚动引入的空白行和列的集合。名为的设置擦除颜色模式(DECECM) 控制这两个集合的不相交程度。在实际的最新型号 DEC VT 上,默认设置是它们基本相同,擦除/滚动颜色与打印颜色匹配。然而,太多终端模拟器将其 DECECM 设置初始化为旧约定,即擦除/滚动颜色与打印颜色不同,并且始终为 SGR 39/SGR 49。

初始状态可以通过 PuTTY 中的复选框进行选择,称为背景颜色擦除。 terminfo 模型也这么称呼它,但把它倒过来了。在首先拥有它的终端上,它是可设定模式,不是终端的固定方面。它可以由发出控制序列的主机进行切换。 terminfo 不提供设置它的功能,但是,仅提供一个固定值标志来说明它是关闭还是打开,这可能与终端的当前状态不匹配。再次,对于那些不想记住控制序列的人:

%setterm -7 --bce 上
%setterm -7 --bce 关闭

但DECECM严格来讲仅控制(背景)颜色。严格来说,它并不连接属性。擦除/滚动的字符单元不需要被赋予为打印字符分配的反向视频属性(或者实际上任何其他属性,例如下划线)。有些终端(例如我的终端和 FreeBSD 内核内置终端仿真器)可以,但很多则不能。

此外,它仅适用于首先发生擦除/滚动的情况。不擦除/滚动但不打印到行的整个长度也会留下不同颜色/属性的部分。

这就是为什么人们在许多此类终端仿真器上看到的行的其余部分不是反白的。 (如果使用我的终端仿真器或 FreeBSD KVT,则整行在滚动时会以反白形式显示,或用 EL 擦除。请参阅printf '\e[7m\e[117hwibble\e[K\n'任一结果。)

如果这还不够,还有很多奇怪的行为:

  • 当 DECECM 设置为打开时,PuTTY 及其衍生产品(例如名称容易混淆的 MobaXTerm)将擦除颜色链接到背景颜色,但不会类似地传播反向视频。享受(在屏幕的最后一行)部分行是反相视频、部分不是反相视频的效果,但颜色保持不变:
    tput setaf 4 ; tput 设置 3 ;输出转速;回声摆动
    Windows Terminal 似乎也能做到这一点。
  • Interix 终端仿真器可以使用 SGR 7 打开反向视频,但无法识别 SGR 27 将其关闭。
  • 一些终端模拟器对于反向视频有着疯狂的“我比你清楚”的想法,例如 Unicode rxvt切换到完全不同的颜色对如果背景色和前景色设置为相同,然后打开反相视频。享受根本没有蓝色和:
    tput setaf 4 ; tput 设置 4 ;输出转速;回声摆动

人们可能会认为放弃反向视频和擦除/滚动,而只使用全屏反向视频。但乐趣并没有停止:

  • PuTTY 将快速打开和关闭 DECSNM 解释为尝试敲响铃声。
  • 几个终端模拟器会交换亮色和暗色。请求 DECSCNM 较低的深色背景,您将得到浅色背景,反之亦然。
  • Windows 终端响应 DECSCNM 更改多个调色板条目,特别是索引颜色 #232。 XTerm 也会更改调色板。

所以,是的,打印全宽反向视频条的全屏应用程序要么必须使用 DECECM 和 EL 序列进行一些工作(这与延迟换行一起使用很棘手,我什至没有提到)……或者是只是打印大量空格,显式交换前景色/背景色,并完全避开反向视频。

进一步阅读

相关内容