L'e-mail de retour de Thomas Dickey (le responsable de xterm) contient ceci. Notez en particulier la partie sur ?
. Le Ps = 4
fait référence à OSC Ps ; Pt ST
où OSC
(le préfixe « contrôle du système d' exploitation ») est ESC ]
et ST
(le suffixe « String Terminator ») est \
(barre oblique inverse). Le 4
est l'une des sous-commandes possibles pour OSC.
Pour l'ensemble de la palette, cela peut être défini / récupéré à l'aide de l'extension de couleur 88/256. Dans ctlseqs.txt, il est résumé ici:
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.
Un peu plus loin dans les documents, il y a plus de sous-commandes OSC, Ps = 10
et Ps = 11
, et d'autres.
Ps = 1 0 -> Change VT100 text foreground color to Pt.
Ps = 1 1 -> Change VT100 text background color to Pt.
Exemple - ceci interroge l'arrière-plan en utilisant Ps = "11"
(juste au-dessus) et Pt = "?"
, branché sur le OSC Ps ; Pt ST
. Dans l'écho, \033
est utilisé pour l'évasion et \\
pour la contre-oblique finale.
echo -en "\033]11;?\033\\"
Production:
^[]11;rgb:0000/0000/0000^[\
Avertissement: La couleur renvoyée ne reflète pas si la vidéo inversée, comme -rv
, est activée, et l'exploration des ~ 260 couleurs disponibles via OSC 4 ; c ; ? ST
ne montre aucune qui suit à la fois l'arrière-plan ET change avec la vidéo inversée. Étant donné que de nombreux utilisateurs définissent un arrière-plan sombre en utilisant simplement xterm -rv
, cela complique la détermination si l'arrière-plan est réellement sombre ou non. La plupart des couleurs ne s'adaptent pas non-rv
plus.
Un script pour effectuer la requête complète et capturer réellement la réponse de 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