Dans Shift + Up n'est pas reconnu par Emacs dans un terminal, j'explique comment les terminaux traduisent la plupart des touches de fonction en séquences d'échappement, car l'interface entre les applications et les terminaux transmet des caractères (ou plutôt des octets), pas des clés. Seules quelques combinaisons modificateur + personnage ont leur propre caractère:
- Ctrlplus une lettre ou l'un des
@[\]^_
tours en octets 0–31 (caractères de contrôle ASCII ).
- Souvent, Ctrl+ se ?transforme en octet 127 et Ctrl+ Spaceéquivaut à Ctrl+ @(octet 0).
- Certaines touches de fonction sont équivalentes aux caractères de contrôle: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
- Et Backspace= Ctrl+ Hou Ctrl+ ?selon la configuration. Ctrl+ ?est plus pratique pour Emacs, car Ctrl+ Hest une aide.
- Meta+ characterest envoyé Escsuivi du caractère .
Qu'en est-il des autres combinaisons telles que Ctrl+ ;ou Ctrl+ Shift+ letter? Puisqu'il n'y a pas de caractère correspondant, le terminal doit soit réutiliser un caractère, soit envoyer une séquence d'échappement. De nombreux terminaux ignorent les modificateurs lorsqu'il n'y a pas de caractère correspondant, vous vous retrouvez donc avec Ctrl+ ;envoi ;
, Ctrl+ Shift+ letteréquivalent à Ctrl+ letter, etc.
Les vendeurs de terminaux ont continué à faire la chose simple pendant longtemps. Il n'y avait pas de norme pour les séquences d'échappement, qui se perpétuait - les fournisseurs de terminaux ne l'implémentent pas, les applications ne la prennent pas en charge, les utilisateurs ne s'y attendent pas. Certains émulateurs de terminaux peuvent être configurés pour envoyer des séquences d'échappement arbitraires, donc si le vôtre le peut, vous pouvez le configurer et déclarer les séquences d'échappement à Emacs (plus de détails plus loin).
Dernièrement, la situation évolue, car il y a eu deux propositions de standardisation des séquences d'échappement. L'un est libtermkey de LeoNerd avec la syntaxe . Un autre est le xterm de Thomas Dickey avec la syntaxe . Les versions actuelles de xterm (≥216) peuvent être configurées pour l'une ou l'autre syntaxe en définissant la ressource; la fonction doit être activée en définissant le sur une valeur différente de zéro.ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Si votre émulateur de terminal ne prend pas en charge ces syntaxes mais peut être configuré, choisissez l'un ou l'autre.
Depuis Emacs 24.4, Emacs active automatiquement la modifyOtherKeys
fonction lorsqu'il détecte que le terminal est la version xterm ≥216. La détection des séquences d'échappement par Emacs pour encoder les clés fonctionne via la variable local-function-key-map
. Depuis Emacs 24.4, toutes les séquences d'échappement ne sont pas prises en charge. Vous pouvez utiliser le code suivant dans votre fichier init pour terminer le travail.
;; 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))
Si la TERM
variable d'environnement n'est pas définie sur xterm
ou une variante telle que xterm-256color
, Emacs n'activera pas ces séquences. Si Emacs prend déjà en charge votre valeur de TERM
, vous pouvez ajouter un support en définissant une fonction similaire à celle ci-dessus, à exécuter après le chargement du fichier Lisp dont le nom est la valeur deTERM
. Si Emacs ne dispose pas d'un tel support, vous pouvez l'ajouter en créant un sous-répertoire appelé term
quelque part dans votre load-path
, et en créant un fichier Lisp appelé term/$TERM.el
où $TERM
est la valeur de TERM
, en définissant une fonction appelée terminal-init-$TERM
.
Au moment où j'écris, il semble que peu d'émulateurs de terminaux autres que xterm aient adopté ces séquences d'échappement. Sous OSX, vous pouvez configurer iTerm2 en sélectionnant une séquence d'échappement pour chaque combinaison de touches, une par une.
C-;
combo, puis utilisezM-x view-lossage
pour voir s'il arrive même à Emacs.