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.

È stato utile?

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> DECRQSS sequenza di

printf '\033P$m\033\\'

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.

\033P1$r0;33m\033\\

per indicare il numero colore di primo piano 3 (codificato come 33).

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 OSC 4 . Devi usare il numero di colore (dalla sequenza SGR), e inviare qualcosa di simile:

printf '\033]4;3;?\033\\'

Quindi è certamente fattibile con xterm. Ci sarà una demo / test-script per DECRQSS nel prossimo aggiornamento per xterm.

Per gli altri programmi, è necessario più tempo:

  • sviluppatore di xtermcontrol trascurato DECRQSS (non presenti nessun elemento per impostare / ottenere i codici di SGR).

  • Gli sviluppatori di TEV funzioni di copia xterm in risposta alle segnalazioni di bug; la sorgente di TEV non menziona DECRQSS . La sua git log menziona OSC 4 nel 2009, ma l'implementazione è incompleta (consente solo uno a set un colore, non il colore).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top