Abhängig davon, wie das Terminal konfiguriert ist, Tippen Alt+Keyist wie die Eingabe Escund die KeyTasten in der Reihenfolge, so dass er das ESC - Zeichen sendet (aka \e
oder ^[
oder \033
) , gefolgt von dem Zeichen oder eine Folge von Zeichen beim Drücken , die gesendet Key.
Beim Drücken von Upsenden die meisten Terminalemulatoren entweder die drei Zeichen \033[A
oder, \033OA
je nachdem, ob sie sich im Tastaturmodus der Anwendung befinden oder nicht.
Die erste entspricht der Escape-Sequenz, die bei der Ausgabe an das Terminal den Cursor nach oben bewegt. Wenn Sie tun:
printf '\nfoo\033[Abar\n\n'
Sie werden bar
nach foo
einer Zeile geschrieben sehen . Wenn Sie tun:
stty -echoctl; tput rmkx; read foo
Sie werden sehen, dass die Pfeiltasten den Cursor bewegen.
Wenn eine Anwendung diese Zeichenfolge vom Terminal liest zsh
oder mag vi
, interpretiert sie sie als "Auf" -Aktion, da sie aus der terminfo-Datenbank ( kcuu1
Funktion) weiß, dass es sich um die Escape-Sequenz handelt, die beim Drücken von gesendet wirdUp .
Nun, Alt-Upeinige Terminals mögen rxvt
und seine Ableitungen mögen eterm
senden, \033
gefolgt von der Escape-Sequenz für Up(das heißt \033\033[A
oder \033\033OA
), während andere mögen xterm
oder gnome-terminal
separate Escape-Sequenzen für diese Arten von Schlüsseln haben, wenn sie mit den Kombinationstasten wie Alt, verwendet Shiftwerden.Ctrl .
Diese werden typischerweise senden \033[1;3A
aufAlt-Up .
Beim Senden an das Terminal bewegt diese Sequenz auch den Cursor nach oben (der zweite Parameter (3) wird ignoriert). Es gibt keine entsprechende Tastaturtaste. Es wird also dieselbe Sequenz gesendet, wenn Alt-Updie Anwendungstastatur aktiviert oder deaktiviert wird .
Nun, ob es ist \033\033[A
oder\033[1;3A
viele Anwendungen nicht wissen , was diese Sequenzen sind für. Die terminfo-Datenbank wird ihnen nicht helfen, da es keine solche Funktion gibt, die definiert, welche Zeichen diese Tastenkombinationen senden.
Sie werden ihr Bestes geben, um diese Sequenz zu interpretieren. bash
wird zum Beispiel \033[1;3
als Escape-Sequenz interpretiert , weiß nichts darüber, tut also nichts, gefolgt von A
. zsh
, hört auf zu lesen, sobald festgestellt wird, dass keine übereinstimmende Zeichenfolge bekannt ist. Es gibt keine Escape-Sequenz, von der bekannt ist, dass sie mit "Start" beginnt, \033[1
sodass diese übersprungen und der Rest gelesen wird:;3A
und diese in den Zeileneditor einfügt.
Viele Anwendungen wie vi
, zsh
oder readline
basiert sind wie gdb
oder bash
(obwohl Vorsicht bash
verwendet eine modifizierte Version readline
) können Sie Bindungen für jede Folge von Zeichen hinzuzufügen.
Zum Beispiel in zsh
, können Sie binden möchten Alt-Up, Alt-Downwie:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
Diese dienen dazu, den Verlauf vorwärts und rückwärts nach Befehlszeilen zu durchsuchen, die wie die aktuelle bis zur aktuellen Position des Cursors beginnen. Dies ist sehr praktisch, um frühere Befehle abzurufen.