Welche Zeichen werden gedruckt, wenn die Tasten Alt+Pfeil gedrückt werden?

Welche Zeichen werden gedruckt, wenn die Tasten Alt+Pfeil gedrückt werden?

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

Andere Charaktere, die mir klar wurden;

AltLeft= Dund AltRight=C

Was ist der Zweck dieser Befehle?

Antwort1

Je nach Konfiguration des Terminals entspricht das Tippen dem aufeinanderfolgenden Alt+KeyTippen der Tasten Escund , es wird also das ESC-Zeichen (auch bekannt als oder oder ) gefolgt vom Zeichen oder der Zeichenfolge gesendet, die beim Drücken von gesendet wird .Key\e^[\033Key

Beim Drücken von Upsenden die meisten Terminalemulatoren entweder die drei Zeichen \033[Aoder , \033OAje nachdem, ob sie sich im Anwendungstastaturmodus befinden oder nicht.

Die erste entspricht der Escape-Sequenz, die bei der Ausgabe an das Terminal den Cursor nach oben bewegt. Wenn Sie dies tun:

printf '\nfoo\033[Abar\n\n'

barSie werden eine Zeile weiter oben Folgendes sehen foo. Wenn Sie das tun:

stty -echoctl; tput rmkx; read foo

Sie werden sehen, dass die Pfeiltasten den Cursor bewegen.

Wenn eine Anwendung diese Zeichenfolge vom Terminal abruft zshoder liest, interpretiert sie sie als die Aktion „Nach oben“, da sie aus der Terminfo-Datenbank ( Funktion) weiß, dass es sich um die Escape-Sequenz handelt, die beim Drücken von gesendet wird .vikcuu1Up

Nun mögen Alt-Upeinige Terminals für rxvtund dessen Ableitungen wie etermsend \033gefolgt von der Escape-Sequenz für Up(also \033\033[Aoder \033\033OA), während andere wie xtermoder gnome-terminalseparate Escape-Sequenzen für diese Tastentypen haben, wenn sie mit Kombinationstasten wie Alt, Shift, verwendet werden Ctrl.

Diese werden normalerweise \033[1;3Aper gesendet Alt-Up.

Wenn diese Sequenz an das Terminal gesendet wird, bewegt sie auch den Cursor nach oben (der zweite Parameter (3) wird ignoriert). Es gibt keine entsprechendeTastenfeldTaste, also ist es die gleiche Sequenz, die Alt-Upin oder aus gesendet wirdAnwendungstastaturmodus.

Ob nun \033\033[Aoder \033[1;3A, viele Anwendungen wissen nicht, wofür diese Sequenzen sind. Die Terminfo-Datenbank hilft ihnen dabei nicht weiter, da es keine Funktion gibt, die definiert, welche Zeichen diese Tastenkombinationen senden.

Sie werden ihr Bestes geben, um diese Sequenz zu interpretieren. bashBeispielsweise wird es \033[1;3als Escape-Sequenz interpretiert, weiß nichts darüber und tut daher nichts, gefolgt von A. zsh, wird das Lesen beenden, sobald es feststellt, dass keine bekannte übereinstimmende Zeichenfolge vorhanden ist. Es ist keine Escape-Sequenz bekannt, die mit beginnt, \033[1also wird es diese überspringen und den Rest lesen: ;3Aund das in den Zeileneditor einfügen.

Viele Anwendungen wie vi, zshoder readlinebasierend auf , wie gdboder bash(beachten Sie jedoch, bashdass eine geänderte Version von verwendet wird readline), ermöglichen Ihnen, Bindungen für beliebige Zeichenfolgen hinzuzufügen.

Beispielsweise zshmöchten Sie in möglicherweise wie folgt binden Alt-Up:Alt-Down

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 beginnen, bis zur aktuellen Cursorposition, was sehr praktisch ist, um vorherige Befehle wieder aufzurufen.

Antwort2

Sie können Crtl+ verwenden v, um Eingabecodes Ihrer Tastatur zurückzugeben. Wenn Sie dies für die Pfeiltasten tun, erhalten Sie die Werte [[D^, [[C^, [[A^, und [[B. Es gibt keine Standardbelegungen für Altdie Pfeiltasten +, daher scheint die ausgeführte Aktion nur das Drucken des Buchstabencodes zu sein. Wenn Sie jedoch Ihre lokale Version der Konfigurationsdatei der Readline-Bibliothek erstellen:

$ cp /etc/inputrc ~/.inputrc

Und fügen Sie eine Zeile hinzu:

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

Wo [1;3Cist der Eingabecode von Alt+ (Sie können ihn auf dieselbe Weise wie zuvor mithilfe der Tastenkombination Crtl+ abrufen v) und starten Sie Ihr Terminal neu. Anschließend gibt die Tastenkombination Crtl+ den Text „irgendwo hier“ zurück, und andere Tastenkombinationen mit +Pfeil geben keine Zeichen mehr zurück.Alt

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

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

um dieselbe Wirkung zu erzielen wie Crtl+ u(Zeile löschen).

Mehr Informationen hier:http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

Antwort3

Der AltSchlüssel wird oft verwendet alsMetaCursor- und Funktionstasten werden alsSondertastenda sie mehrere Zeichen senden können – und die gesendeten Zeichen geändert werden können.

Manche Benutzer, z. B. für , basherwarten, dass beim Drücken Alteine Taste mit dem vorangestellten Escape-Zeichen gesendet wird. Die dokumentierte „Meta“-Funktion (sieheterminfo(5)) befasst sich mit dem achten Bit:

Wenn das Terminal eine "Metataste" besitzt, die als Umschalttaste fungiert und das 8. Bit eines übertragenen Zeichens setzt, kann dies angezeigt werden mitkm. Andernfalls geht die Software davon aus, dass das 8. Bit Parität ist und es wird normalerweise gelöscht. Wenn Zeichenfolgen vorhanden sind, um dies zu ändern,"Metamodus" ein- und ausgeschaltet werden, können sie gegeben werden alssmmUndrmm.

bashweiß das auch (sieheHäufig gestellte Fragen zu ncurses), aber nur wenige seiner Benutzer interessieren sich für diese Funktion. Trotzdem sind sie es gewohnt, von Altals „Meta“ zu sprechen, auch wenn der Metamodus ausgeschaltet ist. Sowohl rxvt als auch xterm verfügen über diese Funktion seit (mindestens) den frühen 1990er Jahren.

Andere Benutzer (seit xtermEinführung der Funktion inPatch Nr. 94, 1999) kann erwarten, dass die Modifizierungsinformationen als Parameter in der Zeichenfolge codiert werden, die ein Sonderschlüssel senden würde. In der Dokumentation von XTerm werden diese modifizierten Schlüssel als"PC-Stil"Funktionstasten zur Unterscheidung von„VT220-Stil“(die keine Modifikatoren hatte). Eine unveränderte Cursortaste könnte senden ESC[A, aber es ist auch zulässig, eineParameter, zB, ESC[5A, die eine Anwendungsollenverstehen, dass dies fünfmal wiederholt wird. Die erste Version xtermvonPC-StilTasten verwendeten diese „5“, um anzuzeigen control, und eine spätere Version hat es geändert, um Verwechslungen mit der Wiederholungsanzahl zu vermeiden. Also...

ESC[5A

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

ESC[1;5A

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

Die nützlichen Kombinationen befinden sich seit2004:

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

Die Terminfo-Datenbank zeigt die aktuelle Version vonxterm+pcfkeysmit einem Kommentar, der zeigt, 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 sind nicht unbedingt die gleiche Taste). Das ist eineBaustein(wiederum aus anderen Bausteinen zusammengesetzt), aus denen diextermTerminalbeschreibung gebildet wird. Es verwendet eine Erweiterung, die in ncurses bereitgestellt wirdseit 1999die benutzerdefinierte Namen zulässt. Da termcap nur 2-stellige Namen und 1023-Byte-Beschreibungen unterstützt, gab es keinen Grund, diese erweiterten Namen über dasBegriffserklärungSchnittstelle. Sie sind für Anwendungen verfügbar, die dieTermininfoSchnittstelle.

Jetzt kommt eine Schwierigkeit: Es gibt einige Möglichkeiten für eine Anwendung, um zu bestimmen, was eine solche Tastenfolge darstellt:

  1. Analysieren Sie die Zeichenfolge vollständig
  2. Analysieren Sie es teilweise und verwerfen Sie den controlModifikator, wenn er nicht benötigt wird
  3. Vergleichen Sie einfach die Zeichenfolge mit einem Wörterbuch und hoffen Sie, auf diese Weise die Bedeutung zu ermitteln.

Nur wenige Programme können das erste; einige Texteditoren können das zweite (ich habe das tatsächlich getan).DasfürdedimEnde der 1980er Jahre). Entwickler von Anwendungen wie bashwählten den dritten Weg, indem sie davon ausgingen, dass die meisten Informationen inBegriffserklärung. Alternativ hätten sie sich dafür entscheiden können, eine Tabelle mit Termcap/Terminfo-Informationen zu erstellen und die Schnittstelle zu verwenden, die die besten Informationen liefert. xtermGilt dies für dieTcap-Abfragemit der Bereitstellung vimder tatsächlichen Funktionstastenbelegungen.

Da keine der bashverglichenen Zeichenfolgen mit den empfangenen Zeichenfolgen übereinstimmt, kann es zu Verwirrung kommen und das System muss sich mit teilweisen Übereinstimmungen zufrieden geben (wie etwa dem Escape-Zeichen allein).

Weiterführende Literatur:

verwandte Informationen