Welche Zeichen werden gedruckt, wenn Alt + Pfeiltasten gedrückt werden?

13

Wenn ich drücke AltUp, wird Aauf dem Terminalbildschirm gedruckt. Dasselbe passierte, als ich drückte, AltDownaber Bstattdessen gedruckt wurde.

Andere Charaktere, die ich realisiert habe;

AltLeft= Dund AltRight=C

Was ist der Zweck dieser Befehle?

yfklon
quelle

Antworten:

14

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 \eoder ^[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[Aoder, \033OAje 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 barnach fooeiner 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 zshoder mag vi, interpretiert sie sie als "Auf" -Aktion, da sie aus der terminfo-Datenbank ( kcuu1Funktion) weiß, dass es sich um die Escape-Sequenz handelt, die beim Drücken von gesendet wirdUp .

Nun, Alt-Upeinige Terminals mögen rxvtund seine Ableitungen mögen etermsenden, \033gefolgt von der Escape-Sequenz für Up(das heißt \033\033[Aoder \033\033OA), während andere mögen xtermoder gnome-terminalseparate 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;3AaufAlt-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[Aoder\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. bashwird zum Beispiel \033[1;3als 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[1sodass diese übersprungen und der Rest gelesen wird:;3A und diese in den Zeileneditor einfügt.

Viele Anwendungen wie vi, zshoder readlinebasiert sind wie gdboder bash(obwohl Vorsicht bashverwendet 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.

Stéphane Chazelas
quelle
3

Mit Crtl+ können Sie die vEingabecodes Ihrer Tastatur zurückgeben. Wenn Sie , dass für den Pfeiltasten tun, erhalten Sie [[D^, [[C^, [[A^, und [[BWerte. Es gibt keine Standardbindungen für Alt+ Pfeiltasten. Es scheint also, dass die ausgeführte Aktion nur den Buchstabencode druckt. Wenn Sie Ihre lokale Version der Readline-Bibliothekskonfigurationsdatei erstellen, gehen Sie wie folgt vor:

$ cp /etc/inputrc ~/.inputrc

Und füge eine Zeile hinzu:

"\e[1;3C": "sometexthere"

Wo [1;3Cist der Eingangscode von Alt+ (Sie können es genauso erhalten wie zuvor mit Crtl+ vVerknüpfung) und starten Sie den Terminal dann Crtl+ Verknüpfung werden Sie „sometexthere“ und andere Rück Text Alt+ Pfeil Verknüpfungen werden Rückkehr Zeichen stoppen.

Anstelle von Text können Sie einen bindbaren Befehl von http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands wie übergeben

"\e[1;3C": unix-line-discard

um den gleichen Effekt zu erzielen wie Crtl+ u(Zeile löschen).

Weitere Informationen finden Sie hier: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

Nykakin
quelle
3

Der AltSchlüssel wird häufig als Meta- Modifikator verwendet. Cursor- und Funktionstasten werden als Sondertasten bezeichnet, da sie mehrere Zeichen senden können - und die gesendeten Zeichen können geändert werden.

Einige Benutzer basherwarten beispielsweise, dass durch Drücken von Alteine Taste gesendet wird, der das Escape-Zeichen vorangestellt ist. Das dokumentierte "Meta" -Feature (siehe terminfo(5)) befasst sich mit dem achten Bit:

Wenn das Terminal eine "Meta-Taste" hat, die als Umschalttaste fungiert und das 8. Bit eines übertragenen Zeichens setzt, kann dies mit angezeigt werden km. Andernfalls geht die Software davon aus, dass das 8. Bit Parität ist, und es wird normalerweise gelöscht. Wenn Zeichenfolgen zum Ein- und Ausschalten dieses "Metamodus" vorhanden sind, können sie als smmund angegeben werden rmm.

bashweiß auch darüber Bescheid (siehe ncurses FAQ ), aber nur wenige seiner Benutzer sind an der Funktion interessiert. Sie sind es jedoch gewohnt, auf Alt"Meta" zu verweisen , obwohl der Meta-Modus deaktiviert ist. Sowohl rxvt als auch xterm haben diese Funktion seit (mindestens) Anfang der 1990er Jahre.

Andere Benutzer (seit xtermEinführung der Funktion in Patch Nr. 94, 1999 ) können erwarten, dass die Modifikatorinformationen als Parameter in der Zeichenfolge codiert werden, die ein spezieller Schlüssel senden würde. In der XTerm-Dokumentation wurden diese geänderten Tasten als Funktionstasten im PC-Stil bezeichnet, um sie von den Tasten im VT220-Stil (ohne Modifikatoren) zu unterscheiden. Eine unveränderte Cursor - Taste könnte senden ESC[A, aber es ist auch zulässig , einen haben , Parameter , zum Beispiel ESC[5A, was eine Anwendung soll verstehen , dass fünf Mal so wiederholen. Die erste Version von xterm‚s PC-Stil Tasten , dass‚5‘zu bezeichnencontrol, und eine spätere Version hat dies geändert, um Verwechslungen mit der Wiederholungszahl zu vermeiden. So...

ESC[5A

schlägt vor, dass die Anwendung den Cursor um 5 Zeilen nach oben bewegt, während

ESC[1;5A

schlägt vor, um eine Zeile nach oben zu rücken und der Anwendung mitzuteilen, dass eine controlTaste gedrückt wurde.

Die nützlichen Kombinationen befinden sich seit 2004 in der Datenbank ncurses terminfo :

# 2004-07-17
#       * add xterm-pc-fkeys -TD

Die terminfo-Datenbank zeigt die aktuelle Version von xterm + pcfkeys mit einem Kommentar, der angibt , wie die Modifikatoren codiert sind:

# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
#    Code     Modifiers
#  ---------------------------------
#     2       Shift
#     3       Alt
#     4       Shift + Alt
#     5       Control
#     6       Shift + Control
#     7       Alt + Control
#     8       Shift + Alt + Control
#  ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.

(Alt und Meta müssen nicht unbedingt dieselbe Taste sein). Dies ist ein Baustein (der sich wiederum aus anderen Bausteinen zusammensetzt), aus dem die xtermTerminalbeschreibung gebildet wird. Es verwendet eine seit 1999 in ncurses bereitgestellte Erweiterung , die benutzerdefinierte Namen zulässt. Da termcap nur 2-stellige Namen und 1023-Byte-Beschreibungen unterstützt, gab es keinen Grund, diese erweiterten Namen über die termcap- Schnittstelle verfügbar zu machen . Sie stehen Anwendungen über die Terminfo- Schnittstelle zur Verfügung.

Jetzt tritt eine Schwierigkeit auf: Eine Anwendung kann auf verschiedene Arten ermitteln, was eine solche Tastenfolge darstellt:

  1. analysieren Sie die Zeichenfolge vollständig
  2. Analysiere es teilweise und wirf den controlModifikator weg, wenn er nicht benötigt wird
  3. Vergleichen Sie einfach die Zeichenfolge mit einem Wörterbuch, in der Hoffnung, die Bedeutung auf diese Weise zu bestimmen.

Nur wenige Programme würden das erste tun. einige Texteditoren würden die zweite tun (tatsächlich, ich habe dies für dedin den späten 1980er Jahren ). Entwickler für Anwendungen wie z. B. haben bashden dritten Weg gewählt, indem sie davon ausgegangen haben, dass sich die meisten Informationen in termcap befinden . Alternativ hätten sie eine Tabelle mit termcap / terminfo-Informationen erstellen und die Schnittstelle verwenden können, die die besten Informationen liefert. Tutxterm dies für die Funktion tcap-query , die vimdie tatsächlichen Belegung der Funktionstasten angibt .

Da keine der Zeichenfolgen, bashdie mit den empfangenen Zeichenfolgen verglichen werden, verwirrt werden kann, kann es zu partiellen Übereinstimmungen kommen (z. B. das Escape-Zeichen selbst).

Weitere Lektüre:

Thomas Dickey
quelle