Wie kann ich die Farben meines xterm mithilfe von Ansi-Escape-Sequenzen ändern?

25

Ich möchte die Farben (Hintergrund, Schriftart, Vordergrund) meines xterm von der Kommandozeile aus ändern. Ich habe gehört, dass dies mit ANSI-Escape-Sequenzen durchgeführt werden kann.

Wenn dies möglich ist:

  • Wie wird es gemacht?
  • Kann ich Farbnamen verwenden oder muss ich deren RGB-Codes verwenden?
Nathan Fellman
quelle

Antworten:

27

ANSI-Escape-Sequenzen bestehen aus einer Folge von Zeichen, die mit dem Escape-Zeichen (Zeichen 27) beginnen. Das nächste Zeichen ist häufig (wenn auch nicht immer) eine offene eckige Klammer: [

Der Befehl echo kann Escape-Zeichen senden, wenn Sie Escape-Zeichen angeben -eund verwenden \e.

Der ANSI-Standard definiert 8 Farben und einen Helligkeitsmodus, der insgesamt 16 Möglichkeiten bietet. Die Reihenfolge ist:

\e[<number>m

Wo <number>ist einer von:

Vordergrund:

  • 30 Schwarz
  • 31 Rot
  • 32 Grün
  • 33 Gelb
  • 34 Blau
  • 35 Magenta
  • 36 Cyan
  • 37 Weiß

Hintergrund:

  • 40 Schwarz
  • 41 Rot
  • 42 Grün
  • 43 Gelb
  • 44 Blau
  • 45 Magenta
  • 46 Cyan
  • 47 Weiß

  • 0 Alles zurücksetzen

  • 1 Fett

So machen Sie Ihren Vordergrund rot und Ihren Hintergrund gelb:

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

Und um fett zu machen:

$ echo -e "\e[1m"

Natürlich können Sie sie alle miteinander kombinieren:

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

Es gibt noch viele andere Escape-Codes, um andere Dinge zu tun.

Zum Beispiel - löschen Sie den Bildschirm und bewegen Sie den Cursor nach links oben:

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

Was beim Ändern der Farbe nützlich ist:

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

Dadurch werden die Farben geändert, der Bildschirm gelöscht und der Cursor oben links positioniert. Na ja, fast oben links. Echo setzt einen Wagenrücklauf ein und bewegt sich so eine Linie hinunter. Sie können -nEcho hinzufügen , um dies zu verhindern, wenn Sie pingelig sind.

Wenn Sie alles durcheinander bringen und nicht sehen können, was Sie eingeben, können Sie die Terminalfarben auf Normal zurücksetzen, indem Sie auf drücken:

Ctrl+v [ 0 m Return

Was Sie hoffen, ist die Eingabeaufforderung. Es wird sich um einen unbekannten Befehl drehen, aber Sie werden sehen können, was Sie wieder tun.

Majenko
quelle
Kann ich Farbnamen anstelle von Farbcodes verwenden?
Nathan Fellman
1
Nein, aber Sie können die Farbcodes Variablen zuweisen. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko
3
Es ist jedoch zu beachten, dass mehrere Farbcodenummern durch ";" getrennt werden können. Um den Vordergrund rot und den Hintergrund gelb zu machen, können Sie auch das Kürzere verwenden: echo -ne '\e[31;43m'(anstelle des obigen echo -e "\e[31m\e[43m").
Andreas Spindler
Wie ändere ich die Farbe des Cursors auf 34 Blau?
Trusktr
28

Beachten Sie, dass moderne Xterms 32-Bit-Farben unterstützen!

Einfaches Beispiel. Um einen schönen dunkelvioletten Hintergrund (hey, jeder für sich) mit dem Wert # 53186f festzulegen, gehen Sie wie folgt vor:

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

Beachten Sie, dass dadurch sofort die Farbe des gesamten Fensters und nicht nur des nachfolgenden Texts geändert wird. Dies ist besonders nützlich, um ein Fenster offensichtlich anders zu machen, nachdem es (zum Beispiel) an einen Server gesendet wurde. Fügen Sie das obige 'Echo' in Ihre .bashrc-Datei ein, und Ihr Terminal ändert automatisch die Farben, wenn Sie sich bei diesem Server anmelden.

Sie können STUNDEN im Internet damit verbringen, danach zu suchen - die meisten Dokumente sprechen nur über die ursprünglichen 16 ANSI-Farben.

Quellen: http://www.steike.com/code/xterm-colors/ und http://rtfm.etla.org/xterm/ctlseq.html (siehe unter "Betriebssystemsteuerung")

Bitte beachten Sie: Die oben angegebene Escape-Sequenz gilt für XTerms und funktioniert möglicherweise nicht für andere Implementierungen von "XTerm-ähnlichen" Fenster-Terminal-Emulatoren, die möglicherweise wie ein XTerm "aussehen". Beispielsweise haben "gnome-terminal" oder "konsole" unterschiedliche Escape-Sequenzen oder implementieren möglicherweise überhaupt keine Farbänderung.

Greg
quelle
1
Das funktioniert bei mir nicht, es gibt eine leere Zeile ohne erkennbare Änderung im Terminal wieder.
Richard
1
Dies funktionierte für mich, während die anderen nicht - sehr hilfreich, thx
vol7ron
+1 ändert den Fensterhintergrund und erlaubt Farbnamen - wie "grün" anstelle von "# 00ff00".
Rob ich
1
wie ist # 53186f 32-Bit-Farben. Ich zähle 24 Bits ...
jiggunjer
Weiß jemand, wie man dasselbe mit gnome-terminal macht?
wjandrea
3

Ja. ANSI-Terminals unterstützen ANSI-Escape-Codes . Jeder Control Sequence Introducer( CSI) Code im folgenden Format:

ESC[<<<CODE>>>

Das Ascii-Zeichen 27(das ESCZeichen) oder 1bhexadezimal, gefolgt von einer linken eckigen Klammer und einem Buchstaben, der die zu verwendende Aktion angibt.

Beachten Sie, dass eine Liste der ;getrennten Parameter direkt vor dem <<<CODE>>>Parameter angegeben werden kann.

Jetzt verwenden Farben eine Untergruppe von CSICodes, die Select Graphic RenditionCodes. Diese sind in der Form:

ESC[<<<SGR>>>m

Der SGRCode wird als Parameter übergeben CSI. Relevant für Ihre Frage sind die SGRCodes 30-49. Mit den Codes 30-39 wird die Vordergrundfarbe eingestellt. Mit den Codes 40-49 wird die Hintergrundfarbe eingestellt.

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

Die Codes 38 und 48 sind Sondercodes. Mit diesen können Sie RGB-Werte verwenden. Das Format für diese ist:

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

Hinweis: alternative Verwendungen umfassen \x1b[<3 or 4>8;5;<web safe color index>m. Bei dieser Verwendung gibt es eine völlig andere Farbcodierung. Weitere Informationen finden Sie über den Link oben in dieser Antwort.

Mit den Codes 39 und 49 werden die Vordergrund- und Hintergrundfarben auf ihre Standardwerte gesetzt, die Terminal für Terminal festgelegt werden.

In der Praxis unterscheiden sich die Farben 30-37 40-47 geringfügig von den Angaben auf den Etiketten.

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

Um helle Farben zu erhalten, verwenden Sie die SGI für Fettdruck 1. Fett ist ein irreführender Name. Die Schrift wird dadurch nicht fett dargestellt. Tatsächlich wird die Helligkeit des Texts erhöht. Mit Fettdruck werden die Farben:

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

Hinweis: Die letzten beiden Farbblöcke sind sowohl für den Vorder- als auch für den Hintergrund relevant ( <index> + (30 or 40)).

Verwenden Sie SGR0, um alle Stile zu entfernen (zurück zum Standard- / Normalmodus) .

CSICodes sind nicht alle grafisch. Zum Beispiel ESC[2Jwird Ihr Terminal gelöscht. ESC[<y>;<x>HSetzt die Cursorposition (1-indiziert). Weitere Informationen finden Sie im Wikipedia-Artikel.

Hinweis: Um diese zu testen, verwenden Sie echo -eoder printf.

Élektra
quelle
2

HINWEIS: Das "^ [" ist das Escape-Zeichen und wird mit STRG-V, STRG- [und ^ G eingefügt. Es ist ein Glockenzeichen, das mit STRG-V, STRG-G eingefügt wird

Der folgende Block befindet sich in meinem .bash_profile und stellt sicher, dass meine xterms auf diesem System IMMER weiß auf schwarz sind, auch nachdem ich mich bei einem anderen System angemeldet habe, das möglicherweise meine Farben geändert hat.

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}
--> '
Mike
quelle
0

überprüfen Sie auch ein Projekt ScriptEchoColor
es vollständig in Bash - Skripte gemacht
hat Pakete für Ubuntu hier
aber diese Skripte können auf jeder Distribution installiert werden , wenn Sie wissen , wie man (letzte von seinem Git heruntergeladen werden kann).

Sie können verkürzte oder erweiterte Farbnamen verwenden, z.

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

eine Probe: Bildbeschreibung hier eingeben

Schauen Sie sich auch unbedingt xtermcontrol an , um eine umfassendere Kontrolle über das xterm selbst (nicht nur die Zeichen) zu erhalten.

Wassermann Power
quelle
0

Unter den vielen ANSI- CSI-Codes befindet sich einer mit der Bezeichnung SGR oder Select Graphic Rendition. Hierbei handelt es sich um ESC,, [-Parameter, mwobei die Parameter eine oder mehrere Ganzzahlen im ASCII-Format sind, die durch Semikolons getrennt sind. Die vielen verschiedenen SGR-Parameter sind oben auf der Wikipedia-Seite aufgeführt (obwohl sie nicht für alle Einzelheiten gelten).

Einige Parameter, wie beispielsweise 1(fett oder erhöhte Intensität) und 31(roter Text) sind eigenständige, und können einzeln oder in Kombination verwendet werden, wie in ESC[31moder ESC[1;31mStandard rot und fett roten Vordergrundtext zu geben, respectively.

Andere nehmen Parameter selbst, die einfach nach dem Code als durch Semikolons getrennte Zahlen angegeben werden. So ESC[38;5;219mwürde beispielsweise Vordergrundtext in der erweiterten Farbe Nummer 219 ESC[38;2;150;100;50mangezeigt und in der Farbe mit den RGB-Werten 150, 100, 50 angezeigt. In diesem Fall 38ist dies der Befehl "Erweiterte Vordergrundfarbe festlegen", dem immer gefolgt wird ein Unterbefehl. Der Unterbefehl akzeptiert 2drei Parameter, die Werte der roten, grünen und blauen Komponenten. Im Gegensatz dazu 5nimmt der Unterbefehl nur einen weiteren Wert an, eine Zahl von 0 bis 255, die eine Farbe aus einer Tabelle angibt, mit der das Terminal konfiguriert ist.

Die folgende Shell-Funktion kann für die Verwendung dieser Codes nützlich sein:

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

Du kannst es so benutzen:

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)."

Beachten Sie, dass sgr()der SGR-Code 0 standardmäßig verwendet wird , wenn Sie keine Parameter angeben. Dies bedeutet, dass alle Attribute deaktiviert werden und der Text auf den Standardwert für dieses Terminal zurückgesetzt wird.

Curt J. Sampson
quelle
1
Technisch gesehen können / sollten diese ESC[38... mund ESC[38... m(hängt von Ihrer Informationsquelle ab - die ultimative davon ist, glaube ich , itu.int/rec/T-REC-T.416-199303-I ), ansonsten reserviertes Zeichen :(um die Parameterelemente zu trennen ), damit das ;nur zwischen kompletten Parameterstrings verwendet wird - also geschrieben ESC[38;2;150;100;50mwerden soll ESC[38:2::150:100:50m...
SlySven
... leider vergessen Implementierungen oft die Farbraum-ID zwischen dem 2und dem 150- da mir noch niemand bekannt ist, welcher Wert dort hineingehen soll, soll der leere Standard verwendet werden - wird aber oft übersehen und die Verwendung nur ;als Trennzeichen macht es unmöglich, die Informationen zuverlässig gemäß der Spezifikation zu verarbeiten.
SlySven