Já que você tem este comando no seu ~/.profile
, ele só será executado uma vez, quando você fizer o login. Uma solução não muito elegante seria colocar o comando no seu ~/.bashrc
para que ele seja executado toda vez que você abre um terminal.
Uma solução melhor seria definir uma regra udev
que executará xmodmap
quando o teclado USB for inserido (estou usando os valores retornados para o meu teclado USB, você precisará editar essa solução para ajustá-la à sua) :
-
Obtenha os detalhes do seu teclado USB. Execute este comando com o teclado conectado:
$ /lib/udev/findkeyboards | grep USB USB keyboard: input/event6
-
Para escrever regras
udev
, você precisa saber com o que elas devem corresponder. Você pode obter isso pesquisando a saída deudevadm info --export-db
para a entradaevent6
ou apenas analisá-la diretamente da seguinte forma:udevadm info --export-db | perl -ne 'BEGIN{$/="\n\n"}print if /event6/'
Isso retorna várias linhas de texto, incluindo as que usaremos:
E: ID_MODEL_ID=0002 [...] E: ID_VENDOR_ID=1c4f
-
udev
se torna complicado ao usar programas X comoxmodmap
, eu nem consegui fazer isso funcionar ao exportar$DISPLAY
e$XAUTHORITY
. De qualquer forma, eu não consegui fazer isso funcionar com o seu método, então minha solução usakeymap
. Primeiro, você precisará descobrir os códigos-chave para Esc e Caps Lock , você pode fazer isso executandosudo /lib/udev/keymap -i input/event6
e, em seguida, pressionando as teclas relevantes. No meu sistema, isso retorna:
scan code: 0x70029 key code: esc scan code: 0x70039 key code: capslock
-
Crie uma nova regra de keymap contendo estas linhas:
0x70029 capslock 0x70039 esc
e salve-o como
/lib/udev/keymaps/speedswap
. -
Defina uma nova regra
udev
. Crie um arquivo chamado/etc/udev/rules.d/95-speedswap.rules
e adicione essas linhas a ele:ACTION=="add", SUBSYSTEM=="input", ATTRS{idVendor}=="1c4f", ATTRS{idProduct}=="0002", RUN+="keymap $name speedswap"
Isso deve ser feito, pelo menos no meu sistema, conectando minhas causas USB Esc para agir como Caps Lock e vice-versa .