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 bindkey
eu 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 ^[[A
no bindkey-at-CLI speak é a mesma coisa que \e[A
no bindkey-in-zbindkey speak. Isso é fácil. Nos velhos tempos do DOS, Up Arrow era 0;72
possí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 scancode
programa - 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.
fonte
stty -a
que quer quelnext
seja) e a tecla.Respostas:
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
\e
aka\033
aka 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 paraecho
ouprint
(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.^[OF
e^[[F
(ie\eOF
e\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) paraend-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
terminfo
matriz 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.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.
fonte
(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.
fonte
zsh
tópico chaves, você pode tentar azkbd
função que deve lhe proporcionar um mapeamento de chaves inteiro salvo em um arquivo. Eu acredito que éautoload
capaz, mas, se não, procure por ele/usr/share/zsh/functions/Misc
. Há algumas outras coisas estranhas lá também, a propósito, comotetris
.Existem muitas ferramentas à sua disposição no Unix / Linux, por isso pode ser um pouco confuso e esmagador. Para iniciantes, eu usaria
showkey
:Na página de manual sobre
-a
:Você pode usar
xmodmap
para obter alguns dos mapeamentos: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
fonte
Há
infocmp
utilidade para descreverterminfo
entradas. Isso é especialmente útil com a-L
opção conhecida como nomes longos de variáveis C :Comparando isso com a
bindkey
saídapode-se ver que eles usam notação diferente para escapar , mas basicamente é relativamente fácil escrever um script que conecte a segunda coluna da
infocmp
com a primeira dabindkey
.Caso haja alguma dúvida sobre o significado de uma determinada string (conforme impressa na
infocmp
saída), sempre é possível consultar oterminfo
manual, onde a descrição completa é fornecida, por exemplofonte