Leggere il colore del testo corrente in un xterm
Domanda
sto scrivendo varie utilità, e sto proprio piacimento il testo colorato. Niente di speciale, semplicemente utilizzando sequenze di escape. Ho creato una semplice classe che ha una funzione pprint (msg, colore). Ho ottenuto che funziona piuttosto facilmente dopo aver trovato i codici qui .
Il problema che sto avendo è che dovrei essere in grado di spegnere il colore dopo la stampa. Ad esempio, supponiamo che un utente esegue il mio programma che le stampe quasi tutto nel colore terminale predefinito, ma c'è un errore, e voglio stampare l'errore in rosso. Ho prefisso il mio messaggio di errore con '\ 033 [0; 32m', e il messaggio è in rosso. Purtroppo, tutto il testo è rosso fino a quando lo cambio. Questo è generalmente bene, mentre il mio programma è in esecuzione, perché so di che colore i messaggi dovrebbero essere. Tuttavia, il colore rimane dopo il mio finisce programma. In sostanza, mi piacerebbe leggere il colore corrente quando il mio programma si avvia, e ripristinarlo al termine. Allo stesso modo che gli script di ripristinare il pwd quando si esce.
Come faccio a leggere la sequenza di escape corrente?
Sistema: Red Hat 5.x bash Python 2.3
Grazie per l'aiuto.
Soluzione
Non credo che sia possibile ed è improbabile che sia portatile se lo fosse. Il meglio che puoi fare è inviare sgr0
che resetta tutti gli attributi per default (non precedente). Su xterms, sgr0
è Esc[m
. Se si desidera ripristinare i colori e non influisce sugli altri attributi, invio op
che da xterm è Esc[39;49m
.
Questi codici non deve essere codificato. Si dovrebbe usare terminfo, termcap o [n] maledizioni.
Altri suggerimenti
Invece di utilizzare sequenze di escape offuscato, usa invece l'impianto tput
. Ecco un estratto dal mio ~/.bashrc
che uso per il mio prompt PS1:
BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
LIME_YELLOW=$(tput setaf 190)
POWDER_BLUE=$(tput setaf 153)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
BRIGHT=$(tput bold)
NORMAL=$(tput sgr0)
BLINK=$(tput blink)
REVERSE=$(tput smso)
UNDERLINE=$(tput smul)
Per ripristinare le informazioni sul colore in modo tale che la successiva testo utilizza il colore terminale normale si dovrebbe accodare ${NORMAL}
alla fine in questo modo:
echo "${RED}this is red ${NORMAL}this is normal"
RED = 31
GREEN = 32
ESCAPE = '%s[' % chr(27)
RESET = '%s0m' % ESCAPE
FORMAT = '1;%dm'
def colorize(text, color):
return ESCAPE + (FORMAT % (color, )) + text + RESET
Questa funzione restituisce una stringa che stamperà colorati, con il terminale di riarmo automatico in seguito.
In realtà, è possibile - per xterm , e compatibile i terminali.
xtermcontrol per esempio utilizza il OSC 10
sequenza di controllo per recuperare il default primo piano / colori di sfondo. E 'stato documentato in xterm dal 2002.
Per altri terminali:
- In RHEL 5, il programma "Terminal" è gnome-terminal 2.16.0; che la versione non riconosce
OSC 10
(testato con i CentOS equivalenti 5). - La domanda è stata posta nel 2010, facendo riferimento alla Red Hat impresa versione, che, semmai, è più lento di aggiornamento di Debian.
- Andando avanti nel tempo, gnome-terminal 3.4.1.1 su Debian 7 (all'inizio del 2012), inoltre, non riconosce la sequenza di controllo.
- Infine, in Debian 8 con 3.14.1 (fine 2014) la funzione viene riconosciuto.
- CentOS 7 di gnome-terminal 3.14.3 riconosce la sequenza di controllo.
quando Curioso è stato aggiunto, tenere a mente che gli sviluppatori di TEV non lo fanno documentazione scrittura. Quindi ... studiare gli spettacoli git log
commit 1b8c6b1aac587b79476a60a5830385abc939430d
Author: Egmont Koblinger <egmont@gmail.com>
Date: Wed Jan 22 00:13:51 2014 +0100
emulation: Add support for OSC 1?1[017] (fg, bg, highlight colors)
https://bugzilla.gnome.org/show_bug.cgi?id=567444
D'altra parte, il default colori non sono gli stessi dei in corso colori. Gli utenti sono stati in grado di fare questo con xterm dal cerotto # 93 nel 1999 utilizzando il strong> otterrebbe a rispondere con la stringa compilato con i parametri SGR. Se i colori sono stati impostati utilizzando SGR, i codici sarebbero parte della risposta, per es. per indicare il numero colore di primo piano 3 (codificato come Si potrebbe fermarsi qui (perché si potrebbe estrarre quei parametri e riutilizzarli per impostare il terminale allo stesso stato in seguito), ma poi ottenere i colori reali RGB sarebbe possibile utilizzando Quindi è certamente fattibile con xterm. Ci sarà una demo / test-script per Per gli altri programmi, è necessario più tempo: sviluppatore di xtermcontrol trascurato Gli sviluppatori di TEV funzioni di copia xterm in risposta alle segnalazioni di bug; la sorgente di TEV non menziona DECRQSS
sequenza di printf '\033P$m\033\\'
\033P1$r0;33m\033\\
33
). OSC 4
. Devi usare il numero di colore (dalla sequenza SGR), e inviare qualcosa di simile: printf '\033]4;3;?\033\\'
DECRQSS
nel prossimo aggiornamento per xterm.
DECRQSS
(non presenti nessun elemento per impostare / ottenere i codici di SGR). DECRQSS
. La sua git log menziona OSC 4
nel 2009, ma l'implementazione è incompleta (consente solo uno a set un colore, non il colore).