Accès par programmation à la couleur d'arrière-plan xterm actuelle?

13

Je voudrais configurer les couleurs d'invite en .bashrcfonction des couleurs qu'il utilise pour le premier plan et l'arrière-plan.

Par exemple, bleu si le fond est clair et beige s'il est sombre.

Existe-t-il un moyen de connaître les paramètres actuels dans un script?

Variable misérable
la source

Réponses:

22

L'e-mail de retour de Thomas Dickey (le responsable de xterm) contient ceci. Notez en particulier la partie sur ?. Le Ps = 4fait référence à OSC Ps ; Pt STOSC(le préfixe « contrôle du système d' exploitation ») est ESC ]et ST(le suffixe « String Terminator ») est \(barre oblique inverse). Le 4est 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 = 10et 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, \033est 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 ; ? STne 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
Alex North-Keys
la source
1
Wow ... une réponse après deux ans ... merci. Je n'ai pas bien compris l'explication mais l'exemple ne fait rien pour moi ... ne fait écho à rien.
Variable misérable
Il h. Je le relance dans un xterm assez récent - un xterm réel - cette fois avec toutes mes ressources X supprimées (ce qui signifie qu'il donne tous les "f" pour les couleurs au lieu de tous les "0"). L'utilisation de / bin / echo ou de l'écho intégré de bash fonctionne très bien. L'exemple que j'ai essayé a été copié / collé directement à partir du post ci-dessus. Mon environnement est Ubuntu 11.10 (un dérivé de Linux / Debian). Je n'ai pas de système d'exploitation différent à tester.
Alex North-Keys
Selon la configuration de votre invite, il est possible qu'elle arrive au-dessus de la tentative de xterm de bourrer les entrées dans votre terminal en réponse à votre requête. Du point de vue de votre shell, la réponse de xterm vous ressemble, en tapant.
Alex North-Keys
1
Hmm, le terminal gnome dans Ubuntu 12.04 prétend être compatible xterm, mais ne réimprime rien. Pourquoi donc?
Nik Reiman
1
Maintenant , c'est voodoo pur terminal. Excellente réponse.
Qix - MONICA A ETE BRUTEE
0

en quelque sorte

mettez les paramètres dans votre fichier ~ / .Xdefaults:

xterm*foreground: blue
xterm*background: white

dans votre shell, vous venez de grep les valeurs:

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

sinon, il est assez difficile d'obtenir des valeurs internes du xterm.

akira
la source
Je n'utilise même pas X :) J'utilise un rxvt de cygwin qui fonctionne sans serveur X. De plus, j'aimerais pouvoir utiliser différentes couleurs sur différents hôtes et pour différentes tâches, ce qui nécessite que je demande des paramètres au termincal.
Miserable Variable
eh bien, vous n'avez pas spécifié votre système d'exploitation :)
akira
Désolé pour ça. La raison pour laquelle je n'ai pas précisé, c'est parce que je m'attendais à ce que la solution soit basée sur l'écho de certaines chaînes magiques et récupère des informations sur stdout.
Variable misérable
eh bien, ce que vous "écho" reste normalement à l'intérieur du shell (bash, zsh), il ne va pas à xterm (sauf dans la dernière étape quand il s'agit d'afficher la sortie des commandes).
akira
-1 awk n'est pas le bon outil pour le travail.
g33kz0r
-1

En fait, je pense que vous voulez ceci:

% xrdb -query

Cela répertoriera les paramètres pour vous. Voir également:

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

Pour modifier le runtime, utilisez:

% echo "some*setting: somevalue" | xrdb -merge
g33kz0r
la source
-queryrépertorie toutes les ressources. spécifier une ressource ne fonctionne pas sur mon ubuntu.
akira
l'écho "quoi que ce soit" | xrdb -merge
g33kz0r
relisez la question: OP veut régler les couleurs du BASH PROMPT en fonction des paramètres de l'xterm. OP ne veut pas changer les xresources.
akira
Voir son commentaire à votre réponse. Il veut "interroger le termincal [sic]". Ainsi, il veut xrdb -query
g33kz0r
si vous voulez être aussi précis: il veut interroger rxvt sans un xserver en cours d'exécution sur Windows (ce qui est possible) et xrdb -queryvous donne simplement la liste de toutes les ressources .. que vous devez à nouveau awk / grep pour accéder au premier plan. et c'est ce que j'ai déjà admis. xrdb -mergeest complètement hors sujet ici coz OP ne veut pas modifier les xresources mais l'apparence du bashprompt.
akira