关于如何在各种环境中启用 256 色存在很多问题。我想做相反的事情:将所有应用程序限制为我精心挑选的 16 种调色板。原因是我想防止应用程序使用难以阅读的颜色。
我尝试在 bashrc 中设置TERM=xterm
,但没有明显效果。
答案1
由于多种原因,这是不可能的。
应用程序仍然在使用各种颜色系统来告诉终端使用什么颜色,ECMA-48:1976 中最初的 1970 年代 8 色系统、1990 年代的 AIXterm 16 色系统、ISO 8613-6/ITU T.416索引20 世纪 90 年代的色彩系统和 ISO 8613-6/ITU T.416直接的20世纪90年代的色彩系统。
第一个原因:这四个中只有三个涉及调色板。 直接颜色则不然。如果您的应用程序发出直接颜色控制序列,则除了直接重新配置或重新编码应用程序(以某种方式)以更改所使用的颜色之外,无法更改其颜色。 (一些终端仿真器不能很好地支持直接颜色,并且当它们被告知使用直接颜色控制序列时会涉及调色板。然而,这并没有给出任何合理的有效控制形式,因为它是一种最接近的匹配机制;而且这些终端仿真器不是一般情况。)此外,TUI 应用程序没有通用的“配色方案”用户偏好系统(某些 GUI 应用程序的 GUI 中有这种系统)。
第二个原因:调色板不是 16 个条目。 几乎所有具有此类调色板的终端仿真器都具有 VGA 样式的 256 项调色板,并且它与用于 8 色和 16 色控制序列的调色板相同。 (微软终端的人们曾经思考过将它们分开的可能性,但据我所知,没有一个终端仿真器作者真正做到了这一点。)调色板本身没有模 16 或模 8 限制。
第三个原因:16色并不简单。 当彩色终端出现时,最初(忽略了一些细节)有 8 种标准颜色。 16 色是一种扩展,并且将粗体、闪烁和下划线文本属性与颜色混为一谈会造成混乱。乱七八糟的历史和细节已经超出了这个答案的范围,最终还是有清理混乱的压力,但结果是有现在对于何时以及如何获得这 16 种颜色中的至少 8 种存在分歧。您的申请不一定会同意您的要求。
讽刺的是,你设置的想法TERM
特别linux
糟糕,因为它是引起特别严重分歧的方式之一。 (也就是说,此外,忽略了这样一个事实:设置与正在使用的终端不匹配的错误终端类型是错误的做法,即本身就是一个答案.) 这是告诉应用程序的方法之一不使用AIXterm 16 色系统,但使用滥用替代颜色属性的 8 色系统。
理由四:16色不简单。 不幸的是,一些终端模拟器会根据屏幕的“亮/暗背景”设置和反向视频属性等动态更改调色板中的前 16 个条目。因为他们比您和您的应用程序更了解。 ☺
第五个原因:终端和终端仿真器不使其可配置。 当应用程序发出此类控制序列时,不可能告诉终端(模拟器)不理解 256 色索引颜色或 24 位直接颜色。据我所知,没有终端模拟器有一个开关可以将其控制序列处理转换为颜色离开。
因此,人们唯一能做的就是(尝试)告诉应用程序不发射控制序列,而不是告诉终端拒绝理解它们。该理论认为,指定一个 (正确的) 终端类型在环境变量中带有-16color
或-mono
或类似的后缀TERM
,并且因为这限制了 terminfo 库作为指定颜色的控制序列产生的内容,所以应用程序根本不知道如何指定比这更多的颜色。这就引出了第六个原因。
第六个原因:应用程序倾向于硬连线颜色而不使用 terminfo。
再说一遍,这背后有一大堆混乱的历史,超出了这个答案的范围,但每个人都使用terminfosetab
和setaf
功能的想法只是一个白日梦。 A很多的应用程序将颜色控制序列直接硬连线到其代码中。这尤其包括用 Python 和 Go 等编程语言编写的应用程序,这些应用程序倾向于使用那些语言中的(半)可移植库,这些语言既晚于 terminfo,又不从庞大的终端类型数据库进行操作。 (我遇到过这个Python的,例如,就在前几天。)但人们甚至可以发现它是在一些用 C 编写的常见 GNU 工具中完成的。
答案2
来自评论:TERM=linux
有效。我也尝试过TERM=xterm-16color
,但没有效果)。