Wenn Sie Steuerzeichen in die Shell eingeben, werden diese in der sogenannten „Caret-Notation“ angezeigt. Escape wird beispielsweise als ^[
geschrieben in Caret-Notation.
Ich passe meine Bash-Shell gerne an, damit sie cool aussieht. Ich habe zum Beispiel meine PS1
geändert und PS2
eingefärbt werden. Ich möchte jetzt, dass auch Steuerzeichen ein einzigartiges Aussehen erhalten, um sie besser von normalen Zeichen unterscheiden zu können.
$ # Here I type CTRL-C to abort the command.
$ blahblah^C
^^ I want these two characters to be displayed differently
Gibt es eine Möglichkeit, Steuerzeichen in meiner Shell anders hervorzuheben?
Ist es möglich, sie in Fettschrift oder in anderen Farben als normaler Text anzuzeigen?
Ich verwende bash Shell hier, aber ich habe die Frage nicht mit bash
getaggt denn vielleicht gibt es eine Lösung, die für viele verschiedene Shells gilt.
Hinweis dass ich nicht weiß, auf welcher Ebene die Hervorhebung von Steuerzeichen erfolgt. Ich dachte erst es liegt an der Schale selbst. Jetzt habe ich gehört, dass es readline ist das steuert, wie Steuerzeichen in Shells wie bash sind . Also ist die Frage jetzt mit readline
getaggt und ich suche immer noch nach Antworten.
Akzeptierte Antwort:
Wenn Sie Strg+X drücken schreibt Ihr Terminal-Emulator das Byte 0x18 auf die Master-Seite des Pseudo-Terminal-Paares.
Was als nächstes passiert, hängt davon ab, wie die tty-Leitungsdisziplin (ein Softwaremodul im Kernel, das sich zwischen der Master-Seite (unter der Kontrolle des Emulators) und der Slave-Seite (mit der im Terminal laufende Anwendungen interagieren)) konfiguriert ist.
Ein Befehl zum Konfigurieren dieser TTY-Zeilendisziplin ist die stty
Befehl.
Beim Ausführen einer dummen Anwendung wie cat
das nicht weiß und sich nicht darum kümmert, ob seine stdin ein Terminal ist oder nicht, das Terminal befindet sich in einem standardmäßigen canonical Modus, in dem die tty-Zeilendisziplin einen groben Zeileneditor implementiert .
Einige interaktive Anwendungen, die mehr als diesen primitiven Zeileneditor benötigen Ändern Sie diese Einstellungen normalerweise beim Start und stellen Sie sie beim Verlassen wieder her. Moderne Shells, an ihrer Eingabeaufforderung sind Beispiele für solche Anwendungen. Sie implementieren ihren eigenen fortschrittlicheren Zeileneditor.
Während Sie eine Befehlszeile eingeben, versetzt die Shell normalerweise die tty-Zeilendisziplin in diesen Modus, und wenn Sie die Eingabetaste drücken, um den aktuellen Befehl auszuführen, stellt die Shell den normalen tty-Modus wieder her (wie er vor Ausgabe der Eingabeaufforderung wirksam war). /P>
Wenn Sie stty -a
ausführen Befehl, sehen Sie die aktuellen Einstellungen, die für die dummen Anwendungen verwendet werden . Wahrscheinlich sehen Sie das icanon
, echo
und echoctl
Einstellungen aktiviert werden.
Das bedeutet Folgendes:
icanon
:dieser grobe Zeileneditor ist aktiviert.echo
:Von Ihnen eingegebene Zeichen (die der Terminal-Emulator auf die Master-Seite schreibt) werden echoed zurück (vom Terminal-Emulator zum Lesen bereitgestellt).echoctl
:anstatt echoed zu werden Dabei werden die Steuerzeichen echoed als^X
.
Nehmen wir also an, Sie geben A ein B Backspace-auch bekannt als Strg+H/? C Strg+X Rücktaste Zurück .
Ihr Terminal-Emulator sendet:ABbCx18br
. Die Liniendisziplin wird echo Rückseite:ABb bC^Xb bb brn
, und eine Anwendung, die die Eingabe von der Slave-Seite liest (/dev/pts/x
) liest ACn
.
Alles, was die Anwendung sieht, ist ACn
, und nur wenn Sie Enter drücken es kann also keine Kontrolle über die Ausgabe für ^X
haben dort.
Sie werden das bei echo bemerken , das erste ^H
(^?
bei einigen Terminals siehe erase
Einstellung) führte zu b b
an das Terminal zurückgesendet. Das ist die Sequenz, um den Cursor zurück zu bewegen, mit Leerzeichen zu überschreiben, den Cursor wieder zurück zu bewegen, während der zweite ^H
führte zu b bb b
um diese beiden ^
zu löschen und X
Zeichen.
Der ^X
(0x18) selbst wurde in ^
übersetzt und X
für Ausgabe. Wie B
, hat es nicht in die Anwendung geschafft, da wir es mit der Rücktaste gelöscht haben.
r
(auch bekannt als ^M
) wurde in rn
übersetzt (^M^J
) für echo und n
(^J
) für die Anwendung.
Also, was sind unsere Möglichkeiten für diese Dummen Anwendungen:
- deaktiviere
echo
(stty -echo
). Das ändert effektiv die Art und Weise, wie Steuerzeichen wiedergegeben werden, indem … nichts wiedergegeben wird. Nicht wirklich eine Lösung. - deaktiviere
echoctl
. Das ändert die Art und Weise, wie Steuerzeichen (außer^H
,^M
… und alle anderen vom Zeileneditor verwendeten) werden geechot. Sie werden dann echoed wie es ist. Das heißt zum Beispiel, das ESC-Zeichen wird alse
gesendet (^[
/0x1b
) Byte (das vom Terminal als Beginn einer Escape-Sequenz erkannt wird),^G
Sie senden einena
(ein BEL, das Ihr Terminal piepen lässt)… Keine Option. - Deaktivieren Sie den groben Zeileneditor (
stty -icanon
). Nicht wirklich eine Option, da die groben Anwendungen viel weniger brauchbar werden würden. - bearbeite den Kernel-Code, um das Verhalten der tty-Zeilendisziplin zu ändern, also das echo eines Steuerzeichens sendet
e[7m^Xe[m
statt nur^X
(hiere[7m
aktiviert in den meisten Terminals normalerweise Reverse-Video).
Eine Option könnte sein, einen Wrapper wie rlwrap
zu verwenden Das ist ein schmutziger Hack, um dummen Anwendungen einen ausgefallenen Zeileneditor hinzuzufügen. Dieser Wrapper versucht tatsächlich, einfaches read()
zu ersetzen s vom Endgerät zu Aufrufen des readline-Zeileneditors (der den Modus der tty-Zeilendisziplin ändert).
Wenn Sie noch weiter gehen, könnten Sie sogar Lösungen wie diese ausprobieren, die alle Eingaben vom Terminal entführen, um den Zeileneditor von zsh zu durchlaufen (der zufällig ^X
hervorhebt s in Reverse-Video) basierend auf :exec
von GNU screen Funktion.
Für Anwendungen, die ihren eigenen Zeileneditor implementieren, liegt es nun an ihnen zu entscheiden, wie das echo ist fertig. bash
verwendet readline für das, was keine Unterstützung für die Anpassung der Echos von Steuerzeichen bietet.
Für zsh
, siehe:
info --index-search='highlighting, special characters' zsh
zsh
hebt standardmäßig nicht druckbare Zeichen hervor. Sie können die Hervorhebung beispielsweise anpassen mit:
zle_highlight=(special:fg=white,bg=red)
Zur weißen auf roten Hervorhebung dieser Sonderzeichen.
Die Textdarstellung dieser Zeichen ist jedoch nicht anpassbar.
In einem UTF-8-Gebietsschema wird 0x18 als ^X
gerendert , u378
, U7fffffff
(zwei nicht zugewiesene Unicode-Codepunkte) als <0378>
, <7FFFFFFF>
, u200b
(ein nicht wirklich druckbares Unicode-Zeichen) als <200B>
.
x80
in einem iso8859-1-Gebietsschema würde als ^�
gerendert werden … usw.