Wenn ich drücke AltUp, A
wird auf dem Terminalbildschirm gedruckt. Dasselbe passierte, als ich drückte, AltDownaber B
stattdessen wird gedruckt.
Andere Charaktere, die mir klar wurden;
AltLeft= D
und 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
^[
\033
Key
Beim Drücken von Upsenden die meisten Terminalemulatoren entweder die drei Zeichen \033[A
oder , \033OA
je 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'
bar
Sie 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 zsh
oder 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 .vi
kcuu1
Up
Nun mögen Alt-Upeinige Terminals für rxvt
und dessen Ableitungen wie eterm
send \033
gefolgt von der Escape-Sequenz für Up(also \033\033[A
oder \033\033OA
), während andere wie xterm
oder gnome-terminal
separate Escape-Sequenzen für diese Tastentypen haben, wenn sie mit Kombinationstasten wie Alt, Shift, verwendet werden Ctrl.
Diese werden normalerweise \033[1;3A
per 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[A
oder \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. bash
Beispielsweise wird es \033[1;3
als 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[1
also wird es diese überspringen und den Rest lesen: ;3A
und das in den Zeileneditor einfügen.
Viele Anwendungen wie vi
, zsh
oder readline
basierend auf , wie gdb
oder bash
(beachten Sie jedoch, bash
dass eine geänderte Version von verwendet wird readline
), ermöglichen Ihnen, Bindungen für beliebige Zeichenfolgen hinzuzufügen.
Beispielsweise zsh
mö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;3C
ist 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 , bash
erwarten, 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 mit
km
. 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 alssmm
Undrmm
.
bash
weiß 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 xterm
Einfü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 xterm
vonPC-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 diexterm
Terminalbeschreibung 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:
- Analysieren Sie die Zeichenfolge vollständig
- Analysieren Sie es teilweise und verwerfen Sie den controlModifikator, wenn er nicht benötigt wird
- 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ürded
imEnde der 1980er Jahre). Entwickler von Anwendungen wie bash
wä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. xterm
Gilt dies für dieTcap-Abfragemit der Bereitstellung vim
der tatsächlichen Funktionstastenbelegungen.
Da keine der bash
verglichenen 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: