用于获取 ANSI 颜色的 RGB 值的 Xterm 控制序列

Jon*_*son 5 shell colors xterm ansi shell-script

这肉

在(某些)终端中,您可以使用这样的序列;

printf "\e]4;3;rgb:cc/78/33\e\\"
Run Code Online (Sandbox Code Playgroud)

将 ANSI 调色板中的第三种颜色设置为 #CC7833 表示的 RGB 值。你能做相反的事吗?我可以获得第三种(好吧,任何真正的)颜色的当前 RGB 值(任何形式)?

为什么?

就我而言,您想要这样做的原因是能够在弄乱它之前(故意)保存整个颜色表。我希望能够使用 RGB 精确颜色主题在终端中列出代码,请叫我 anal。为此,我必须重写终端颜色表中的颜色定义,如上所述。

对我来说,问题现在已经解决了。但是,由于我想将此功能添加到很多人使用的现有开源项目(pry)中,因此我需要能够在设置程序会话的主题颜色之前保存调色板的当前状态,然后切换它们之后回来。

我知道有些终端在设置中有这个,有些系统在配置文件中有它。但我需要一些通用的并且可以跨系统工作的东西。理想情况下,所有系统都支持以上述方式设置它们:)

奖金

现在,颜色的变化会影响整个系统、所有终端会话,甚至在关闭并重新启动终端后(这是在 OS X Mountain Lion 上使用 iTerm2)。

如果效果可以本地化,比如子 shell,问题就会消失,因为当进程结束时,更改将随着子 shell 一起消失。更好的是,因为它可以防止会话崩溃的情况......

小智 2

我能想到的最接近标准方法是依赖 xrdb。您可以使用xrdb -query并获取当前 X 会话使用的颜色值。例如,我的提供以下内容:

*背景:#151515
*颜色0:#101010
*颜色1:#E84F4F
*颜色10:#A0CF5D
*颜色11:#F39D21
*颜色12:#4E9FB1
*颜色13:#8542FF
*颜色14:#42717B
*颜色15:#dddddd
*颜色2:#B8D68C
*颜色3:#E1AA5D
*颜色4:#7DC1CF
*颜色5:#9B64FB
*颜色6:#6D878D
*颜色7:#dddddd
*颜色8:#404040
*颜色9:#D23D3D
*前景:#D7D0C7
...

不幸的是,由于 xrdb 的工作方式,我不知道有什么方法可以只为子 shell 设置设置,因为 xrdb 的全部目的是协调当前 x 会话的设置。但是,您可以通过导出设置来“破解”它xrdb -query,然后在完成后重新加载它们。