Wenn Sie Steuerzeichen in die Shell eingeben, werden diese in der sogenannten "Caret-Notation" angezeigt. Escape zum Beispiel wird wie ^[
in Caret-Notation geschrieben.
Ich mag es, meine Bash-Shell so anzupassen, dass sie cool aussieht. Ich habe zum Beispiel meine geändert PS1
und PS2
eingefärbt. Ich möchte jetzt, dass Steuerzeichen auch ein einzigartiges Erscheinungsbild erhalten, damit sie sich besser von normalen Zeichen unterscheiden 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, meine Shell Steuerzeichen anders hervorzuheben?
Ist es möglich, sie fett darzustellen oder in anderen Farben als normalem Text darzustellen?
Ich verwende hier die Bash- Shell, aber ich habe die Frage nicht mit bash
markiert, da es möglicherweise eine Lösung gibt, die für viele verschiedene Shells gilt.
Beachten Sie, dass ich nicht weiß, auf welcher Ebene das Hervorheben von Steuerzeichen stattfindet. Ich dachte zuerst, dass es in der Muschel selbst war. Jetzt habe ich gehört, dass readline steuert, wie Steuerzeichen in Shells wie Bash sind . Die Frage ist also jetzt markiert readline
und ich suche immer noch nach Antworten.
bash
sie istreadline
das Zeug Handhabung und für die meisten anderen ist es die tty - Treiber.vi
undless
oft anders hervorheben als normaler Text. Ich werde die Frage mit diesen Informationen bearbeiten. Vielen Dank!zsh
was das aus der Box macht.Antworten:
Wenn Sie drücken Ctrl+X, schreibt Ihr Terminal-Emulator das Byte 0x18 auf die Masterseite des Pseudo-Terminal-Paares.
Was als nächstes passiert, hängt davon ab, wie die tty line-Disziplin (ein Softwaremodul im Kernel, das sich zwischen der Masterseite (unter Kontrolle des Emulators) und der Slaveseite (mit welchen Anwendungen das Terminal interagiert) befindet) konfiguriert ist.
Ein Befehl zum Konfigurieren dieser tty-Zeilendisziplin ist der
stty
Befehl.Wenn eine dumme Anwendung ausgeführt wird wie
cat
das nicht bewusst ist , und kümmert sich nicht darum , ob seine stdin ein Terminal ist oder nicht, ist das Terminal in einem Standard kanonische Modus , in dem die Disziplin Geräte tty Linie eine grobe Editor Linie .Einige interaktive Anwendungen, die mehr als diesen einfachen Zeileneditor benötigen, ändern diese Einstellungen normalerweise beim Start und stellen sie beim Verlassen wieder her. Moderne Muscheln, an ihrem Prompt sind Beispiele für solche Anwendungen. Sie implementieren ihren eigenen erweiterten Zeileneditor.
Während Sie eine Befehlszeile eingeben, versetzt die Shell die tty-Zeilendisziplin in diesen Modus. Wenn Sie die Eingabetaste drücken, um den aktuellen Befehl auszuführen, stellt die Shell den normalen tty-Modus wieder her (wie er vor der Ausgabe der Eingabeaufforderung wirksam war).
Wenn Sie den
stty -a
Befehl ausführen , werden die aktuellen Einstellungen für die dummen Anwendungen angezeigt . Du bist wahrscheinlich die , um zu sehenicanon
,echo
und dieechoctl
Einstellungen werden aktiviert.Was das bedeutet ist, dass:
icanon
: Der Rohzeileneditor ist aktiviert.echo
: Zeichen (dass der Terminal - Emulator schreibt an die Master - Seite) sind vom Typ Echo zurück (zur Verfügung gestellt für das Lesen durch den Terminal - Emulator).echoctl
: Anstatt dass wiederholte asis, werden die Steuerzeichen hallte wie^X
.Angenommen, Sie tippen A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return.
Ihr Terminal - Emulator sendet:
AB\bC\x18\b\r
. Die Zeilendisziplin gibt zurück:AB\b \bC^X\b \b\b \b\r\n
und eine Anwendung, die die Eingabe von der Slave-Seite (/dev/pts/x
) liest, liestAC\n
.Alles, was die Anwendung sieht, ist
AC\n
, und nur wenn Sie drücken Enter, kann sie keine Kontrolle über die Ausgabe für^X
dort haben.Sie werden feststellen, dass für Echo das erste
^H
(^?
bei einigen Terminals, sieheerase
Einstellung)\b \b
zum Terminal zurückgesendet wurde. Das ist die Folge , um den Cursor zurück zu bewegen, überschrieben mit Raum, bewegt den Cursor wieder zurück, während die zweite^H
in Folge ,\b \b\b \b
diese beiden zu löschen^
undX
Zeichen.Das
^X
(0x18) selbst wurde in^
undX
für die Ausgabe übersetzt. Als obB
es nicht in die Anwendung geschafft hätte, da wir es mit Backspace gelöscht haben.\r
(aka^M
) wurde für das Echo in ( ) und für die Anwendung in\r\n
(^M^J
) übersetzt .\n
^J
Also, was sind unsere Optionen für diese dummen Anwendungen:
echo
(stty -echo
). Dies ändert effektiv die Art und Weise, wie Steuerzeichen wiedergegeben werden, indem ... nichts wiedergegeben wird. Keine wirkliche Lösung.echoctl
. Dadurch wird die Art und Weise geändert, in der Steuerzeichen (außer^H
,^M
... und alle anderen vom Zeileneditor verwendeten) wiedergegeben werden. Sie werden dann unverändert wiedergegeben . Das heißt, das ESC-Zeichen wird als\e
(^[
/0x1b
) Byte gesendet (das vom Terminal als Beginn einer Escape-Sequenz erkannt wird),^G
Sie senden ein\a
(ein BEL, wodurch Ihr Terminal piept) ... Keine Option .stty -icanon
). Nicht wirklich eine Option, da die Rohanwendungen viel weniger verwendbar wären.\e[7m^X\e[m
statt nur gesendet wird^X
(\e[7m
in den meisten Terminals wird hier normalerweise das Rückvideo aktiviert).Eine Option könnte sein, einen solchen Wrapper zu verwenden
rlwrap
, der ein schmutziger Hack ist, um dummen Anwendungen einen ausgefallenen Zeileneditor hinzuzufügen. Dieser Wrapper versucht tatsächlich, einfacheread()
s vom Endgerät zu ersetzen , um Aufrufe des Zeileneditors zu lesen (die den Modus der tty-Zeilendisziplin ändern).Wenn Sie noch weiter gehen, können Sie sogar Lösungen wie diese ausprobieren , bei denen alle Eingaben vom Terminal entführt werden, um den Zeileneditor von zsh (der zufällig
^X
s im umgekehrten Video hervorhebt ) zu durchlaufen, wobei Sie auf die Funktion des GNU-Bildschirms angewiesen sind:exec
.Für Anwendungen, die einen eigenen Zeileneditor implementieren, müssen sie nun entscheiden, wie das Echo erfolgen soll.
bash
verwendet readline für das, was keine Unterstützung für das Anpassen der Echowiedergabe von Steuerzeichen bietet.Für
zsh
finden Sie unter :zsh
hebt standardmäßig nicht druckbare Zeichen hervor. Sie können die Hervorhebung zum Beispiel anpassen mit:Für die Hervorhebung von Weiß auf Rot für diese Sonderzeichen.
Die Textdarstellung dieser Zeichen ist jedoch nicht anpassbar.
In einem UTF-8 locale wird 0x18 gemacht als
^X
,\u378
,\U7fffffff
(zwei nicht zugewiesene Unicode - Codepunkte) als<0378>
,<7FFFFFFF>
,\u200b
(eine nicht wirklich druckbaren Unicode - Zeichen) wie<200B>
.\x80
in einem iso8859-1-Gebietsschema würde gerendert als^�
... etc.quelle
Ich habe normalerweise diesen Code in meiner .bashrc-Datei:
und dann rufe ich diese funktion in meiner ps1 auf
Wenn Sie nun ^ C drücken, wird dies in Ihrer Eingabeaufforderung angezeigt
Alle Beendigungsstatuscodes, die nicht "0" sind, werden aufgefordert.
quelle