![通过编程访问当前 xterm 背景颜色?](https://linux22.com/image/1242957/%E9%80%9A%E8%BF%87%E7%BC%96%E7%A8%8B%E8%AE%BF%E9%97%AE%E5%BD%93%E5%89%8D%20xterm%20%E8%83%8C%E6%99%AF%E9%A2%9C%E8%89%B2%EF%BC%9F.png)
我想.bashrc
根据前景和背景使用的颜色来设置提示颜色。
例如,如果背景较亮,则提示蓝色,如果背景较暗,则提示米色。
有没有办法找出脚本中的当前设置?
答案1
Thomas Dickey(xterm 的维护者)的回复邮件中有此内容。请特别注意有关 的部分?
。Ps = 4
指的是(“操作系统控制”前缀)在OSC Ps ; Pt ST
哪里,(“字符串终止符”后缀)在哪里(反斜杠)。是 OSC 的可能子命令之一。OSC
ESC ]
ST
\
4
对于整个调色板,可以使用 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 = 10
和Ps = 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
不会显示任何既跟随背景又随反向视频变化的颜色。由于许多用户仅使用 来设置深色背景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
答案2
有点儿
将设置放入您的 ~/.Xdefaults 文件中:
xterm*foreground: blue
xterm*background: white
在你的 shell 中你只需 grep 这些值:
awk '/xterm\*foreground:(.*)/ { print $2 }' < .Xdefaults
否则很难获取 xterm 的一些内部值。