以编程方式访问当前的xterm背景色?


13

我想.bashrc根据前景色和背景色设置提示色。

例如,如果背景是浅蓝色,则提示蓝色;如果背景是暗,则蓝色提示。

有没有办法找出脚本中的当前设置?

Answers:


22

Thomas Dickey(xterm的维护者)发回的电子邮件包含此内容。特别注意有关的部分?。的Ps = 4是指OSC Ps ; Pt ST其中OSC(“操作系统控制”前缀)是ESC ]ST(“字符串终结者”后缀)是\(反斜杠)。这4是OSC可能的子命令之一。

对于整个调色板,可以使用88/256颜色扩展名进行设置/检索。在ctlseqs.txt中,此处总结如下:

  Ps = 4 ; c ; spec -> Change Color Number c to the color
specified by spec.  This can be a name or RGB specification as
per XParseColor.  Any number of c/spec pairs may be given.
The color numbers correspond to the ANSI colors 0-7, their
bright versions 8-15, and if supported, the remainder of the
88-color or 256-color table.

If a "?" is given rather than a name or RGB specification,
xterm replies with a control sequence of the same form which
can be used to set the corresponding color.  Because more than
one pair of color number and specification can be given in one
control sequence, xterm can make more than one reply.

稍后,文档中还会介绍更多OSC子命令,Ps = 10Ps = 11以及其他命令。

Ps = 1 0  -> Change VT100 text foreground color to Pt.
Ps = 1 1  -> Change VT100 text background color to Pt.

示例-此示例使用Ps = "11"(从上方)和Pt = "?"插入背景中,查询背景OSC Ps ; Pt ST。在回显中,\033正用于转义和\\最后的反斜杠。

echo -en "\033]11;?\033\\"

输出:

^[]11;rgb:0000/0000/0000^[\ 

警告:返回的颜色不会反映是否-rv启用了反向视频(例如),并且通过〜260种可用颜色进行爬网时OSC 4 ; c ; ? ST,不会显示任何都跟随背景并随着反向视频而变化的颜色。由于许多用户使用just设置了深色背景xterm -rv,这使确定背景是否实际上是深色变得复杂。大多数颜色也不会调整为-rv

一个执行完整查询并实际上捕获来自xterm的答复的脚本:

#!/bin/bash
success=false
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
col=11      # background
#          OSC   Ps  ;Pt ST
echo -en "\033]${col};?\033\\" >/dev/tty  # echo opts differ w/ OSes
result=
if IFS=';' read -r -d '\' color ; then
    result=$(echo $color | sed 's/^.*\;//;s/[^rgb:0-9a-f/]//g')
    success=true
fi
stty $oldstty
echo $result
$success

1
哇...两年后的回应...谢谢。我不太理解其中的解释,但该示例对我没有任何帮助...什么也没有。
悲惨变量

h 我将在最近的xterm(实际的xterm)中重新运行它,这次我的所有X资源都被剥离了(这意味着它会产生所有颜色的“ f”而不是所有“ 0”)。使用/ bin / echo或bash的内置echo都可以正常工作。我尝试的示例直接从上面的帖子中复制/粘贴。我的环境是Ubuntu 11.10(Linux / Debian衍生版)。我没有方便测试的其他操作系统。
亚历克斯·

根据提示的配置方式,有可能它是在xterm尝试将输入填充到终端以响应查询的尝试之上的。从shell的角度来看,xterm的回复就像您键入一样。
亚历克斯·

1
嗯,Ubuntu 12.04中的gnome终端声称是xterm兼容的,但没有将任何内容打印回来。这是为什么?
Nik Reiman 2012年

1
现在,是纯终端伏都教。极好的答案。
Qix-蒙尼卡(Monica)

0

有点儿

将设置放入〜/ .Xdefaults文件中:

xterm*foreground: blue
xterm*background: white

在您的外壳中,您只需grep值:

awk '/xterm\*foreground:(.*)/ { print $2 }' < .Xdefaults

否则很难获得xterm的一些内部值。


我什至没有使用X :)我使用的是来自cygwin的rxvt,它在没有X服务器的情况下运行。此外,我希望能够在不同的主机和不同的任务上使用不同的颜色,这要求我查询终端以进行设置。
悲惨变量

好吧,您没有指定您的操作系统:)
akira

对于那个很抱歉。我没有指定的原因是因为我期望解决方案基于回显一些魔术字符串并在stdout上获取一些信息。
悲惨的变量,2010年

好吧,您“回声”的内容通常保留在外壳程序(bash,zsh)中,不会进入xterm(显示命令输出的最后一步除外)。
akira

-1 awk是错误的工作工具。
g33kz0r 2011年

-1

实际上,我认为您想要这样做:

% xrdb -query

这将为您列出设置。也可以看看:

http://docstore.mik.ua/orelly/unix3/upt/ch06_08.htm

要修改运行时,请使用:

% echo "some*setting: somevalue" | xrdb -merge

-query列出所有资源。指定资源在我的Ubuntu上不起作用。
akira

回声“随便” xrdb -merge
g33kz0r 2011年

重读该问题:OP希望根据xterm的设置来设置BASH PROMPT的颜色。OP不想更改xresources。
akira

查看他对您答案的评论。他想“查询终点”。因此,他希望xrdb -查询
g33kz0r

如果您想要特定的话:他想查询rxvt而不在Windows上运行xserver(可能的话),xrdb -query只是给您所有资源的列表..您必须再次执行awk / grep才能到达前台。那就是我已经承认的。xrdb -merge在这里完全是题外话,因为coz OP不想修改xresources,而是要修改bashprompt的外观。
akira
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.