Mapeamentos de chaves no Linux

3

O que as pessoas querem dizer quando apontam que as "chaves não estão mapeadas corretamente" em uma instalação do Linux ao trabalhar na linha de comando?

A instalação padrão não está correta? Quais mapeamentos extras / específicos são necessários?

Também me disseram que no meu Mac, onde as teclas Início e Fim e Ctrl não fazem o que eu esperava.

    
por Jim 29.06.2013 / 22:40

2 respostas

4

scancodes & códigos de teclas

Em geral, quando alguém diz isso, eles querem dizer que a função rotulada em uma chave não corresponde ao "código" que a chave está enviando ao kernel do Linux quando é pressionada. Você pode pensar nisso como a chave é rotulada Home , mas o kernel está recebendo o "código" para a tecla Ctrl .

Em um nível muito mais baixo, parte do que realmente está acontecendo é que cada tecla recebe um scancode.

trecho da página da Wikipédia em scancode

A scancode (or scan code) is the data that most computer keyboards send to a computer to report which keys have been pressed. A number, or sequence of numbers, is assigned to each key on the keyboard.

Esses scancodes são mapeados em códigos de tecla pelo kernel do Linux. São esses códigos de teclas que geralmente são comunicados aos aplicativos. Aqui está outro recurso de scancode se você quiser mais detalhes.

OBSERVAÇÃO: isso é uma simplificação, mas estou tentando apenas dar uma compreensão geral dessa camada. A principal vantagem é que as teclas são pressionadas, os scancodes são gerados, o kernel do Linux vê esses scancodes e emite códigos de teclas.

setkeycodes

Você pode alterar o mapeamento do código de tecla scancode usando uma ferramenta setkeycodes :

setkeycodes scancode keycode ...

The setkeycodes command reads its arguments two at a time, each pair of arguments consisting of a scancode (given in hexadecimal) and a keycode (given in decimal). For each such pair, it tells the kernel keyboard driver to map the specified scancode to the specified keycode.

O mapeamento de código-chave é mantido em arquivos de mapa de chaves. No meu sistema Fedora, meu arquivo de mapa de teclado dos EUA estava localizado aqui, /lib/kbd/keymaps/i386/qwerty/us.map.gz . Eu encontrei por investigar um pouco com este comando:

$ locate map.gz|grep us
/lib/kbd/keymaps/amiga/amiga-us.map.gz
/lib/kbd/keymaps/atari/atari-us.map.gz
/lib/kbd/keymaps/i386/qwerty/br-latin1-us.map.gz
/lib/kbd/keymaps/i386/qwerty/is-latin1-us.map.gz
/lib/kbd/keymaps/i386/qwerty/us-acentos.map.gz
/lib/kbd/keymaps/i386/qwerty/us.map.gz
/lib/kbd/keymaps/i386/qwertz/cz-us-qwertz.map.gz
/lib/kbd/keymaps/mac/all/mac-us.map.gz
/lib/kbd/keymaps/sun/sunt5-cz-us.map.gz
/lib/kbd/keymaps/sun/sunt5-us-cz.map.gz

Observe que esses arquivos estão compactados (.gz), portanto, você deve descompactá-los (não se incomode) ou usar zcat ou zless para pesquisá-los:

$ zless /lib/kbd/keymaps/i386/qwerty/us.map.gz
# us.map
keymaps 0-2,4-6,8-9,12
alt_is_meta
include "qwerty-layout"
include "linux-with-alt-and-altgr"
include "compose.latin1"
include "euro1.map"
strings as usual

keycode   1 = Escape
keycode   2 = one              exclam
keycode   3 = two              at               at               nul              nul
keycode   4 = three            numbersign
        control keycode   4 = Escape
keycode   5 = four             dollar           dollar           Control_backslash
keycode   6 = five             percent

...
...

keycode  97 = Control

Portanto, se você quiser alterar a chave "Control" (código de acesso 97) e defini-la no código de controle da tecla "Left Control", (scancode 0x1d 0x9d), use o seguinte:

$ setkeycodes 1d9d 97 &

showkey

Você também pode ver em qual código uma tecla está mapeada usando o comando showkey :

$ showkey -a

Press any keys - Ctrl-D will terminate this program

1    49 0061 0x31
2    50 0062 0x32
3    51 0063 0x33
a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
^[OH 27 0033 0x1b
     79 0117 0x4f
     72 0110 0x48
^D    4 0004 0x04

O "^ [OH" é eu pressionando minha tecla HOME .

NOTA 1: Quando em ascii' dump mode ( showkey -a '), showkey imprime na saída padrão os valores decimal, octal e hexadecimal da tecla pressionada, de acordo com o presente mapa de teclado .

NOTA2: Pode ser necessário usar sudo ao executar showkey .

    
por 30.06.2013 / 08:33
1

Eu uso um MacBook Pro e não tenho nenhum problema com os mapeamentos de teclas quando me conecto aos sistemas UNIX, portanto as configurações padrão são quase certamente boas e não são necessários mapeamentos. Eu uso regularmente o Debian, Ubuntu, RedHat e Solaris 11.

No entanto, o que as pessoas querem dizer quando dizem que está em Preferências de terminal em Configurações na guia Teclado . Você pode editar seus mapeamentos de teclas lá.

A única alteração que fiz foi ativar a opção como meta .

Com relação a Home e End , eu uso ctrl + A para Home e ctrl + E para End, porque eu não gosto de onde as teclas Home e End estão nos teclados. Eu também mudei minha chave caps lock para outra tecla ctrl (em Preferências do Sistema em Keyboard) porque esse é o local tradicional para uma tecla ctrl, é mais confortável e sério, quem usa caps lock?

    
por 30.06.2013 / 08:27