Come posso cambiare i colori del mio xterm usando le sequenze di escape Ansi?


25

Vorrei cambiare i colori (sfondo, font, primo piano) del mio xterm dalla riga di comando. Ho sentito che questo può essere fatto usando sequenze di escape ANSI.

Se questo è possibile:

  • Com'è fatto?
  • Posso usare i nomi dei colori o devo usare i loro codici RGB?

Risposte:


27

Le sequenze di escape ANSI consistono in una sequenza di caratteri che iniziano con il carattere Escape, personaggio 27. Il personaggio successivo è spesso (anche se non sempre) una parentesi quadra aperta: [

Il comando echo può inviare caratteri di escape se si specifica -ee si utilizza \eper escape.

Lo standard ANSI definisce 8 colori, oltre a una modalità luminosa, per un totale di 16 possibilità. La sequenza è:

\e[<number>m

Dov'è <number>uno di:

Primo piano:

  • 30 nero
  • 31 Rosso
  • 32 Verde
  • 33 Giallo
  • 34 blu
  • 35 magenta
  • 36 ciano
  • 37 bianco

Sfondo:

  • 40 nero
  • 41 rosso
  • 42 Verde
  • 43 Giallo
  • 44 blu
  • 45 magenta
  • 46 ciano
  • 47 bianco

  • 0 Ripristina tutto

  • 1 grassetto

Quindi, per rendere il tuo primo piano rosso e lo sfondo giallo:

$ echo -e "\e[31m\e[43m"

E per abilitare il grassetto:

$ echo -e "\e[1m"

Certo, puoi combinarli tutti insieme:

$ echo -e "\e[31m\e[43m\e[1m"

Esistono molti altri codici di escape per fare altre cose.

Ad esempio: cancella lo schermo e sposta il cursore in alto a sinistra:

$ echo -e "\e[2J\e[1;1H"

Ciò è utile quando si cambia il colore:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

Il che cambierà i colori, cancellerà lo schermo e posizionerà il cursore in alto a sinistra. Bene, quasi in alto a sinistra. L'eco inserisce un ritorno a capo, quindi si sposta lungo una linea. Puoi aggiungere -nl'eco per evitarlo se sei esigente.

Se sbagli tutto e non riesci a vedere quello che stai scrivendo, puoi ripristinare i colori dei terminali normali premendo:

Ctrl+v [ 0 m Return

A quello che speri sia il prompt dei comandi. Si scatenerà per un comando sconosciuto, ma sarai in grado di vedere cosa stai facendo di nuovo.


posso usare i nomi dei colori anziché i codici dei colori?
Nathan Fellman,

1
No, ma puoi assegnare i codici colore alle variabili. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko,

3
Va notato, tuttavia, che più numeri di codice colore possono essere separati da ";". Quindi, per rendere il tuo primo piano rosso e lo sfondo giallo puoi anche usare il più corto: echo -ne '\e[31;43m'(invece di quanto sopra echo -e "\e[31m\e[43m").
Andreas Spindler,

Come cambio il colore del cursore su 34 Blu?
trusktr,

28

Nota che i moderni Xterms supportano il colore a 32 bit!

Semplice esempio. Per impostare un bel sfondo viola scuro (ehi, ognuno per conto suo) del valore # 53186f, fai:

echo -ne "\033]11;#53186f\007"

Nota che questo cambia istantaneamente il colore dell'intera finestra, non solo del testo successivo. Ciò è particolarmente utile per rendere una finestra ovviamente diversa dopo aver inviato a un server (ad esempio). Inserisci l'eco sopra nel tuo .bashrc e il tuo terminale cambia automaticamente i colori quando accedi a quel server (ma non cambierà di nuovo quando esci da Ctrl-D)

Puoi passare ORE in rete cercando questo - la maggior parte dei documenti parla solo dei 16 colori ANSI originali.

Fonti: http://www.steike.com/code/xterm-colors/ e http://rtfm.etla.org/xterm/ctlseq.html (consultare "Controlli del sistema operativo")

Nota: la sequenza di escape sopra è valida per XTerms e potrebbe non funzionare per altre implementazioni di emulatori di terminali per finestre "simili a XTerm" che potrebbero "apparire" come un XTerm. Ad esempio, "gnome-terminal" o "konsole" hanno sequenze di escape diverse o potrebbero non implementare affatto il cambio di colore.


1
Questo non funziona per me, echeggia una riga vuota senza cambiamenti osservabili nel terminale.
Richard,

1
Questo ha funzionato per me, mentre gli altri no - molto utile, grazie
vol7ron

1
+1 modifica lo sfondo della finestra e consente i nomi dei colori, ad esempio "verde" anziché "# 00ff00".
Rob I,

1
com'è # 53186f colori a 32 bit. Conto 24 bit ...
jiggunjer

Qualcuno sa come realizzare la stessa cosa con gnome-terminal?
wjandrea,

3

Sì. I terminali ANSI supportano i codici di escape ANSI . Ciascun codice Control Sequence Introducer( CSI) nel seguente formato:

ESC[<<<CODE>>>

Il carattere Ascii 27(il ESCpersonaggio) o 1bin esadecimale, seguito da una parentesi quadra sinistra, quindi da una lettera che indica l'azione da utilizzare.

Si noti che un elenco di ;parametri separati può essere fornito direttamente prima del <<<CODE>>>parametro.

Ora i colori usano un sottoinsieme di CSIcodici, i Select Graphic Renditioncodici. Questi sono nella forma:

ESC[<<<SGR>>>m

Il SGRcodice viene passato come parametro a CSI. Rilevanti per la tua domanda sono i SGRcodici 30-49. I codici 30-39 impostano il colore di primo piano. I codici 40-49 impostano il colore di sfondo.

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

I codici 38 e 48 sono codici speciali. Questi sono quelli che ti permettono di usare i valori RGB. Il formato per questi è:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

Nota: gli usi alternativi includono \x1b[<3 or 4>8;5;<web safe color index>m. Con questo utilizzo, esiste una codifica dei colori completamente diversa. Vedere il collegamento nella parte superiore di questa risposta per ulteriori informazioni.

I codici 39 e 49 impostano i colori di primo piano e di sfondo sui valori predefiniti, definiti su base terminale per terminale.

In pratica, i colori 30-37 40-47 sono leggermente diversi da quelli che le loro etichette dicono di essere.

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

Per ottenere colori chiari, si utilizza la SGI per il grassetto, 1. Il grassetto è un nome fuorviante. Non rende grassetto il carattere. Aumenta effettivamente la luminosità del testo. Con il grassetto applicato i colori diventano:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

Nota: gli ultimi due blocchi di numeri di colori sono rilevanti sia per il primo che per lo sfondo ( <index> + (30 or 40)).

Per rimuovere tutti gli stili (torna alla modalità predefinita / normale) usare SGR0.

CSIi codici non sono tutti grafici. Ad esempio, ESC[2Jcancellerà il tuo terminale. ESC[<y>;<x>Himposta la posizione del cursore (1-indicizzato). Vedi l'articolo di Wikipedia per maggiori informazioni.

Nota: per testarli, utilizzare echo -eo printf.


2

NOTA: "^ [" è il carattere di escape ed è inserito con un CTRL-V, CTRL- [e ^ G è un carattere di campana, inserito con CTRL-V, CTRL-G

Il seguente blocco è nel mio .bash_profile e mi assicura che i miei xterm su questo sistema siano SEMPRE bianco su nero, anche dopo aver effettuato l'accesso a un altro sistema che potrebbe aver cambiato i miei colori.

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '

0

controllare anche un progetto ScriptEchoColor
è completamente realizzato in script bash
ha pacchetti per Ubuntu qui
, ma questi script può essere installato su qualsiasi distro, se si sa come (più recente può essere scaricato dal suo git anche).

puoi usare nomi di colori abbreviati o estesi come:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

un campione: inserisci qui la descrizione dell'immagine

Inoltre, assicurati di dare un'occhiata a xtermcontrol , per un controllo più esteso su xterm su se stesso (non solo sui personaggi).


0

Tra i numerosi codici ANSI CSI c'è uno chiamato SGR, o Select Graphic Rendition. Si tratta di ESC, [parametri, in mcui i parametri sono uno o più numeri interi in formato ASCII, separati da punti e virgola. I molti diversi parametri SGR sono elencati nella pagina Wikipedia sopra (sebbene non vada nel dettaglio per tutti loro).

Alcuni parametri, come 1(grassetto o maggiore intensità) e 31(testo rosso) sono autonomi e possono essere utilizzati singolarmente o combinati, come in ESC[31mo ESC[1;31mper dare rispettivamente il testo standard rosso e grassetto in primo piano rosso.

Altri accettano i parametri stessi, che vengono semplicemente forniti dopo il codice come più numeri separati da punto e virgola. Quindi, ad esempio, ESC[38;5;219mvisualizzerebbe il testo in primo piano con il numero di colore esteso 219 e ESC[38;2;150;100;50mlo visualizzerebbe nel colore con valore RGB 150, 100, 50. In questo caso, 38è il comando "colore di primo piano impostato esteso", che viene sempre seguito da un sottocomando. Il sottocomando 2accetta tre parametri, i valori dei componenti rosso, verde e blu. Diversamente, il sottocomando 5assume solo un altro valore, un numero compreso tra 0 e 255 che specifica un colore da una tabella con cui è configurato il terminale.

La seguente funzione di shell può essere utile per l'utilizzo di questi codici:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

Puoi usarlo in questo modo:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

Si noti che se non si forniscono parametri per sgr()impostazione predefinita al codice SGR 0, il che significa disattivare tutti gli attributi, reimpostando il testo su qualsiasi valore predefinito per quel terminale.


1
Tecnicamente quelli ESC[38... me ESC[38... mpuò / deve (dipende dalla vostra fonte di informazione - il massimo un solo essere, io credo, itu.int/rec/T-REC-T.416-199303-I ) dovrebbe utilizzare il, altrimenti riservato, carattere :(per separare gli elementi dei parametri ) in modo che ;venga usato solo tra stringhe di parametri complete - cioè ESC[38;2;150;100;50mdovrebbe essere scritto ESC[38:2::150:100:50m...
SlySven

... sfortunatamente le implementazioni spesso dimenticano l' ID dello spazio colore tra il 2e il 150- poiché nessuno, di cui sono a conoscenza , ha mai definito quale valore dovrebbe andare lì dentro il valore predefinito vuoto deve essere usato - ma spesso viene perso e l'utilizzo solo ;come separatore rende impossibile elaborare in modo affidabile le informazioni in conformità con le specifiche.
SlySven
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.