In Shift + Up non è riconosciuto da Emacs in un terminale spiego come i terminali traducono la maggior parte dei tasti funzione in sequenze di escape, perché l'interfaccia tra applicazioni e terminali trasmette caratteri (o piuttosto byte), non chiavi. Solo alcune combinazioni di modificatori + caratteri hanno il loro carattere:
- Ctrlpiù una lettera o una delle
@[\]^_
trasformazioni in byte 0–31 (caratteri di controllo ASCII ).
- Spesso Ctrl+ ?si trasforma in byte 127 e Ctrl+ Spaceequivale a Ctrl+ @(byte 0).
- Alcuni tasti funzione equivalgono ai caratteri di controllo: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
- E Backspace= Ctrl+ Ho Ctrl+ a ?seconda della configurazione. Ctrl+ ?è più conveniente per Emacs, poiché Ctrl+ Hè di aiuto.
- Meta+ characterviene inviato come Escseguito dal carattere .
E che dire di altre combinazioni come Ctrl+ ;o Ctrl+ Shift+ letter? Poiché non esiste un carattere corrispondente, il terminale deve riutilizzare un personaggio o inviare una sequenza di escape. Molti terminali ignorano i modificatori quando non c'è un carattere corrispondente, quindi finisci con Ctrl+ ;invio ;
, Ctrl+ Shift+ letterequivalente a Ctrl+ letter, ecc.
I venditori di terminali hanno continuato a fare la cosa semplice per molto tempo. Non esistevano standard per le sequenze di escape, che si autoalimentavano: i fornitori di terminali non lo implementano, le applicazioni non lo supportano, gli utenti non se lo aspettano. Alcuni emulatori di terminale possono essere configurati per inviare sequenze di escape arbitrarie, quindi se è possibile, è possibile configurarlo e dichiarare le sequenze di escape su Emacs (ne parleremo più avanti).
Ultimamente, la situazione sta cambiando, perché ci sono state due proposte per standardizzare le sequenze di escape. Uno è il libtermkey di LeoNerd con la sintassi . Un altro è il xterm di Thomas Dickey con la sintassi . Le versioni correnti di xterm (≥216) possono essere configurate per entrambe le sintassi impostando la risorsa; la funzione deve essere attivata impostando un valore diverso da zero.ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Se il tuo emulatore di terminale non supporta queste sintassi ma può essere configurato, scegli uno dei due.
Da Emacs 24.4, Emacs attiva automaticamente la modifyOtherKeys
funzione quando rileva che il terminale è versione xterm ≥216. Il rilevamento da parte di Emacs delle sequenze di escape per codificare le chiavi funziona attraverso la variabile local-function-key-map
. A partire da Emacs 24.4, non tutte le sequenze di escape sono supportate. È possibile utilizzare il seguente codice nel file init per completare il lavoro.
;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
"Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
(if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
(and (<= ?a c) (<= c ?z)))
(logand c ?\x1f)
(logior (lsh 1 26) c))))
(if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
(if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
(vector c))
(defun my-eval-after-load-xterm ()
(when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
(let ((c 32))
(while (<= c 126)
(mapc (lambda (x)
(define-key xterm-function-map (format (car x) c)
(apply 'character-apply-modifiers c (cdr x))))
'(;; with ?.VT100.formatOtherKeys: 0
("\e\[27;3;%d~" meta)
("\e\[27;5;%d~" control)
("\e\[27;6;%d~" control shift)
("\e\[27;7;%d~" control meta)
("\e\[27;8;%d~" control meta shift)
;; with ?.VT100.formatOtherKeys: 1
("\e\[%d;3u" meta)
("\e\[%d;5u" control)
("\e\[%d;6u" control shift)
("\e\[%d;7u" control meta)
("\e\[%d;8u" control meta shift)))
(setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))
Se la TERM
variabile di ambiente non è impostata su xterm
o una variante come xterm-256color
, Emacs non attiverà tali sequenze. Se Emacs ha già il supporto per il tuo valore di TERM
, puoi aggiungere supporto definendo una funzione simile a quella sopra, da eseguire dopo aver caricato il file Lisp il cui nome è il valore diTERM
. Se Emacs non ha tale supporto, puoi aggiungerlo creando una sottodirectory chiamata term
da qualche parte nel tuo load-path
, e creando un file Lisp chiamato term/$TERM.el
dove $TERM
è il valore di TERM
, definendo una funzione chiamata terminal-init-$TERM
.
Mentre scrivo, sembra che pochi emulatori terminali diversi da xterm abbiano adottato queste sequenze di escape. Su OSX, puoi configurare iTerm2 selezionando una sequenza di escape per ogni combinazione di tasti, uno per uno.
C-;
combo e poi usaM-x view-lossage
per vedere se arriva anche a Emacs.