Accesso programmatico all'attuale colore di sfondo xterm?


13

Vorrei impostare i colori di richiesta in .bashrcbase ai colori che sta usando per il primo piano e lo sfondo.

Ad esempio, blu richiede se lo sfondo è chiaro e beige se è scuro.

C'è un modo per scoprire le impostazioni correnti in uno script?

Risposte:


22

L'email di ritorno da Thomas Dickey (manutentore di xterm) ha questo. Nota in particolare la parte su ?. Il Ps = 4riferimento a OSC Ps ; Pt STdove si trova OSC(il prefisso "Controllo del sistema operativo") ESC ]e ST(il suffisso "Terminatore di stringa") è \(barra rovesciata). La 4è una delle possibili sottocomandi a OSC.

Per l'intera tavolozza, che può essere impostato / recuperato utilizzando l'estensione colore 88/256. In ctlseqs.txt, è riassunto qui:

  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 po 'più avanti nei documenti ci sono più sottocomandi OSC Ps = 10e Ps = 11, e altri.

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

Esempio: questo interroga lo sfondo usando Ps = "11"(appena sopra) e Pt = "?", collegato a OSC Ps ; Pt ST. Nell'eco, \033viene utilizzato per la fuga e \\per la barra rovesciata finale.

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

Produzione:

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

Avvertenza: il colore restituito non riflette se il video inverso, come -rv, è abilitato e la scansione dei ~ 260 colori disponibili tramite OSC 4 ; c ; ? STnon mostra alcuno che segua entrambi lo sfondo E cambi con video inverso. Poiché molti utenti impostano uno sfondo scuro usando solo xterm -rv, ciò complica la determinazione se lo sfondo è effettivamente scuro o no. La maggior parte dei colori non si adatta -rvnemmeno a.

Uno script per eseguire la query completa e catturare effettivamente la risposta da 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
Caspita ... una risposta dopo due anni ... grazie. Non ho capito bene la spiegazione ma l'esempio non fa nulla per me ... non fa eco.
Miserabile variabile

Eh. Lo sto eseguendo nuovamente in un xterm piuttosto recente - un vero xterm - questa volta con tutte le mie risorse X eliminate (il che significa che produce tutte le "f" per i colori anziché tutti gli "0"). Usare / bin / echo o l'eco integrata di bash funziona bene. L'esempio che ho provato è stato copiato / incollato direttamente dal post sopra. Il mio ambiente è Ubuntu 11.10 (un derivato Linux / Debian). Non ho un sistema operativo diverso a portata di mano per testare.
Alex North-Keys,

A seconda di come è configurato il tuo prompt, c'è la possibilità che stia atterrando in cima al tentativo di xterm di inserire gli input nel tuo terminale in risposta alla tua richiesta. Dal punto di vista della shell, la risposta di xterm sembra proprio come te, digitando.
Alex North-Keys,

1
Hmm, il terminale GNOME in Ubuntu 12.04 afferma di essere compatibile con xterm, ma non stampa nulla. Perché?
Nik Reiman,

1
Ora, questo è puro voodoo terminale. Risposta eccellente.
Qix - MONICA È STATA MISTREATA il

0

tipo

inserisci le impostazioni nel tuo file ~ / .Xdefaults:

xterm*foreground: blue
xterm*background: white

nella tua shell devi solo grep i valori:

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

altrimenti è piuttosto difficile ottenere alcuni valori interni di xterm.


Non sto nemmeno usando X :) Sto usando un rxvt di Cygwin che funziona senza un server X. Inoltre, vorrei essere in grado di utilizzare colori diversi su host diversi e per attività diverse, il che richiede che richieda il termine per le impostazioni.
Miserabile variabile,

bene, non hai specificato il tuo sistema operativo :)
Akira il

mi dispiace per quello. Il motivo che non ho specificato è perché mi aspettavo che la soluzione fosse basata sull'eco di alcune stringhe magiche e sul recupero di alcune informazioni su stdout.
Miserabile variabile,

bene, ciò che "echi" normalmente rimane all'interno della shell (bash, zsh), non va su xterm (tranne che nel passaggio finale quando si tratta di visualizzare l'output dei comandi).
Akira,

-1 awk è lo strumento sbagliato per il lavoro.
g33kz0r,

-1

In realtà penso che tu voglia questo:

% xrdb -query

Questo elencherà le impostazioni per te. Guarda anche:

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

Per modificare il runtime, utilizzare:

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

-queryelenca tutte le risorse. specificare una risorsa non funziona sul mio Ubuntu.
Akira,

echo "qualunque cosa" | xrdb -merge
g33kz0r

rileggere la domanda: OP vuole impostare i colori di BASH PROMPT in base alle impostazioni di xterm. OP non vuole cambiare le risorse x.
Akira,

Vedi il suo commento alla tua risposta. Vuole "interrogare il termine [sic]". Quindi, vuole xrdb -query
g33kz0r

se vuoi essere così specifico: vuole interrogare rxvt senza un xserver in esecuzione su Windows (il che è possibile) e xrdb -queryti dà solo l'elenco di tutte le risorse .. che devi riavviare / grep per arrivare in primo piano. e questo è quello che ho già ammesso. xrdb -mergeè completamente offtopico qui perché OP non vuole modificare le risorse x ma l'aspetto del prompt di base.
Akira,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.