Zum Beispiel:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
Ich kenne nur Kleinigkeiten, wie \e
steht für Flucht und C-
für Ctrl, aber was sind diese Zahlen ( 1
) und Buchstaben ( Z
)? Was sind die ;
, [
und -
Zeichen für?
Gibt es nur Versuch und Irrtum oder gibt es eine vollständige Liste der Bash-Schlüsselcodes und eine Erklärung ihrer Syntax?
bind -p
.Antworten:
Dies sind Zeichenfolgen, die von Ihrem Terminal gesendet werden, wenn Sie eine bestimmte Taste drücken. Es hat nichts mit Bash oder Readline per se zu tun, aber Sie möchten wissen, welche Zeichenfolge eine bestimmte Taste oder Tastenkombination sendet, wenn Sie konfigurieren möchten, dass
readline
bei einem bestimmten Tastendruck etwas ausgeführt wird.Wenn Sie die ATaste drücken, senden Terminals in der Regel das
a
Zeichen (0x61). Wenn Sie<Ctrl-I>
oder drücken<Tab>
, senden Sie in der Regel das^I
ZeichenTAB
oder\t
(0x9). Die meisten Funktions- und Navigationstasten senden im Allgemeinen eine Folge von Zeichen, die mit^[
(control- [)ESC
oder\e
(0x1b, 033 octal) beginnt. Die genaue Folge variiert jedoch von Terminal zu Terminal.Der beste Weg, um herauszufinden, was eine Taste oder Tastenkombination für Ihr Terminal sendet, ist, sie auszuführen
sed -n l
und anschließend Enterauf der Tastatur einzugeben. Dann sehen Sie etwas wie:Die erste Zeile wird durch das lokale Terminal verursacht, das
echo
vom Endgerät ausgeführt wird (dies ist möglicherweise nicht zuverlässig, da sich die Einstellungen des Endgeräts darauf auswirken würden).Die zweite Zeile wird von ausgegeben
sed
. Das$
soll nicht enthalten sein, es soll nur zeigen, wo das Ende der Zeile ist.Oberhalb Das bedeutet , dass Ctrl-Up(was ich gedrückt habe) senden und die sechs Zeichen
ESC
,[
,1
,;
,5
undA
(0x1b 0x5b 0x31 0x3b 0x35 0x41)Die
terminfo
Datenbank zeichnet eine Anzahl von Sequenzen für eine Anzahl von gemeinsamen Schlüsseln für eine Anzahl von Terminals auf (basierend auf dem$TERM
Wert).Zum Beispiel:
Würde Ihnen sagen, welche Escape-Sequenz
rxvt
beim Drücken der DeleteTaste gesendet wird.Sie können mit
infocmp
(hier unter der Annahme vonncurses
infocmp) nachsehen, welche Taste einer bestimmten Sequenz mit Ihrem aktuellen Terminal entspricht:Tastenkombinationen wie Ctrl-Uphaben keine entsprechenden Einträge in der
terminfo
Datenbank. Um herauszufinden, was sie senden, lesen Sie entweder die Quelle oder die Dokumentation für das entsprechende Terminal oder probieren Sie es mit dersed -n l
oben beschriebenen Methode aus.quelle
\e-1\C-i
ist ein Tabulator nach hinten, weilcontrol
undi
fügt einen Tabulator ein,escape
gefolgt von der-1
Anweisung bash, es einmal nach hinten zu machen (ich habe das gegoogelt und einiges gefundendigit-arguments
).$ sed -n 1
sed: -e expression #1, char 1: missing command
tput smkx
, Ihr Terminal sendet\e[OD
(kcub1
) und nachtput rmkx
,\e[D
(cub1
, den gleichen Code wie die Sequenz, bewegt den Cursor nach links, so dass das Echo dieser Tasten den Cursor bewegt. Versuchen Sie,stty -echoctl; tput rmkx; sleep inf
und Sie werden sehen , Die Pfeiltasten bewegen den Cursor, wenn sich das Gerät nicht im Tastaturmodus befindet .Es wird über die Gnu Readline-Bibliothek bereitgestellt. Sie sollten in die Readline von Mann 3 schauen , um die Beschreibung herauszufinden.
Anscheinend benötigen Sie auch Informationen darüber, was escspe-Codes liks
\[A
bedeuten. Sie finden diese Informationen in Wikipedia ANSI esacape Code- Artikel.quelle
\[A
ist in der Tabelle "CSI-Codes" in Zeile: "CSI n A"[Z
,[1;5C
oder-1
?Kommen diese Codes aus derselben Quelle? Die letzte sieht aus wie eine GNU-Readline-Bindung. Das ist es, was der Benutzer an eine Bash sendet (siehe Eile Antwort). Die ersten beiden sehen jedoch eher wie terminale Steuersequenzen aus (obwohl die erste schlecht geformt wäre). Das ist es, was Bash oder ein anderes Programm an den Terminal-Emulator zurücksendet, um Cursorbewegungen, Textfarben und dergleichen zu steuern.
quelle
Die einfachste Möglichkeit, zu überprüfen, welche Escape-Sequenz von einer Taste oder Tastenkombination generiert wird, besteht darin, in einem Terminal Ctrl+ vund anschließend die gewünschte Taste / Kombination zu drücken .
Sie erhalten eine Sequenz wie
^[Oa
und müssen die Darstellung, die Ihr System für das Escape-Zeichen erwartet,^[
in\e
oder\033
oder\x1b
oder in eine andere Darstellung übersetzen .Es begann als Emacs-Funktion mit dem Namen
quoted-insert
und wurde, da die Standardschlüsselbindungen für Bash und Zsh Emacs nachahmen, auch kopiert.Bash erhält es über die GNU Readline-Eingabebibliothek, das auch andere Dinge wie Pythons
import rlcompleter
Erweiterung verwenden.Hier ist die Beschreibung aus dem Readline-Handbuch :
Das sollte in allem funktionieren, was auf GNU Readline basiert.
Bei Zsh, das seine eigene Alternative namens ZLE verwendet, wird die ursprüngliche Emacs-
C-q
Bindung ironischerweise nur im Vi-Modus berücksichtigt, es wird jedochC-v
weiterhin der standardmäßige Emacs-ähnliche Eingabemodus verwendet. (Suchen Siequoted-insert
in denzshzle
Hilfeseiten oder zshall` nach, und das zweite Ergebnispaar sollte die Standardschlüsselbindungen auflisten.)Für eine mnemonic, rate ich denke an Ctrl+ vals darum zu bitten v erbatim.
quelle