tabela de atalhos de teclado?

15

Temos uma tabela de associações de teclas que traduz todas as várias formas de se referir a um pressionamento de tecla? Estou usando zsh , mas presumo que, se houvesse essa tabela, funcionaria para qualquer shell.

A razão pela qual eu pergunto é que gostaria de atribuir alguns atalhos de teclado e não tenho como saber como me referir a eles (a menos que eu roube um que já esteja definido).

Por exemplo, em 'zbindkey' temos esse tipo de coisa:

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line

... e eu posso imaginar que "kend" significa que isso se refere à chave End .

Verificação cruzada com bindkey vejo estas linhas:

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line

... então eu confio que uma dessas linhas se refere à chave End . Qual deles?

Também temos isso no arquivo "bindkey":

bindkey "\e[A" history-beginning-search-backward

Agora, eu sei que essa é a tecla Seta para cima , mas como eu poderia descobrir se não sabia?

$ bindkey (at CLI)

... nos fornece um idioma diferente para a mesma chave:

"^[[A" history-beginning-search-backward

... mas pelo menos agora eu sei que ^[[A na linguagem bindkey-at-CLI é a mesma coisa que \e[A na linguagem bindkey-in-zbindkey. Isso é fácil. Nos velhos tempos no DOS, a Seta para Cima era 0;72 - você poderia encontrar o código de varredura de todas as teclas legais e havia apenas um idioma.

Existe uma mesa? Ou alguma outra maneira de escolher um pressionamento de tecla e saber como consultá-lo em terminfo[] ... em "bindkey-in-zbindkey" ... em "bindkey-at-CLI" e / ou em qualquer outra línguas pode acontecer de ser?

Novamente, no DOS, havia o programa scancode - digite um pressionamento de tecla e você terá o scancode. Foi pecaminosa e fácil.

A partir das respostas, acho que não há como imprimir uma tabela de todas as ligações possíveis? De qualquer forma, 'bindkey' faz quase o que eu quero:

pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
bindkey "^D" delete-char-or-list
bindkey "^E" end-of-line
...

pelo menos eu posso ver todas as ligações existentes, mesmo que não todas as ligações possíveis . Agora, se houvesse apenas uma maneira de traduzir os glifos-chave em termos "regulares":

bindkey "Home" beginning-of-line

... então eu ficaria feliz.

    
por Ray Andrews 23.02.2014 / 17:02

4 respostas

14

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, end-of-line5 ) é a ligação de chaves do Emacs ( Ctrl + E ) para terminfo .

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.

    
por 24.02.2014 / 01:39
10
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(comentários, melhorias, denúncias amargas bem-vindas: rayandrews em eastlink dot ca)

Combinações de teclas 'disponíveis' em um teclado de computador '101' conectado a um PC rodando 'zsh' sob xfce4 no Debian Linux (não sei quem está 'no comando'). Todas as combinações que produzem códigos duplicados dentro das chaves 'cinza' foram removidas, exceto pelo avatar mais simples que é mostrado. Note que algumas teclas cinzentas / combinações têm duplicatas '^ letter', como 'Enter' == '^ M', estas não foram removidas. Outras combinações ativas não estavam “disponíveis” desde que usadas pelo sistema, mesmo do console, por exemplo. As teclas 'Alt + Function' trocam de terminal. Talvez a chave 'Meta' faça mais, mas isso é com 101 KB. Interessante que existem muito mais combinações disponíveis no DOS, como Ctrl + Function - todas disponíveis no DOS, nenhuma delas disponível no Linux, então parece. Nenhuma das combinações de teclas de tripple (por exemplo, 'Ctrl + Alt + Up') produziu códigos únicos dentro das teclas cinzas, mas eles produzem códigos nas teclas brancas. Anomalias interessantes: '^ [[22' '^ [[27' '^ [[30' estão 'faltando', você se pergunta por que esses números foram pulados. (O que significa dizer que você pode esperar que 'F11' seja '^ [[22' not '^ [[23'.)

Os códigos-chave mostrados são os que seriam enviados por 'showkeys -a' ou 'bindkey' na CLI. No entanto, por algum motivo, se você usar 'bindkey' dentro de um script (como em '.zshrc') '^ [' deve ser substituído por '\ e', portanto, na CLI:

bindkey -s '^ [[[A' meu comando \ C-m '

... ligue 'F1' ao 'meu-comando' e execute-o (o '\ C-m' simula a tecla 'Enter').

em '.zshrc':

bindkey -s '\ e [25' 'meu-comando1; meu comando2 \ C-m '

... liga 'Shift-F1' para 'meu-comando1' seguido por 'meu-comando2' e executa ambos.


COMBINATIONS USING JUST THE 'GREY' KEYS:

key[F1] = '^[[[A' key[F2] = '^[[[B' key[F3] = '^[[[C' key[F4] = '^[[[D' key[F5] = '^[[[E' key[F6] = '^[[17~' key[F7] = '^[[18~' key[F8] = '^[[19~' key[F9] = '^[[20~' key[F10] = '^[[21~' key[F11] = '^[[23~' key[F12] = '^[[24~'

key[Shift-F1] = '^[[25~' key[Shift-F2] = '^[[26~' key[Shift-F3] = '^[[28~' key[Shift-F4] = '^[[29~' key[Shift-F5] = '^[[31~' key[Shift-F6] = '^[[32~' key[Shift-F7] = '^[[33~' key[Shift-F8] = '^[[34~'

key[Insert] = '^[[2~' key[Delete] = '^[[3~' key[Home] = '^[[1~' key[End] = '^[[4~' key[PageUp] = '^[[5~' key[PageDown] = '^[[6~' key[Up] = '^[[A' key[Down] = '^[[B' key[Right] = '^[[C' key[Left] = '^[[D'

key[Bksp] = '^?' key[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' console only.

key[Esc] = '^[' key[Esc-Alt] = '^[^['

key[Enter] = '^M' key[Enter-Alt] = '^[^M'

key[Tab] = '^I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anomalies: 'Ctrl+'' == 'Ctrl+2', and 'Ctrl+1' == '1' in xterm. Several 'Ctrl+number' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

A = 'a' (duhhh) A-Shift = 'A' (who would have guessed?) A-Alt = '^[a'
A-Ctrl = '^A' A-Alt-Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A' (Shift has no effect)

Don't forget that:

/-Shift-Ctrl = Bksp = '^?' [-Ctrl = Esc = '^[' M-Ctrl = Enter = '^M'

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Why is it 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

How/where is 'Alt-Ctrl-Delete' defined?

enter code here
    
por 27.02.2014 / 03:24
5

Existem muitas ferramentas à sua disposição no Unix / Linux, por isso pode ser um pouco confuso e avassalador. Para começar, eu usaria showkey :

$ showkey -a

Press any keys - Ctrl-D will terminate this program

a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
d   100 0144 0x64
e   101 0145 0x65
f   102 0146 0x66
g   103 0147 0x67

Na página man referente a -a :

   When  in  'ascii' dump mode, showkey prints to the standard output the 
   decimal, octal, and hexadecimal value(s) of the key pressed,
   according to he present keymap.

Você pode usar xmodmap para obter alguns dos mapeamentos:

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

O acima não é todas as peças para o quebra-cabeça, mas são algumas informações adicionais que podem ser úteis para você encontrar o mapa final entre as combinações de teclas e os scancodes. Há mais informações neste Q & A Q & A intitulado: Mapeamentos de chaves no Linux .

Referências

por 23.02.2014 / 19:51
1

if there was just some way of translating the key glyphs into 'regular' terms:

bindkey "Home" beginning-of-line

... then I'd be happy.

Existe um utilitário infocmp para descrever as entradas terminfo . Isso é especialmente útil com a opção -L , conhecida como nomes de variáveis C longas :

$ infocmp -cL
...
key_home= '\EOH'.
key_up= '\EOA'.
key_down= '\EOB'.
key_right= '\EOC'.
key_left= '\EOD'.
key_backspace= '^H'.
key_end= '\EOF'.
...

Comparando isso com a bindkey output

"^[OH" beginning-of-line
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[OC" forward-char
"^[OD" backward-char
"^H" backward-delete-char
"^[OE" end-of-line

pode-se ver que eles usam diferentes notações para escape , mas basicamente é relativamente fácil escrever um script que conecte a segunda coluna de infocmp com a primeira de bindkey .

Caso haja alguma dúvida sobre o significado de uma determinada string (conforme impresso em infocmp output), pode-se sempre olhar para terminfo manual onde a descrição completa é fornecida, por exemplo

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key
    
por 17.07.2017 / 19:37