Warum hat die END-Taste keinen Terminfo-Eintrag?

8

Auf einem Debian-System ENDerzeugt 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 kendund endstatt nur end? (das gleiche für khomeund home)

BEARBEITEN

Wie im Kommentar von Johan Myréen gesagt, ist khomeString 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,
Igor Liferenko
quelle
1
Der Unterschied zwischen homeund khomebesteht darin, dass die khomeZeichenfolge die Sequenz ist, die durch Drücken der Home-Taste erzeugt wird, während die homeZeichenfolge die Sequenz ist, die an das Terminal gesendet werden sollte, um den Cursor an die Home-Position zu bewegen. Meines Wissens definiert terminfo keine endFähigkeit, nur kend.
Johan Myréen
@ JohanMyréen Könnten Sie bitte anhand eines Beispiels erklären, was die "Ausgangsposition" eines Cursors ist? Und warum kendist wie \EOFin terminfo definiert , während das Terminal generiert \E[F? Ist das ein Fehler in Debians Terminfo ? Und wie schafft es ncurses , es KEY_ENDtrotzdem zu erkennen ?
Igor Liferenko
Die Ausgangsposition ist die obere linke Ecke des Bildschirms.
Johan Myréen

Antworten:

10

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. Dies infocmpzeigt Ihnen, dass die Beschreibung den Anwendungsmodus verwendet. Die homeFä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 wie khome(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 kendversus endist 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 von cub1(Bewegen Sie den Cursor eine Spalte zurück).

ncurses erkennt die Taste als, KEY_ENDweil die von Ihnen verwendete Anwendung die keypadFunktion zum Initialisieren des Terminals mit smkxdem 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 tputden Modus umschalten (und unterschiedliche Ergebnisse erhalten showkey):

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[H     27 0033 0x1b
         91 0133 0x5b
         72 0110 0x48
^C        3 0003 0x03
^D        4 0004 0x04
$ tput smkx
$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[OH     27 0033 0x1b
         79 0117 0x4f
         72 0110 0x48

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:

Thomas Dickey
quelle
Ja, ich benutze die keypadFunktion. Aber mit der Frage "wie ncurses es schafft, es zu erkennen als KEY_END" meinte ich "wie keypaddekodiert ^[[Fin kend" (wenn man bedenkt, dass keypaddie Terminfo- Datenbank zur Interpretation der Schlüsselbänder verwendet wird). Wenn ich es richtig verstanden habe, geschieht dies, weil showkey -aes sich im Cursormodus befindet, während sich die Anwendung ncurses im Anwendungsmodus befindet.
Igor Liferenko
showkeyschaltet nicht zwischen Normal- / Anwendungsmodus um. Es ist ein Linux-spezifisches Programm, das Annahmen über die Linux-Konsole macht, anstatt die Terminaldatenbank zu verwenden
Thomas Dickey
Wenn showkeynicht zwischen den Modi gewechselt wird, wird ein Standardstatus verwendet, wie auch immer er genannt werden mag. Der Punkt ist, dass showkeyDrucke ^[[Fnicht ^[OF, was zu meiner Verwirrung führt. (Ich habe nur showkeyden tatsächlichen Keychord visuell dargestellt, der vom Terminal durch Drücken einer Tastaturtaste gesendet wird, ohne zu ahnen, dass einige Feinheiten
vorliegen
Ja, das ist der "normale" Modus (die übliche Art, sich darauf zu beziehen). Sie können Ihr Terminal natürlich mit initialisieren tput smkxund unterschiedliche Ergebnisse erzielen.
Thomas Dickey
Ich denke, dass es einen Fehler im lessDienstprogramm 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, indem lessSie nach der Eingabe die Eingabetaste auf der Tastatur starten und drücken. /Sie wird ausgegeben ESCOM, anstatt das zu tun, was die Eingabetaste tun muss.)
Igor Liferenko
5

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 [ Fim Anwendungsmodus ESC 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. "

Johan Myréen
quelle
Wie wird in den "Anwendungsmodus" gewechselt? Wird es von Flüchen gemacht ?
Igor Liferenko