用于设置深色或浅色终端背景的公共环境变量

用于设置深色或浅色终端背景的公共环境变量

我写了一个数字 调试器所有这些都可以对终端会话中显示的源代码文本进行着色。他们都知道有些终端有深色背景,有些终端有浅色背景,当然颜色需要根据终端方案而有所不同。

当你的终端与默认背景不匹配时,必须设置为其他方案是很烦人的,所以我想找到一种方法来自动解决这个问题。建议? (他们都支持选项--highlight={light|dark|plain}

一种简单的机制是关闭环境变量。对于我的 shell 配置文件,我一直在使用DARK_BACKGROUND_COLOR,但是如果已经有某种默认名称,例如PAGEREDITORSHELLHOME等,我想使用它。

有这样的环境名称约定吗?其他建议?

编辑:根据接受的答案和讨论,我已从使用切换DARK_BACKGROUND_COLORCOLORFGBG.值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 种标准颜色之一来近似前景色和背景色。如果您只关心浅色与深色,那不是问题,只需设置COLORFGBG15;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 特定代码,但人们应该随意提交拉取请求来处理该代码或添加任何其他更正。

相关内容