Quando você pressiona uma tecla ou combinação de teclas em um terminal, ele é transmitido ao aplicativo em execução no terminal como uma sequência de um ou mais caracteres. Por exemplo, quando você pressiona a, o aplicativo recebe a
. Quando você pressiona Enter, o aplicativo recebe o caractere CR
(aka ^M
(pronunciado “control-emm”), também conhecido como número 13, aka \r
ou \015
). As combinações de teclas envolvidas Altsão normalmente transmitidas como o caractere ESC
(também ^[
conhecido como \e
ou \033
) seguido pela sequência da combinação de teclas ou teclas sem Alt. As teclas de função e outras combinações de teclas são transmitidas como seqüências de escape começando com \e[
ou \eO
.
As seqüências de escape não são totalmente padronizadas e os terminais geralmente ignoram certos atributos para determinadas chaves. Por exemplo, Ctrl+ Shift+ letteré frequentemente transmitido exatamente como Ctrl+letter por padrão.
Você pode ver o que o seu terminal envia para uma combinação de teclas pressionando Ctrl+ Vseguido dessa combinação de teclas em um prompt de shell ou C-q
ouC-h c
seguido pela combinação de teclas no Emacs.
Com alguns emuladores de terminal, você pode configurar as seqüências de escape para cada tecla. Em Xterm, isso é feito através de recursos X . A maioria das configurações lê recursos desde o ~/.Xresources
início do X, e você pode carregar o arquivo manualmente com 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~")
Uma convenção comum usa seqüências de escape do formulário ESC [ number1 ; number2 ~
para teclas de função com modificadores. number1
indica a tecla de função ( 15
para 24
para F5a F12- por razões históricas, F1 a F4ter sequências de escape diferentes) e number2
indica o modificador ( 2
para Shift, 5
para Ctrl, 3
para Meta, 8
para Ctrl+ Meta, e adicione 1 para +Shift - não, não é muito consistente).
O Emacs converte seqüências de escape em sua representação de chave interna através input-decode-map
oulocal-function-key-map
(ou function-key-map
antes do 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
?