Perché la chiave END non ha una voce terminfo?


8

Su un sistema Debian premendo il ENDtasto si genera ^[[F:

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[F     27 0033 0x1b
         91 0133 0x5b
         70 0106 0x46

Ma perché questo keychord non è in terminfo ?

$ infocmp -1 | grep end
kend=\EOF,

Tuttavia, ncurses riesce a riconoscerlo correttamente come KEY_END. Come?

TERM è xterm-256color

A proposito, qual è la motivazione dietro kende endinvece di solo end? (lo stesso per khomee home)

MODIFICARE

Come detto nel commento di Johan Myréen, la khomestringa è la sequenza che produce il tasto Home. Ma su Debian premendo il tasto Home si produce home. Perché?

$ 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,

1
La differenza tra homee khomeè che la khomestringa è la sequenza che preme il tasto Home produce, mentre la homestringa è la sequenza che dovrebbe essere inviata al terminale per spostare il cursore sulla posizione iniziale. Per quanto ne so, terminfo non definisce una endcapacità, solo kend.
Johan Myréen,

@ JohanMyréen Potresti spiegare cosa è la "posizione iniziale" di un cursore con un esempio? E perché kendè definito come \EOFin terminfo , mentre il terminale genera \E[F? È un bug nel terminfo di Debian ? E come ncurses riesce comunque a rilevarlo KEY_END?
Igor Liferenko,

La posizione iniziale è l'angolo in alto a sinistra dello schermo.
Johan Myréen,

Risposte:


10

La risposta di Johan Myréen era vicina, ma non esattamente il problema: la maggior parte degli emulatori di terminale che userete hanno modalità normali e di applicazione per tasti speciali. Le descrizioni dei terminali sono scritte per una modalità, che corrisponde a ciò che utilizza un'applicazione a schermo intero. Altre applicazioni (come una shell interattiva ) in genere non inizializzano lo schermo per utilizzare la modalità applicazione . Bash ne è un esempio.

In modalità normale , xterm e terminali simili inviano escape[(CSI) mentre in modalità applicazione , inviano le loro tastiere escapeO(SS3). Nella sintassi terminfo, tale escape è \E. Quindi ti infocmpsta mostrando che la descrizione usa la modalità applicazione. La homecapacità è inviato al terminale, dicendogli come spostare il cursore nella casa posizione (in alto a sinistra), e non è la stessa khome(inviato dal terminale utilizzando la tastiera).

Le applicazioni a schermo intero (come quelle che utilizzano ncurses) possono inviare le stringhe di capacità del terminale per l'inizializzazione della tastiera. Alcune descrizioni dei terminali mettono il terminale in modalità applicazione, altri no.

L'uso di kendversus endè una convenzione di denominazione: in terminfo per convenzione qualsiasi nome che inizia con k si riferisce a un tasto speciale (tasto funzione, tasto cursore, tasto tastiera) per chiarire che si tratta di stringhe che devono essere lette da un'applicazione. Ad esempio, kcub1( tasto cursore indietro ) è diverso da cub1(sposta il cursore indietro di una colonna).

ncurses riconosce il tasto come KEY_ENDperché l'applicazione che stai utilizzando chiamerà la keypadfunzione per inizializzare il terminale usando il smkx(il mnemonico significa "avvia la modalità di trasmissione da tastiera"). Ciò può / non può effettivamente attivare la modalità applicazione. La descrizione del terminale della console Linux no, xterm fa.

In linea di principio, è possibile utilizzare tputper cambiare la modalità (e ottenere risultati diversi da 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

Come complicazione, le maledizioni riconosceranno un solo nome per una stringa. Alcuni terminali (come xterm) emulano terminali hardware più vecchi utilizzando nomi diversi per i tasti sulla tastiera di modifica. Nelle FAQ xterm elencate di seguito, c'è la possibilità di nominare quel tasto "Home" "Inserisci" ...

Ulteriori letture:


Sì, sto usando la keypadfunzione. Ma con la domanda "come ncurses riesce a rilevare come KEY_END" Volevo dire "come keypaddecodifica ^[[Fin kend" (considerando che keypadusi terminfo database per interpretare i keychords). Se ho capito bene, questo accade perché showkey -aè in modalità cursore, mentre l'applicazione ncurses è in modalità applicazione.
Igor Liferenko,

showkeynon passa tra le modalità normale / applicazione. È un programma specifico per Linux, che fa ipotesi sulla console Linux, piuttosto che usare il database dei terminali
Thomas Dickey,

Se showkeynon passa da una modalità all'altra, utilizza uno stato predefinito, qualunque cosa si possa chiamare. Il punto è che le showkeystampe ^[[F, no ^[OF, portano alla mia confusione. (Ho appena usato showkeyper rappresentare visivamente il keychord reale che viene inviato dal terminale premendo un pulsante della tastiera, senza sospettare che potrebbero esserci delle sottigliezze.)
Igor Liferenko

Sì, questa è la modalità "normale" (il solito modo di fare riferimento a questo). Naturalmente è possibile inizializzare il terminale utilizzando tput smkxe ottenere risultati diversi.
Thomas Dickey,

Penso che ci sia un bug lessnell'utilità: si mette in modalità applicazione, ma non riesce a interpretare il tasto Invio della tastiera. Devo inviare una segnalazione di bug? (Puoi verificarlo avviando lesse premendo il tasto Invio dopo aver digitato /- verrà emesso ESCOM, invece di fare ciò che il tasto Invio deve fare.)
Igor Liferenko

5

Il problema con il tasto Home è che i terminali fisici e successivamente gli emulatori di terminale che li emulano hanno due modalità: normale e Modalità applicazione e le sequenze di escape sono diverse a seconda della modalità in cui si trova il terminale. Terminfo non riesce a farcela bene. In modalità normale (aka "Modalità cursore") la sequenza di escape del tasto Fine è ESC [ F, in modalità Applicazione ESC O F. Googling per questo problema rivela l'intero casino.

Modifica dalla fonte terminfo:

si presume che i tasti cursore siano in "Modalità cursore" e le definizioni dei tasti cursore dovrebbero corrispondere a tale presupposto, altrimenti l'applicazione potrebbe non riuscire. Si prevede inoltre che le applicazioni trasmettano sempre la stringa al terminale prima di uscire. "


Qual è la procedura per passare alla "modalità applicazione"? È fatto da ncurses ?
Igor Liferenko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.