A interface entre um aplicativo de terminal e um emulador de terminal (ou terminal de hardware) transmite bytes, não chaves. As teclas de função, como as teclas de movimento do cursor, são traduzidas em seqüências de escape (começando com o caractere de escape ESC a.k.a. \e
a.k.a. 3
a.k.a. 0x1b a.k.a. ^ [). O mesmo vale para combinações de uma tecla de função ou de uma chave de caractere com modificadores, embora nem todos os terminais enviem seqüências diferentes para todas as combinações de modificadores diferentes. Algumas chaves são enviadas codificadas como caracteres de controle (por exemplo, Tab → Ctrl-I = \t
= 1
).
Como você pode ver, existem muitas maneiras de descrever os caracteres de controle. Alguns têm um nome, correspondente à sua função tradicional (por exemplo, Tab, Line feed); esses tendem a ter uma combinação barra invertida + letra que você pode usar dentro de $'…'
ou em um argumento para echo
ou print
(assim como em expressões regulares sed e em literais de string em awk, C e outras linguagens (note que ferramentas diferentes podem ter um conjunto ligeiramente diferente de seqüências de escape)) . Você pode usar barra invertida + octal (por exemplo, 3
) nesses contextos também.
Existe alguma variação quanto aos terminais de seqüência de escape enviados para cada chave. Felizmente, quase não há sobreposição: há muito poucas sequências de caracteres que significam diferentes teclas em terminais diferentes. O principal problema é o caractere 127 = 7
= 0x7f que é mais frequentemente Backspace atualmente, mas às vezes Delete .
^[OF
e ^[[F
(ou seja, \eOF
e \e[F
) são as duas seqüências de escape comuns enviadas por End . ^E
(ou seja,
) é a ligação de chaves do Emacs ( Ctrl + E ) para end-of-line
5terminfo
.
Para ver o que seu emulador de terminal envia para uma determinada tecla ou combinação de teclas, pressione Ctrl + V e depois a tecla em questão. Isso insere o primeiro caractere da seqüência de escape literalmente. As seqüências de escape normalmente consistem em um caractere de escape seguido de caracteres imprimíveis, então o restante da seqüência de escape é inserido literalmente também.
O banco de dados Terminfo contém as seqüências de escape para algumas chaves. Você encontrará a lista de recursos Terminfo na página do manual terminfo (5) em seu sistema. Em zsh, você pode listar os valores no banco de dados por meio do %code% matriz associativa. Cuidado ao imprimir valores que contenham seqüências de escape que também são interpretadas pelo terminal quando exibidas, para imprimi-las de forma citada.
% print -lr ${(q)terminfo[kend]}
$'3'OF
Veja Como entrada e texto do teclado trabalho de saída? para uma visão geral mais completa do que acontece quando você pressiona uma tecla. Não é necessário entender as combinações de teclas no zsh.