这肉

这肉

这肉

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

printf "\e]4;3;rgb:cc/78/33\e\\"

将 ANSI 调色板中的第三种颜色设置为 #CC7833 所表示的 RGB 值。您可以做相反的事情吗?我可以获取第三种(好吧,实际上是任何)颜色的当前 RGB 值(以任何形式)吗?

为什么?

就我而言,你之所以想要这样做,是为了能够在弄乱(故意的)之前保存整个颜色表。我希望能够使用 RGB 精确颜色主题在终端中列出代码,称我为肛门。要做到这一点,我必须覆盖终端颜色表中的颜色定义,如上所述。

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

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

奖金

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

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

答案1

您可以使用以下方式查询颜色

printf "\e]4;3;?\e\\"

它将响应放在键盘缓冲区中,就像您在终端中输入一样(这在 shell 脚本中很难处理)。或者您可以使用

xtermcontrol --get-color3

使用该转义序列的便捷前端。

答案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-session 的设置。但是,您可以通过导出设置xrdb -query然后在完成后重新加载它们来“破解”它。

答案3

我使用的经典方法是为新类定义一组 xrdb 属性 --- 如下所示:(在 Linux 中,您必须将其放在 $HOME/.Xdefault- 中hostname,YMMV)

MYXTerm*foreground: red;
MYXTerm*color11: navyblue;

如果有必要 (不确定,取决于系统) 使用 加载文件xrdb -merge。之后,使用以下命令启动终端:

xterm -class MYXTerm

现在你应该有一个终端,它有一组不影响正常颜色的私有颜色。现在,如果你想要将程序运行到相同终端,我真的不知道该怎么办......

相关内容