tabela de atalhos de teclas?

18

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

O motivo pelo qual pergunto é que gostaria de atribuir algumas combinações de teclas e não tenho como saber como me referir a elas (a menos que eu roube uma que já esteja definida).

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

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

... e posso supor que "kend" significa que isso se refere à Endchave.

Cruzando com bindkeyeu vejo estas linhas:

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

... então eu confio que uma dessas linhas se refira à Endchave. Qual?

Também temos isso no arquivo "bindkey":

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

Agora, eu sei que essa é a Up Arrowchave, 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 ^[[Ano bindkey-at-CLI speak é a mesma coisa que \e[Ano bindkey-in-zbindkey speak. Isso é fácil. Nos velhos tempos do DOS, Up Arrow era 0;72possível encontrar o código de verificação de cada pressionamento de tecla legal e havia apenas um idioma.

Há uma mesa? Ou alguma outra maneira de poder pressionar uma tecla e saber como se referir a ela em terminfo[]... em "bindkey-in-zbindkey" ... em "bindkey-at-CLI" e / ou em qualquer outro idioma que houver acontecer de ser?

Novamente, no DOS, houve o scancodeprograma - digite uma tecla e você obtém o scancode. Foi incrivelmente fácil.


A partir das respostas, acho que não há como imprimir uma tabela de todas as ligações possíveis? Enfim '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 nem todas as ligações possíveis . Agora, se houvesse alguma maneira de traduzir os principais glifos em termos 'regulares':

bindkey "Home" beginning-of-line

... então eu ficaria feliz.

Ray Andrews
fonte
3
Pressione Ctrl + V (ou o stty -aque quer que lnextseja) e a tecla.
Mikel

Respostas:

15

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 convertidas em seqüências de escape (começando com o caractere de escape ESC \eaka \033aka 0x1b aka ^ [). O mesmo vale para combinações de uma tecla de função ou de uma tecla de caractere com modificadores, embora nem todos os terminais enviem sequências diferentes para todas as diferentes combinações de modificadores. Algumas teclas são enviadas codificadas como caracteres de controle (por exemplo, Tab→ Ctrl-I = \t= \011).

Como você pode ver, existem muitas maneiras de descrever caracteres de controle. Alguns têm um nome, correspondente à sua função tradicional (por exemplo, guia, avanço de linha); eles tendem a ter uma combinação de barra invertida + letra que você pode usar dentro $'…'ou em um argumento para echoou print(assim como em expressões regulares sed e em literais de strings em awk, C e outros idiomas (observe que ferramentas diferentes podem ter um conjunto ligeiramente diferente) seqüências de escape)). Você pode usar barra invertida + octal (por exemplo \033) também nesses contextos.

Há alguma variação quanto aos terminais da sequência de escape enviados para cada tecla. Felizmente, quase não há sobreposição: existem muito poucas seqüências de caracteres que significam teclas diferentes em diferentes terminais. O principal problema é o caractere 127 = \177= 0x7f, que é mais frequentemente Backspacehoje em dia, mas às vezes Delete.

^[OFe ^[[F(ie \eOFe \e[F) são as duas seqüências de escape comuns enviadas por End. ^E(ie \005) é a ligação de tecla Emacs ( Ctrl+ E) para end-of-line.

Para ver o que o emulador de terminal envia para uma determinada tecla ou combinação de teclas, pressione Ctrl+ Ve, em seguida, a tecla em questão. Isso insere o primeiro caractere da sequência de escape literalmente. As seqüências de escape normalmente consistem em um caractere de escape seguido de caracteres imprimíveis, portanto o restante da sequência de escape também é inserido literalmente.

O banco de dados Terminfo contém as seqüências de escape para algumas chaves. Você encontrará a lista de recursos do Terminfo na página do manual terminfo (5) em seu sistema. No zsh, você pode listar os valores no banco de dados por meio da terminfomatriz associativa. Cuidado ao imprimir valores que contenham seqüências de escape que também são interpretadas pelo terminal quando exibidas, portanto, imprima-as em uma forma de citação.

% print -lr ${(q)terminfo[kend]}
$'\033'OF

Consulte Como funcionam a entrada do teclado e a saída de texto? para uma visão mais completa do que acontece quando você pressiona uma tecla. Não é necessário entender as ligações de teclas no zsh.

Gilles 'SO- parar de ser mau'
fonte
11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(comentários, melhorias, denúncias amargas são bem-vindas: rayandrews at eastlink dot ca)

Combinações de teclas 'disponíveis' em um teclado de PC '101' conectado a um PC executando 'zsh' no xfce4 no Debian Linux (não sei quem está 'no comando'). Todas as combinações que produzem códigos duplicados nas teclas 'cinza' foram removidas, exceto o avatar mais simples que é mostrado. Observe que algumas teclas / combinações cinza têm duplicatas '^ letter', como 'Enter' == '^ M', que não foram removidas. Outras combinações ativas não estavam 'disponíveis' desde que usadas pelo sistema, mesmo a partir do console, por exemplo. As teclas 'Alt + Function' alternam os terminais. 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, ao que parece. Nenhuma das combinações de teclas triplas (por exemplo, 'Ctrl + Alt + Up') produziu códigos únicos nas teclas cinza, mas eles produzem códigos nas teclas brancas. Anomalias interessantes: '^ [[22' '^ [[27' '^ [[30' estão 'ausentes', você deve estar se perguntando por que esses números foram ignorados. (O que significa que você pode esperar que 'F11' seja '^ [[22' e não '^ [[23'.)

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

bindkey -s '^ [[[A' 'meu comando \ Cm'

... vincule 'F1' a 'meu-comando' e execute-o (o '\ Cm' simula a tecla 'Enter').

em '.zshrc':

bindkey -s '\ e [25' 'meu-comando1; meu command2 \ Cm '

... vincule 'Shift-F1' a 'my-command1' seguido de 'my-command2' e execute os dois.

COMBINAÇÕES USANDO APENAS AS CHAVES 'CINZA' :

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

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

tecla [ Inserir ] = '^ [[2 ~' tecla [ Excluir ] = '^ [[3 ~' tecla [ Home ] = '^ [[1 ~' tecla [ Fim ] = '^ [[4 ~' tecla [ PageUp ] = '^ [[5 ~' tecla [ PageDown ] = '^ [[6 ~' tecla [ Up ] = '^ [[A' tecla [ Down ] = '^ [[B' tecla [ Direita ] = '^[[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:

Anomalias: '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?

Como / onde está definido " Alt - Ctrl - Delete "?

enter code here
Ray Andrews
fonte
Eu quase quero enviar um e-mail ...
mikeserv
Por todos os meios mike: [email protected]
Ray Andrews
era só uma piada, raio - você não vê muitas vezes cadelas, queixas, reclamações? envie-me um e-mail ... por linha aqui. Eu gostei, é tudo. de qualquer maneira, como um aparte, no zshtópico chaves, você pode tentar a zkbdfunção que deve lhe proporcionar um mapeamento de chaves inteiro salvo em um arquivo. Eu acredito que é autoloadcapaz, mas, se não, procure por ele /usr/share/zsh/functions/Misc. Há algumas outras coisas estranhas lá também, a propósito, como tetris.
mikeserv
Essa é uma das ferramentas que eu costumava fazer na minha mesa, mas como você consegue fazer 'tudo' de uma só vez?
Ray Andrews
interessante - acho que não. Na verdade, nunca o executei antes - apenas li seu arquivo de origem - e isso foi há alguns meses atrás. Eu acho que ele faz uma série de testes de entrada para gerar seu arquivo salvo. mas salva tudo em um arquivo, certo?
mikeserv
6

Existem muitas ferramentas à sua disposição no Unix / Linux, por isso pode ser um pouco confuso e esmagador. Para iniciantes, 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 de manual sobre -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 xmodmappara 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)

A descrição acima não é todas as peças do quebra-cabeça, mas são algumas informações adicionais que podem ser úteis para você encontrar o mapa definitivo entre as teclas de atalho e os códigos de barra. Há mais informações nesta seção de perguntas e respostas da U&L intitulada: Mapeamentos principais no Linux .

Referências

slm
fonte
11
Embora tudo isso seja verdade, é irrelevante entender as ligações de teclas em um terminal.
Gilles 'SO- stop be evil'
@ Gilles - sim, eu meio que percebi isso, só estava tentando fornecer leads, agora que li sua IA para entender como essa interface funciona, obrigado!
slm
"showkey -a" não é irrelevante, no entanto.
skagedal
2

se houvesse apenas uma maneira de traduzir os principais glifos em termos 'regulares':

bindkey "Home" beginning-of-line

... então eu ficaria feliz.

infocmputilidade para descrever terminfoentradas. Isso é especialmente útil com a -Lopção conhecida como nomes longos de variáveis ​​C :

$ 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 bindkeysaída

"^[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 notação diferente para escapar , mas basicamente é relativamente fácil escrever um script que conecte a segunda coluna da infocmpcom a primeira da bindkey.

Caso haja alguma dúvida sobre o significado de uma determinada string (conforme impressa na infocmpsaída), sempre é possível consultar o terminfomanual, onde a descrição completa é fornecida, por exemplo

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key
jimmij
fonte