Trocar <esc> e <caps lock> de uma maneira que persista nos teclados externos

8

Eu tenho um arquivo chamado ~ / .speedswapper que contém o seguinte:

! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

... quando corro xmodmap ~/.speedswapper, isso alterna as teclas esce Caps Lock. Eu tenho essa linha no meu perfil ~ /., Para que, sempre que eu entre, essas chaves sejam trocadas.

No entanto , se eu conectar um teclado USB externo, essa configuração parece não persistir. O teclado do meu laptop funciona perfeitamente bem, mas preciso executar o comando novamente para que o teclado externo alterne as duas teclas. Felizmente, isso não parece afetar o teclado do meu laptop - eles parecem sincronizar.

Uma solução seria encontrar uma maneira de executar esse comando xmodmap sempre que um teclado externo estiver conectado, mas eu estaria aberto a outra solução de troca de teclas, se fosse mais robusta. O sistema operacional é o Ubuntu 13.04.

Dado o comentário de justbrowsing, parece que isso pode ser alcançado escrevendo uma regra do udev - acho que tenho que usar a opção RUN e que deve ser acionada em / dev / hidraw0 ou / dev / hidraw1, que são os dispositivos que aparecem quando eu conecto o teclado ... mas ainda estou tentando entender o conceito, por isso gostaria de receber ajuda de alguém que sabe o que está fazendo com o udev.

evilsoup
fonte
Procure escrever regras do udev para isso.
justbrowsing

Respostas:

3

Como você tem esse comando no seu computador ~/.profile, ele será executado apenas uma vez quando você efetuar o login. Uma solução, não muito elegante, seria colocar o comando no seu, ~/.bashrcpara que seja executado toda vez que você abrir um terminal.

Uma solução melhor seria definir uma udevregra que será executada xmodmapquando o teclado USB for inserido (estou usando os valores retornados para o meu teclado USB, você precisará editar esta solução para se adequar à sua):

  1. Obtenha os detalhes do seu teclado USB. Execute este comando com o teclado conectado:

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. Para escrever udevregras, você precisa saber com o que elas devem corresponder. Você pode obter isso pesquisando a saída de udevadm info --export-dbpara a event6entrada ou apenas analisando-a diretamente da seguinte forma:

    udevadm info --export-db | perl -ne 'BEGIN{$/="\n\n"}print if /event6/'
    

    Isso retorna várias linhas de texto, incluindo estas que iremos usar:

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udevfica complicado ao usar programas X como xmodmap, eu nem conseguia fazê-lo funcionar ao exportar $DISPLAYe $XAUTHORITY. De qualquer forma, eu não consegui fazê-lo funcionar com seu método, então minha solução é usada keymap. Primeiro, você precisará descobrir os códigos-chave para Esce Caps Lock, você pode fazer isso executando

    sudo /lib/udev/keymap -i input/event6
    

    e depois pressionando as teclas relevantes. No meu sistema, isso retorna:

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. Crie uma nova regra de mapa de teclas contendo estas linhas:

    0x70029 capslock
    0x70039 esc
    

    e salve-o como /lib/udev/keymaps/speedswap.

  5. Defina uma nova udevregra. Crie um arquivo chamado /etc/udev/rules.d/95-speedswap.rulese adicione estas linhas:

    ACTION=="add", 
    SUBSYSTEM=="input", 
    ATTRS{idVendor}=="1c4f", 
    ATTRS{idProduct}=="0002", 
    RUN+="keymap $name speedswap"
    

Isso deve ser feito, pelo menos no meu sistema, conectar meu USB externo faz Esccom que funcione como Caps Locke vice-versa .

terdon
fonte
Parece bom e vou tentar amanhã ou no dia seguinte. Eu esperava uma maneira agnóstica de fazer isso, mas isso é mais uma coisa 'seria legal' do que uma necessidade genuína .
evilsoup
@evilsoup, você poderá criar uma regra mais geral, tente udevadm info --export-dbcom alguns teclados e veja o que eles têm em comum. Talvez ID_MODEL=USB_Keykoardou ID_USB_DRIVER=usbhidmas isso também possa desencadear a regra com o dispositivo errado. Você decide.
terdon