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 \r
o \015
). Le combinazioni di tasti che coinvolgono Altsono generalmente trasmesse come carattere ESC
(a.ka. ^[
aka \e
o \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-q
oppure C-h c
seguito 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 ~/.Xresources
all'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. number1
indica il tasto funzione ( 15
da 24
per F5a F12- per ragioni storiche, da F1 a F4hanno sequenze di escape diverse) e number2
indica il modificatore ( 2
per Shift, 3
per Meta, 5
per Ctrl, 7
per 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-map
olocal-function-key-map
(o function-key-map
prima 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)])
infocmp $TERM
?