Esistono terminali Linux in grado di gestire tutte le combinazioni di tasti?


11

Mi piace usare emacs in modalità terminale ( -nw), ma sembra che la maggior parte dei terminali (tutti?) Non sia in grado di gestire alcune combinazioni di tasti, ad esempio C-<RET>o C-M-%. Lo so perché la maggior parte dei terminali emula un VT-100, che non aveva queste combinazioni. Esistono terminali Linux (preferibilmente KDE) in grado di gestire queste combinazioni di tasti o è una limitazione fondamentale di tutti i terminali?

Risposte:


15

Quando si preme un tasto o una combinazione di tasti in un terminale, questo viene trasmesso all'applicazione in esecuzione nel terminale come una sequenza di uno o più caratteri. Ad esempio, quando si preme a, l'applicazione riceve a. Quando si preme Enter, l'applicazione riceve il carattere CR(aka ^M(pronunciato "control-emm"), aka personaggio numero 13, aka \ro \015). Le combinazioni di tasti che coinvolgono Altsono generalmente trasmesse come carattere ESC(a.ka. ^[aka \eo \033) seguito dalla sequenza per il tasto o la combinazione di tasti senza Alt. I tasti funzione e altre combinazioni di tasti vengono trasmessi come sequenze di escape che iniziano con \e[o \eO.

Le sequenze di escape non sono completamente standardizzate e i terminali in genere ignorano determinati attributi per determinate chiavi. Ad esempio, Ctrl+ Shift+ letterviene spesso trasmesso esattamente come Ctrl+ letterper impostazione predefinita.

Puoi vedere cosa invia il tuo terminale per una combinazione di tasti premendo Ctrl+ Vseguito da quella combinazione di tasti nel prompt della shell o C-qoppure C-h cseguito dalla combinazione di tasti in Emacs.

Con alcuni emulatori di terminale, è possibile configurare le sequenze di escape per ciascun tasto. Su Xterm, questo viene fatto attraverso risorse X . La maggior parte delle configurazioni legge le risorse ~/.Xresourcesall'avvio di X e puoi caricare il file manualmente con xrdb -merge ~/.Xresources.

Term.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <key>percent: string("\033[37;6~")

Una convenzione comune utilizza sequenze di escape del modulo ESC [ number1 ; number2 ~per i tasti funzione con modificatori. number1indica il tasto funzione ( 15da 24per F5a F12- per ragioni storiche, da F1 a F4hanno sequenze di escape diverse) e number2indica il modificatore ( 2per Shift, 3per Meta, 5per Ctrl, 7per Ctrl+ Metae aggiungere 1 per Shiftcon almeno uno di Ctrlo Meta).

Emacs traduce le sequenze di escape nella sua rappresentazione chiave interna attraverso input-decode-mapolocal-function-key-map (o function-key-mapprima di Emacs 23).

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])

Quindi, se lo capisco correttamente, devo prima definire una sequenza di escape nel mio terminale che corrisponda ad una combinazione di tasti. Quindi, in emacs, devo mappare la sequenza di escape sulla combinazione di tasti. La sequenza di escape può essere arbitraria, purché non sia in conflitto con quelle definite in infocmp $TERM?
Yossarian,

2
@Yossarian Sì. Oltre a non essere in conflitto, le sequenze di escape devono essere inequivocabili, ovvero nessuna sequenza di escape dovrebbe essere un prefisso di un'altra. Ciò significa in pratica che il primo carattere deve essere ESC(a meno che non si desideri provare un carattere ≥128, ma ciò limiterà le possibili codifiche di input) e il secondo carattere deve essere qualcosa per il quale non si desidera alcun ESC foolegame.
Gilles 'SO- smetti di essere malvagio' il

Ho appena provato a provare quello che mi hai suggerito. In local-set-keyrealtà dovrebbe essere define-key? Il primo fornisce un errore (numero errato di argomenti), mentre il secondo funziona, almeno per <kbd> C-Enter </kbd>. Sembra che Konsole abbia ancora problemi con l'invio di <kbd> CM-% </kbd>.
Yossarian,

@Yossarian In effetti, dovrebbe essere define-key. Non so se le chiavi di escape di Konsole possano essere configurate, xterm è probabilmente più personalizzabile di qualsiasi alternativa.
Gilles 'SO- smetti di essere malvagio' il

1
Si noti che il xterm di Thomas Dickey è in fase di sviluppo attivo. Con la XTerm*modifyOtherKeys: 2risorsa genererà sequenze uniche anche per le C-M-combinazioni, ma con quell'impostazione dovrai fornire molti mapping personalizzati ( XTerm*modifyOtherKeys: 1è meno capace ma molto più funzionale pronto all'uso). Per un esempio (anche se uno che non ha funzionato per me) vedere la xterm-extras.ellibreria, i file associati .Xresourcese i .inputrcfile nel download di easymacs .
phils,

1

Per un insieme limitato ma significativo di chiavi, supponendo la console di KDE, si può fare quanto segue per avere combinazioni di tasti funzionanti e complesse in emacs -nw:

Userò la mia implementazione per mettermi S-<RET>al lavoro come esempio:

  1. Apri una nuova console, vai alle impostazioni -> profilo corrente -> tastiera -> modifica
  2. Premi Aggiungi e Return+Shiftinserisci una nuova voce per dargli un'utile sequenza di tasti (ho scelto \E[27;3quale penso sia la sequenza di tasti inviata da X mentre stavo frugando con xev, ma potrebbe essere sbagliato - l'importante è fare certo che ha una fuga adeguata e non è in conflitto con nient'altro).
  3. Gioca con esso nella piccola area di test in basso per assicurarsi che funzioni.
  4. Riavvia konsole.
  5. Avvio emacs -nwe nel buffer di memoria virtuale valutare:

    (read-key-sequence-vector "Type your new key:")

    quindi digitare la nuova combinazione di tasti.

    • Se non hai familiarità con questo, scrivi la riga, lascia il cursore alla fine della riga e premi Cx Ce per fare in modo che emacs esegua quella riga, dovrebbe dirti qualunque cosa tu abbia inserito tra virgolette e aspettare che tu lo faccia Scrivi qualcosa.
  6. Dovrebbe emettere una sequenza di tasti che potresti associare.
    (Mi è tornato [27 91 50 55 59 51]in contrasto con il vecchio noioso [13]prima che mi incasinassi con il keybons konsole.)

  7. Aggiungi alla tua configurazione emacs:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. L'ho provato emacs -nwin una sessione dello schermo usando:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    

0

La risposta breve è che si tratta di una limitazione fondamentale di tutti i terminali.

La risposta leggermente più lunga è che anche se qualcuno creasse un terminale che fa quello che vuoi, Emacs stesso richiederebbe grandi cambiamenti per funzionare con questo ipotetico terminale.


Questo è un aspetto positivo di emacs, che non mi è nemmeno venuto in mente. Immagino che inizierò a usare la gui invece.
Yossarian,

Questo è ciò che faccio.
hruvulum,

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.