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

roc*_*cky 13 shell source terminal

我已经写了 调试器,所有可以在上色终端会话中所示的源代码的文本。他们都明白,有些终端是深色背景,有些是浅色背景,当然颜色需要根据终端方案而有所不同。

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

一种简单的机制是关闭环境变量。对于我的壳型材我一直在使用DARK_BACKGROUND_COLOR,但如果已经有某种形式的默认名称的像有是PAGEREDITORSHELLHOME,等我想利用这一点。

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

编辑:根据接受的答案和讨论,我已从使用切换DARK_BACKGROUND_COLORCOLORFGBG. 值15;0适用于深色背景(技术上为黑底白字),0;15(技术上为白底黑字)适用于浅色背景。

Gil*_*il' 18

没有这样的约定。此外,环境变量不是报告有关终端的信息的好方法,因为如果程序启动另一个不更新此变量的终端仿真器,或者如果程序连接到多个终端,该值可能会过时。

TERM环境变量不会遇到这些问题,因为它是通用的:每个终端模拟器都会设置它并且每个程序都知道它。只有在部分支持变量时才会出现问题。)

获取信息的正确方法是查询终端。在 unix 世界中,这是通过编写一个转义序列来完成的,终端将其解释为“发回一些回答我查询的数据”。正如Thomas Dickey 解释的xterm 有这样一个控制序列OSC 11 ; ? BEL(设置文本参数,参数 11 = 文本背景颜色,值?表示查询而不是设置)。写入\e]11;?\a终端(\e转义字符 ( ^[) 和\a钟形字符 ( ^G)在哪里),xterm 会回复一个类似字符串\e]11;rgb:0000/0000/0000\a(黑色背景)。不幸的是,很少有其他终端模拟器支持这种转义序列。

Rxvt 将环境变量设置COLORFGBG为一个字符串,例如7;0where7是前景色(7 是浅灰色),0是背景色(黑色)。Konsole 也支持这一点。

Emacs 尝试检测终端是亮背景还是暗背景,以便设置background-mode终端参数。从 Emacs 24.5 开始,有三种方法可以自动设置后台模式:

  • xterm 上,Emacs 使用OSC 11上面解释的转义序列。
  • rxvt 上,Emacs 使用上述COLORFGBG环境变量。
  • DOSWindows控制台上,Emacs 使用 OS 特定的接口来获取有关终端的信息;这些接口的作用与OSC 11转义序列相同。

这遗漏了许多终端,但是有一些进步:vte 库为许多终端仿真器提供支持,例如 gnome-terminal、guake、terminator、xfce4-terminal 等,从 0.35.2 版本开始实现OSC 11类似 xterm 的报告。您可以通过检查环境变量来检测基于 VTE 的终端;该值是一个数字,您需要 3502 及以上。VTE_VERSION

如果您想标准化向应用程序报告信息的方式,那么终端端的支持可能无关紧要:毕竟您知道您喜欢浅色背景还是深色背景。那么您不妨与 rxvt 和 use 保持一致COLORFGBG,因为它是有人已经在使用的唯一接口,并且您可以独立于任何终端支持采用它。该COLORFGBG接口是有限的:它被设计成用于世界上仅有的16种颜色,并且每个人在同意从颜色编号,颜色映射(至少近似,精确的色调不同)。Konsole 支持超过 16 种颜色,但在报告时使用近似值COLORFGBG:它通过 16 种标准颜色之一来近似前景色和背景色。如果您只关心浅色与深色,那不是问题,只需将其设置COLORFGBG15;0用于深色背景0;15上的浅色文本或浅色背景上的深色文本。


Tho*_*key 6

空无一人。您可以自由制定自己的约定。

一些程序(例如xterm)可以为应用程序提供当前设置的前景色和背景色(请参阅“动态颜色”)。但是除了诸如 之类的应用程序之外xtermcontrol,很少有人使用它。Emacs 查询当前背景颜色来设置它的background-mode终端参数,该参数决定是否应用“深色”或“浅色”版本的颜色主题。在另一方面,Vim的,其可以使用在xterm的控制序列的颜色的数量,并通过特殊键发送的字符串(见“请求TERMCAP / TERMINFO字符串”的XTerm控制序列),没有检测到的前景/背景中的意义颜色。

  • gnome-terminal _not_ 设置`COLORFGBG`,但它支持`xtermcontrol` 工作所需的转义序列。请参阅 https://bugzilla.gnome.org/show_bug.cgi?id=733423#c1 了解基本原理。 (2认同)

roc*_*cky 3

根据Thomas DickeyGilles深思熟虑的答案以及在这个答案的评论中对 OSX 做什么,我在 github 中精选了这个脚本

关键是使用 xterm 兼容的颜色查询,并基于背景与前景的 RGB 颜色值。如果这不起作用,请尝试解释COLORFGBG并失败,使用各种终端的预设默认值。例如,xterm 默认是浅色背景。

预设默认值和 RGB 暗/亮插值的代码源自 GNU emacs 代码(如 Gilles 所建议)。

我没有添加任何 MS Windows 特定代码,但人们应该随意提交拉取请求来处理该代码或添加任何其他更正。

  • 没有理由去追求RGB的最大值是多少。只需将其与背景与前景(RGB 每个 3 元素的总和)进行比较即可。然而,我在 Rocky 的脚本之上做了一些增强,这些增强在 xterm、gnome-terminal 中可以更好地工作,但仍然不能在 gvim 的终端 shell 会话中(因为它是“linux”)。https://github.com/egberts/shell-term-background/blob/master/term-background.bash (2认同)