![用于设置深色或浅色终端背景的公共环境变量](https://linux22.com/image/78144/%E7%94%A8%E4%BA%8E%E8%AE%BE%E7%BD%AE%E6%B7%B1%E8%89%B2%E6%88%96%E6%B5%85%E8%89%B2%E7%BB%88%E7%AB%AF%E8%83%8C%E6%99%AF%E7%9A%84%E5%85%AC%E5%85%B1%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.png)
我写了一个数字 的 调试器所有这些都可以对终端会话中显示的源代码文本进行着色。他们都知道有些终端有深色背景,有些终端有浅色背景,当然颜色需要根据终端方案而有所不同。
当你的终端与默认背景不匹配时,必须设置为其他方案是很烦人的,所以我想找到一种方法来自动解决这个问题。建议? (他们都支持选项--highlight={light|dark|plain}
)
一种简单的机制是关闭环境变量。对于我的 shell 配置文件,我一直在使用DARK_BACKGROUND_COLOR
,但是如果已经有某种默认名称,例如PAGER
、EDITOR
、SHELL
、HOME
等,我想使用它。
有这样的环境名称约定吗?其他建议?
编辑:根据接受的答案和讨论,我已从使用切换DARK_BACKGROUND_COLOR
到COLORFGBG
.值15;0
适用于深色背景(技术上为黑底白字),0;15
(技术上为黑底白字)适用于浅色背景。
答案1
没有这样的约定。此外,环境变量不是报告有关终端的信息的好方法,因为如果程序启动另一个不更新此变量的终端仿真器,或者如果程序连接到多个终端,则该值可能会过时。
(TERM
环境变量不会遇到这些问题,因为它是通用的:每个终端仿真器都会设置它并且每个程序都知道它。只有当变量受到部分支持时才会出现问题。)
获取信息的正确方法是查询终端。在 Unix 世界中,这是通过编写转义序列来完成的,终端将其解释为“发回一些回答我的查询的数据”。作为托马斯·迪基解释说,xterm有这样一个控制序列,OSC 11 ; ? BEL
(设置文本参数,参数11=文本背景颜色,value?
表示查询而不是设置)。写入\e]11;?\a
终端(其中\e
是转义字符 ( ^[
),\a
是响铃字符 ( ^G
)),xterm 会回复类似的字符串\e]11;rgb:0000/0000/0000\a
(这是黑色背景)。不幸的是,很少有其他终端仿真器支持此转义序列。即使在 xterm 中,此功能也可能被禁用(通过XTerm.VT100.allowColorOps
资源),因为这是一个安全风险:写入终端可能会导致输出到该终端,而该终端的输出部分受正在写入的文本控制。
Rxvt 将环境变量设置COLORFGBG
为一个字符串,7;0
其中7
是前景色(7 是浅灰色),0
是背景色(黑色)。 Konsole 也支持这一点。
Emacs 尝试检测终端的背景是浅色还是深色,以便设置background-mode
终端参数。从 Emacs 24.5 开始,有三种方法可以自动设置后台模式:
- 在xterm,Emacs 使用
OSC 11
如上所述的转义序列。 - 在接收值,Emacs 使用
COLORFGBG
环境变量,如上所述。 - 在操作系统和视窗控制台,Emacs 使用操作系统特定的接口来获取有关终端的信息;这些接口起到与转义序列相同的作用
OSC 11
。
这遗漏了许多终端,但是有一些进展:vte 库为许多终端仿真器提供支持,例如 gnome-terminal、guake、terminator、xfce4-terminal 等,实现了OSC 11
像 xterm 一样的报告从0.35.2版本开始。您可以通过检查环境变量来检测基于VTE的终端VTE_VERSION
;该值是一个数字,您需要 3502 及以上。
如果您想标准化向应用程序报告信息的方式,那么终端端的支持可能并不重要:毕竟您知道您喜欢浅色背景还是深色背景。那么您不妨与 rxvt 和 use 保持一致COLORFGBG
,因为它是有人已经在使用的唯一接口,并且您可以独立于任何终端支持而采用它。界面COLORFGBG
是有限的:它是为只有 16 种颜色的世界而设计的,而且每个人都同意一种颜色从颜色数字到颜色的映射(至少大致不同,确切的色调有所不同)。 Konsole 支持超过 16 种颜色,但它在报告时使用近似值COLORFGBG
:它通过 16 种标准颜色之一来近似前景色和背景色。如果您只关心浅色与深色,那不是问题,只需设置COLORFGBG
为15;0
深色背景上的浅色文本或0;15
浅色背景上的深色文本即可。
答案2
空无一人。您可以自由地召开自己的会议。
一些程序(例如xterm
)可以为应用程序提供当前设置的前景色和背景色(请参阅“动态色彩”)。但除了诸如此类的应用程序之外xtermcontrol
,很少有人使用它。 Emacs 查询当前背景颜色以设置其background-mode
终端参数,该参数决定是否应用“深色”或“浅色”版本的颜色主题。另一方面,Vim 可能使用 xterm 控制序列来控制颜色数量以及通过特殊键发送的字符串(请参阅“请求 Termcap/Terminfo 字符串”在XTerm 控制序列),不检测前景色/背景色的感觉。
答案3
基于深思熟虑的答案托马斯·迪基和吉尔斯以及在这个答案的评论中对 OSX 做什么,我已经将这个汇总在一起github 中的脚本。
关键是使用 xterm 兼容的颜色查询,并基于背景与前景的 RGB 颜色值。如果这不起作用,请尝试解释COLORFGBG
并失败,使用各种终端的预设默认值。例如,xterm 默认是浅色背景。
预设默认值和 RGB 暗/亮插值的代码源自 GNU emacs 代码(如 Gilles 所建议)。
我没有添加任何 MS Windows 特定代码,但人们应该随意提交拉取请求来处理该代码或添加任何其他更正。