Substituir alguns códigos de chave pelo XKB

10

Quero embaralhar algumas teclas com o XKB. (Por quê? Em um laptop em que algumas teclas estão localizadas inconvenientemente.) Atualmente, uso o xmodmap:

keycode 110 = Prior
keycode 115 = Delete
keycode 112 = Next
keycode 117 = Insert
keycode 119 = End
keycode 118 = Home

Em vez disso, quero usar o XKB e atribuir nomes simbólicos diferentes para determinadas chaves físicas, em vez de atribuir diferentes academias de chaves a determinados códigos de chave. ( Este é o porquê.) Eu quero código de acesso 110 para enviar PGUP, em vez de HOME, código de acesso 115 para enviar DELE, em vez de END, etc. O resto da configuração não deve ser afectado (por isso PGUPé manter o envio do keysym Prior, etc., e todas as outras chaves permanecem como eles são).

Como posso alterar a atribuição desses códigos-chave específicos? Carregarei um arquivo com xkbcomp somefile.xkb $DISPLAYo que preciso inserir somefile.xkb?

Gilles 'SO- parar de ser mau'
fonte

Respostas:

13

Crie um arquivo contendo as alterações do seu código-chave e salve-o como (por exemplo) ~/.xkb/keycodes/local. (O keycodesdiretório é codificado; o diretório base pode ser outra coisa e o nome do arquivo também.) Isso conterá no seu caso

xkb_keycodes {
  <PGUP> = 110;
  <PGDN> = 112;
  <DELE> = 115;
  <INS> = 117;
  <HOME> = 118;
  <END> = 119;
};

Para carregar isso, execute

setxkbmap -print | sed -e '/xkb_keycodes/s/"[[:space:]]/+local&/' | xkbcomp -I${HOME}/.xkb - $DISPLAY

Isso gera suas configurações atuais, adiciona +localà xkb_keycodes includeinstrução e a carrega no compilador XKB, adicionando ~/.xkbao caminho de inclusão. (Se você nomear seu arquivo como algo diferente ~/.xkb/keycodes/local, obviamente precisará alterar +locale -I${HOME}/.xkb}.) Dessa forma, todas as outras configurações serão preservadas.

Stephen Kitt
fonte
1
Portanto, este é o caminho esperado e a maneira de transmiti-lo ao -Icomutador! Obrigado, não consegui descobrir isso na página de manual.
L. Levrel
funcionou como um encanto! funcionou se atualizar falta xkb_symbols, basta substituir xkb_keycodes com ele, trabalhou
zw963
5

Você pode começar por setxkbmap -print > somefile.xkbobter o mapa de teclas que está usando como base e redefinir os nomes de chave que deseja na xkb_keycodesseção como esta:

xkb_keymap {
 xkb_keycodes {
  include "evdev+aliases(azerty)"
  // Custom <key name> = keycode
  <INS> = 117;
  <HOME> = 118;
  <PGUP> = 110;
  <DELE> = 115;
  <END> = 119;
  <PGDN> = 112;
 };
 xkb_types { include "complete"};
 xkb_compatibility { include "complete"};
 xkb_symbols { include "pc+fr+inet(evdev)"};
 xkb_geometry { include "pc(pc104)"};
};

Isso gera avisos de que alguns nomes de chave são atribuídos várias vezes, mas funciona porque apenas o último conta (por isso é importante colocar as configurações personalizadas após a inclusão). E o arquivo tem a vantagem de ser legível.

Outra maneira é despejar o mapa de teclas que você usa em um arquivo: xkbcomp $DISPLAY somefile.xkbe modificar as mesmas linhas (é o mesmo mapa de teclas com as inclusões avaliadas). Dessa forma, não há avisos para várias definições, mas é menos legível.

Leiaz
fonte
1
De onde vêm todos esses nomes ( evdev+aliases(azerty), etc.)? Quero explicitamente realizar uma alteração relativa, não uma reconfiguração completa. Chaves diferentes das 6 listadas nas perguntas não devem ser afetadas; elas devem permanecer no estado em que estavam quando eu emiti o comando.
Gilles 'SO- stop be evil'
1
Eles vêm do setxkbmap -print, são arquivos /usr/share/X11/xkb/. Eu acho que você tem que dar um mapa de teclado inteiro para xkbcompmas posso estar errado ...
Leiaz