No Shift + Up não é reconhecido pelo Emacs em um terminal , explico como os terminais convertem a maioria das teclas de função em seqüências de escape, porque a interface entre aplicativos e terminais transmite caracteres (ou melhor, bytes), não chaves. Apenas algumas combinações de modificador + caractere têm seu próprio caractere:
- Ctrlalém de uma letra ou uma das
@[\]^_
transformações em bytes de 0 a 31 (caracteres de controle ASCII ).
- Freqüentemente Ctrl+ se ?transforma em byte 127 e Ctrl+ Spaceé equivalente a Ctrl+ @(byte 0).
- Algumas teclas de função são equivalentes aos caracteres de controle: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [.
- E Backspace= Ctrl+ Hou Ctrl+, ?dependendo da configuração. Ctrl+ ?é mais conveniente para o Emacs, pois Ctrl+ Hé ajuda.
- Meta+ characteré enviado conforme Escseguido pelo caractere .
Então, e outras combinações como Ctrl+ ;ou Ctrl+ Shift+ letter? Como não há caractere correspondente, o terminal precisa reutilizar um caractere ou enviar uma sequência de escape. Muitos terminais ignoram modificadores quando não há caracteres correspondentes, então você acaba com Ctrl+ ;envio ;
, Ctrl+ Shift+ letterequivalente a Ctrl+ letter, etc.
Os fornecedores de terminais continuaram fazendo a coisa simples por um longo tempo. Não havia um padrão para seqüências de escape, que se perpetuavam - os fornecedores de terminais não o implementam, os aplicativos não o suportam, os usuários não esperam. Alguns emuladores de terminal podem ser configurados para enviar seqüências de escape arbitrárias; portanto, se o seu puder, você pode configurá-lo e declarar as seqüências de escape para o Emacs (mais sobre isso mais adiante).
Ultimamente, a situação está mudando, porque houve duas propostas para padronizar as seqüências de escape. Um deles é a libtermkey do LeoNerd, com a sintaxe . Outro é o xterm de Thomas Dickey com a sintaxe . As versões atuais do xterm (≥216) podem ser configuradas para qualquer uma das sintaxes, definindo o recurso; o recurso deve ser ativado definindo-o como um valor diferente de zero.ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Se o seu emulador de terminal não suportar essas sintaxes, mas puder ser configurado, escolha um dos dois.
Desde o Emacs 24.4, o Emacs ativa automaticamente o modifyOtherKeys
recurso quando detecta que o terminal é da versão xterm ≥216. Detecção de Emacs de seqüências de escape para as chaves codificar funciona através da variável local-function-key-map
. No Emacs 24.4, nem todas as seqüências de escape são suportadas. Você pode usar o seguinte código no seu arquivo init para concluir o trabalho.
;; 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 a TERM
variável de ambiente não estiver definida como xterm
ou uma variante como xterm-256color
, o Emacs não ativará essas seqüências. Se o Emacs já tiver suporte para o seu valor de TERM
, você poderá adicionar suporte definindo uma função semelhante à acima, a ser executada após carregar o arquivo Lisp cujo nome é o valor deTERM
. Se o Emacs não tiver esse suporte, você poderá adicioná-lo criando um subdiretório chamado term
em algum lugar no seu load-path
e criando um arquivo Lisp chamado term/$TERM.el
where $TERM
é o valor de TERM
, definindo uma função chamada terminal-init-$TERM
.
Enquanto escrevo, parece que poucos emuladores de terminal, exceto o xterm, adotaram essas seqüências de escape. No OSX, você pode configurar o iTerm2 selecionando uma sequência de escape para cada combinação de teclas, uma por uma.
C-;
combo e useM-x view-lossage
para ver se ele está chegando ao Emacs.