Wo finde ich eine Liste der Terminal-Tastencodes, um Verknüpfungen in Bash neu zuzuordnen?

42

Zum Beispiel:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Ich kenne nur Kleinigkeiten, wie \esteht 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?

Fehler
quelle
2
Ein zusätzlicher Tipp zum Auflisten der tatsächlichen Readline- Bindungen der Shell lautet bind -p.
1
Die meisten dieser Codes werden von Ihrem Terminal interpretiert. Lesen Sie über ANSI-Escape-Codes auf Wikipedia für eine große Auflistung.
Chepner
stty -a zeigt die Leitungseinstellungen des Terminals an
Fehler

Antworten:

52

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 readlinebei einem bestimmten Tastendruck etwas ausgeführt wird.

Wenn Sie die ATaste drücken, senden Terminals in der Regel das aZeichen (0x61). Wenn Sie <Ctrl-I>oder drücken <Tab>, senden Sie in der Regel das ^IZeichen TABoder \t(0x9). Die meisten Funktions- und Navigationstasten senden im Allgemeinen eine Folge von Zeichen, die mit ^[(control- [) ESCoder \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 lund anschließend Enterauf der Tastatur einzugeben. Dann sehen Sie etwas wie:

$ sed -n l
^[[1;5A
\033[1;5A$

Die erste Zeile wird durch das lokale Terminal verursacht, das echovom 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, ;, 5und A(0x1b 0x5b 0x31 0x3b 0x35 0x41)

Die terminfoDatenbank zeichnet eine Anzahl von Sequenzen für eine Anzahl von gemeinsamen Schlüsseln für eine Anzahl von Terminals auf (basierend auf dem $TERMWert).

Zum Beispiel:

TERM=rxvt tput kdch1 | sed -n l

Würde Ihnen sagen, welche Escape-Sequenz rxvtbeim Drücken der DeleteTaste gesendet wird.

Sie können mit infocmp(hier unter der Annahme von ncursesinfocmp) nachsehen, welche Taste einer bestimmten Sequenz mit Ihrem aktuellen Terminal entspricht:

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Tastenkombinationen wie Ctrl-Uphaben keine entsprechenden Einträge in der terminfoDatenbank. Um herauszufinden, was sie senden, lesen Sie entweder die Quelle oder die Dokumentation für das entsprechende Terminal oder probieren Sie es mit der sed -n loben beschriebenen Methode aus.

Stéphane Chazelas
quelle
Dies ist eine großartige Erklärung, danke! Jetzt passt alles zusammen, \e-1\C-iist ein Tabulator nach hinten, weil controlund ifügt einen Tabulator ein, escapegefolgt von der -1Anweisung bash, es einmal nach hinten zu machen (ich habe das gegoogelt und einiges gefunden digit-arguments).
Fehler
$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx
3
@vib. Das ist Kleinbuchstaben L nicht Ziffer 1
Stéphane Chazelas
1
@ user367890, das hängt vom Tastaturmodus ab . Sie werden wahrscheinlich , dass nach finden tput smkx, Ihr Terminal sendet \e[OD( kcub1) und nach tput 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 infund Sie werden sehen , Die Pfeiltasten bewegen den Cursor, wenn sich das Gerät nicht im Tastaturmodus befindet .
Stéphane Chazelas
1
@ user367890, nach dem, was Thomas (der Betreuer von ncurses und xterm) in der von Ihnen verlinkten Antwort sagt, sollte es funktionieren. Der Tastaturmodus oder der Anwendungsmodus beziehen sich auf dasselbe, daher gelten (laut Thomas) die Schlüsselspezifikationen in der terminfo-Datenbank, wenn smkx aktiviert ist.
Stéphane Chazelas
4

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 \[Abedeuten. Sie finden diese Informationen in Wikipedia ANSI esacape Code- Artikel.

eilen
quelle
Dies erklärt meine Beispiele nicht.
Bug
Sieht so aus, als wäre es ein kleines Missverständnis. Bitte schauen Sie sich das Antwort-Update an.
Ansturm
Es gibt keine Informationen über meine spezifischen Beispiele im Artikel. Eine Seitensuche nach "[A" ergab ebenfalls nichts.
Bug
1
@ Bug lesen Sie bitte sorgfältig den Artikel. \[Aist in der Tabelle "CSI-Codes" in Zeile: "CSI n A"
Ansturm
Dank eilen, aber wo finde ich Erklärungen finden [Z, [1;5Coder -1?
Bug
3

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.

Uwe
quelle
Ich habe festgestellt, dass "\ e [1; 5C" für das Vorwärtsbewegen von Wörtern mit Strg-Pfeil verwendet wird, und "\ e [Z" und "\ e-1 \ Ci" für das Vervollständigen des Menüs rückwärts in anderen Tutorials. Sie wurden alle in der INPUTRC-Datei verwendet.
Bug
OK, wenn sie von readline interpretiert werden, muss es einen Terminal-Emulator geben, in dem diese Steuersequenzen an eine Kombination aus Strg, Alt und / oder Umschalt mit den Funktions- oder Pfeiltasten gebunden sind. (Ich weiß nicht welche.)
Uwe
0

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 ^[Oaund müssen die Darstellung, die Ihr System für das Escape-Zeichen erwartet, ^[in \eoder \033oder \x1boder in eine andere Darstellung übersetzen .

Es begann als Emacs-Funktion mit dem Namen quoted-insertund 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 rlcompleterErweiterung verwenden.

Hier ist die Beschreibung aus dem Readline-Handbuch :

quoted-insert( C-qoder C-v)

Fügen Sie das nächste Zeichen wörtlich in die Zeile ein. So fügen Sie beispielsweise Tastenkombinationen ein C-q.

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-qBindung ironischerweise nur im Vi-Modus berücksichtigt, es wird jedoch C-vweiterhin der standardmäßige Emacs-ähnliche Eingabemodus verwendet. (Suchen Sie quoted-insertin den zshzleHilfeseiten 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.

ssokolow
quelle