如何反转控制台颜色,在白屏上显示黑色字母?
tput rev
有点作品,但只有一些角色的背景是白色的,屏幕的其余部分仍然是黑色的,看起来有点奇怪。如何将整个控制台背景更改为白色,即使没有字符?
问题的延伸是如何使它成为其他颜色,例如黄色背景,黑色前景?
tput setaf 0 && tput setab 3
Run Code Online (Sandbox Code Playgroud)
确实如此,但同样 - 没有字符的背景仍然是黑色的。
我说的是不使用 X 的文本控制台,或者是当您在 X 中按 Cltr+Alt+F1 并获得全黑屏控制台登录时得到的控制台,而不是在 x 终端窗口中。
这是 Debian不稳定/sid。
倒车影像很有趣。
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 --invertscreen 打开 % setterm -7 --invertscreen 关闭
这就是事情变得糟糕的地方。
实际上,有两组颜色和属性。有用于绘制打印字符的集合,还有用于擦除字符和绘制通过滚动引入的空白行和列的集合。名为擦除颜色模式(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'一结果。)
如果这还不够,还有很多奇怪的行为:
tput setaf 4 ; tput 设置 3 ;输出转速;回声摆动Windows Terminal 似乎也能做到这一点。
tput setaf 4 ; tput 设置 4 ;输出转速;回声摆动
人们可能会认为放弃反向视频和擦除/滚动,而只使用全屏反向视频。但乐趣并没有停止:
所以,是的,打印全宽反向视频条的全屏应用程序要么必须使用 DECECM 和 EL 序列进行一些工作(这与延迟换行一起使用很棘手,我什至没有提到)……或者是只是打印大量空格,显式交换前景色/背景色,并完全避开反向视频。
setterm。 小吃指南。软件。