Antworten:
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.
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 [[B
Werte. 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;3C
ist 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
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 bash
erwarten 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 alssmm
und angegeben werdenrmm
.
bash
weiß 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 xterm
Einfü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 xterm
Terminalbeschreibung 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:
Nur wenige Programme würden das erste tun. einige Texteditoren würden die zweite tun (tatsächlich, ich habe dies für ded
in den späten 1980er Jahren ). Entwickler für Anwendungen wie z. B. haben bash
den 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 vim
die tatsächlichen Belegung der Funktionstasten angibt .
Da keine der Zeichenfolgen, bash
die mit den empfangenen Zeichenfolgen verglichen werden, verwirrt werden kann, kann es zu partiellen Übereinstimmungen kommen (z. B. das Escape-Zeichen selbst).
Weitere Lektüre: