Auf einem Debian-System END
erzeugt das Drücken der Taste ^[[F
:
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[F 27 0033 0x1b
91 0133 0x5b
70 0106 0x46
Aber warum ist dieser Keychord nicht terminfo ?
$ infocmp -1 | grep end
kend=\EOF,
Trotzdem schafft es ncurses, es korrekt als zu erkennen KEY_END
. Wie?
TERM
ist xterm-256color
Übrigens, was ist die Motivation dahinter kend
und end
statt nur end
? (das gleiche für khome
und home
)
BEARBEITEN
Wie im Kommentar von Johan Myréen gesagt, ist khome
String die Sequenz, die durch Drücken der Home-Taste erzeugt wird. Aber bei Debian wird durch Drücken der Home-Taste erzeugt home
. Warum?
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[H 27 0033 0x1b
91 0133 0x5b
72 0110 0x48
$ infocmp -1 | grep home
home=\E[H,
khome=\EOH,
home
undkhome
besteht darin, dass diekhome
Zeichenfolge die Sequenz ist, die durch Drücken der Home-Taste erzeugt wird, während diehome
Zeichenfolge die Sequenz ist, die an das Terminal gesendet werden sollte, um den Cursor an die Home-Position zu bewegen. Meines Wissens definiert terminfo keineend
Fähigkeit, nurkend
.kend
ist wie\EOF
in terminfo definiert , während das Terminal generiert\E[F
? Ist das ein Fehler in Debians Terminfo ? Und wie schafft es ncurses , esKEY_END
trotzdem zu erkennen ?Antworten:
Die Antwort von Johan Myréen war knapp, aber nicht genau das Problem: Die meisten Terminalemulatoren, die Sie verwenden, verfügen über Normal- und Anwendungsmodi für Sondertasten. Terminalbeschreibungen werden für einen Modus geschrieben, der der Verwendung einer Vollbildanwendung entspricht. Andere Anwendungen (z. B. eine interaktive Shell ) initialisieren den Bildschirm normalerweise nicht, um den Anwendungsmodus zu verwenden . Bash ist ein Beispiel dafür.
Im normalen Modus senden xterm und ähnliche Terminals escape
[
(CSI), während im Anwendungsmodus ihre Tastaturen senden escapeO
(SS3). In TERM Syntax, dass Flucht ist\E
. Diesinfocmp
zeigt Ihnen, dass die Beschreibung den Anwendungsmodus verwendet. Diehome
Fähigkeit wird gesendet an das Terminal, es wie sagen Sie den Cursor auf dem bewegen , nach Hause Position (oben links), und ist nicht das gleiche wiekhome
(eingesandt von dem Endgerät über die Tastatur).Vollbildanwendungen (z. B. solche, die ncurses verwenden) senden möglicherweise die Terminalfähigkeitszeichenfolgen zum Initialisieren der Tastatur. Einige Terminalbeschreibungen versetzen das Terminal in den Anwendungsmodus, andere nicht.
Die Verwendung von
kend
versusend
ist eine Namenskonvention: In terminfo per Konvention bezieht sich jeder Name, der mit k beginnt, auf eine spezielle Taste (Funktionstaste, Cursortaste, Tastaturtaste), um zu verdeutlichen, dass es sich um Zeichenfolgen handelt, die von einer Anwendung gelesen werden sollen. Beispiel:kcub1
(Cursor-Rückwärts- Taste ) unterscheidet sich voncub1
(Bewegen Sie den Cursor eine Spalte zurück).ncurses erkennt die Taste als,
KEY_END
weil die von Ihnen verwendete Anwendung diekeypad
Funktion zum Initialisieren des Terminals mitsmkx
dem aufruft (die Mnemonik bedeutet "Tastatur-Sendemodus starten"). Dadurch wird möglicherweise der Anwendungsmodus aktiviert. Die Terminalbeschreibung der Linux-Konsole funktioniert nicht, die von xterm nicht.Im Prinzip können Sie
tput
den Modus umschalten (und unterschiedliche Ergebnisse erhaltenshowkey
):Als Komplikation erkennen Flüche nur einen Namen für eine Zeichenfolge. Einige Terminals (z. B. xterm) emulieren ältere Hardware-Terminals mit unterschiedlichen Namen für die Tasten auf der Bearbeitungstastatur. In den unten aufgeführten xterm-FAQ gibt es die Möglichkeit, die "Home" -Taste "Insert" zu benennen ...
Weiterführende Literatur:
getch
Handbuchseite)quelle
keypad
Funktion. Aber mit der Frage "wie ncurses es schafft, es zu erkennen alsKEY_END
" meinte ich "wiekeypad
dekodiert^[[F
inkend
" (wenn man bedenkt, dasskeypad
die Terminfo- Datenbank zur Interpretation der Schlüsselbänder verwendet wird). Wenn ich es richtig verstanden habe, geschieht dies, weilshowkey -a
es sich im Cursormodus befindet, während sich die Anwendung ncurses im Anwendungsmodus befindet.showkey
schaltet nicht zwischen Normal- / Anwendungsmodus um. Es ist ein Linux-spezifisches Programm, das Annahmen über die Linux-Konsole macht, anstatt die Terminaldatenbank zu verwendenshowkey
nicht zwischen den Modi gewechselt wird, wird ein Standardstatus verwendet, wie auch immer er genannt werden mag. Der Punkt ist, dassshowkey
Drucke^[[F
nicht^[OF
, was zu meiner Verwirrung führt. (Ich habe nurshowkey
den tatsächlichen Keychord visuell dargestellt, der vom Terminal durch Drücken einer Tastaturtaste gesendet wird, ohne zu ahnen, dass einige Feinheitentput smkx
und unterschiedliche Ergebnisse erzielen.less
Dienstprogramm gibt: Es versetzt sich in den Anwendungsmodus, interpretiert dann aber die Eingabetaste für die Tastatur nicht. Soll ich einen Fehlerbericht einreichen? (Sie können dies überprüfen, indemless
Sie nach der Eingabe die Eingabetaste auf der Tastatur starten und drücken./
Sie wird ausgegebenESCOM
, anstatt das zu tun, was die Eingabetaste tun muss.)Das Problem mit der Home-Taste besteht darin, dass physische Terminals und später die Terminalemulatoren, die sie emulieren, zwei Modi haben: Normal- und Anwendungsmodus, und die Escape-Sequenzen unterscheiden sich je nach Modus, in dem sich das Terminal befindet. Terminfo kommt damit nicht gut zurecht. Im normalen Modus (auch bekannt als "Cursor-Modus") befindet sich die Escape-Sequenz der End-Taste
ESC [ F
im AnwendungsmodusESC O F
. Das Googeln für dieses Problem zeigt das ganze Durcheinander.Bearbeiten Aus der terminfo-Quelle:
Dann wird angenommen, dass sich die Cursortasten im "Cursormodus" befinden, und die Cursortastendefinitionen sollten mit dieser Annahme übereinstimmen, da sonst die Anwendung fehlschlagen kann. Es wird auch erwartet, dass Anwendungen die Zeichenfolge immer an das Terminal senden, bevor sie beendet werden. "
quelle