En Shift + Up no es reconocido por Emacs en un terminal , explico cómo los terminales traducen la mayoría de las teclas de función en secuencias de escape, porque la interfaz entre aplicaciones y terminales transmite caracteres (o más bien bytes), no teclas. Solo unas pocas combinaciones de modificador + personaje tienen su propio personaje:
- Ctrlmás una letra o una de las
@[\]^_
vueltas en bytes 0–31 (caracteres de control ASCII ).
- A menudo, Ctrl+ se ?convierte en el byte 127 y Ctrl+ Spacees equivalente a Ctrl+ @(byte 0).
- Algunas teclas de función son equivalentes a los caracteres de control: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
- Y Backspace= Ctrl+ Ho Ctrl+ ?dependiendo de la configuración. Ctrl+ ?es más conveniente para Emacs, ya que Ctrl+ Hes ayuda.
- Meta+ characterse envía como Escseguido por el carácter .
Entonces, ¿qué pasa con otras combinaciones como Ctrl+ ;o Ctrl+ Shift+ letter? Como no hay un carácter correspondiente, el terminal debe reutilizar un carácter o enviar una secuencia de escape. Muchos terminales ignoran los modificadores cuando no hay un carácter correspondiente, por lo que terminas con Ctrl+ ;envío ;
, Ctrl+ Shift+ letterequivalente a Ctrl+ letter, etc.
Los vendedores de terminales siguieron haciendo lo simple durante mucho tiempo. No había un estándar para las secuencias de escape, que se perpetuaba a sí mismo: los vendedores de terminales no lo implementan, las aplicaciones no lo admiten, los usuarios no lo esperan. Algunos emuladores de terminal pueden configurarse para enviar secuencias de escape arbitrarias, por lo que si el suyo puede, puede configurarlo y declarar las secuencias de escape a Emacs (más sobre esto más adelante).
Últimamente, la situación está cambiando, porque ha habido dos propuestas para estandarizar las secuencias de escape. Una es la libtermkey de LeoNerd con la sintaxis . Otro es el xterm de Thomas Dickey con la sintaxis . Las versiones actuales de xterm (≥216) se pueden configurar para cualquier sintaxis configurando el recurso; la función debe activarse configurando un valor distinto de cero.ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Si su emulador de terminal no admite estas sintaxis, pero puede configurarse, elija cualquiera.
Desde Emacs 24.4, Emacs activa automáticamente la modifyOtherKeys
función cuando detecta que el terminal es xterm versión ≥216. La detección de secuencias de escape de Emacs para codificar claves funciona a través de la variable local-function-key-map
. A partir de Emacs 24.4, no todas las secuencias de escape son compatibles. Puede usar el siguiente código en su archivo init para completar el trabajo.
;; 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 de entorno no está establecida en xterm
una variante como xterm-256color
, Emacs no activará esas secuencias. Si Emacs ya tiene soporte para su valor de TERM
, puede agregar soporte definiendo una función similar a la anterior, que se ejecutará después de cargar el archivo Lisp cuyo nombre es el valor deTERM
. Si Emacs no tiene dicho soporte, puede agregarlo creando un subdirectorio llamado term
en algún lugar de su load-path
, y creando un archivo Lisp llamado term/$TERM.el
donde $TERM
está el valor de TERM
, definiendo una función llamada terminal-init-$TERM
.
Mientras escribo, parece que pocos emuladores de terminal distintos de xterm han adoptado estas secuencias de escape. En OSX, puede configurar iTerm2 seleccionando una secuencia de escape para cada combinación de teclas, una por una.
C-;
combo y luego useM-x view-lossage
para ver si llega incluso a Emacs.