Permutation de <esc> et <caps lock> d'une manière qui persiste avec les claviers externes

8

J'ai un fichier appelé ~ / .speedswapper qui contient les éléments suivants:

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

... quand je cours xmodmap ~/.speedswapper, cela change les touches escet Caps Lock. J'ai cette ligne dans mon ~ / .profile, de sorte que chaque fois que je me connecte, ces clés sont commutées.

Cependant , si je branche un clavier USB externe, ce paramètre ne semble pas persister. Le clavier de mon ordinateur portable fonctionne parfaitement bien, mais je dois réexécuter la commande pour que le clavier externe permute les deux touches. Heureusement, cela ne semble pas affecter le clavier de mon ordinateur portable - ils semblent se synchroniser.

Une solution serait de trouver un moyen d'exécuter cette commande xmodmap chaque fois qu'un clavier externe est branché, mais je serais ouvert à une autre solution d'échange de touches, si elle était plus robuste. Le système d'exploitation est Ubuntu 13.04.

Compte tenu du commentaire de justbrowsing, il semble que cela puisse être réalisé en écrivant une règle udev - je pense que je dois utiliser l'option RUN, et qu'elle devrait être déclenchée sur / dev / hidraw0 ou / dev / hidraw1, qui sont les périphériques qui apparaît lorsque je branche mon clavier ... mais j'essaie toujours de comprendre ce concept, donc j'apprécierais toute aide de quelqu'un qui sait ce qu'il fait avec udev.

evilsoup
la source
Cherchez à écrire des règles udev pour cela.
justbrowsing

Réponses:

3

Puisque vous avez cette commande dans votre ~/.profile, elle ne sera exécutée qu'une seule fois, lorsque vous vous connecterez. Une solution, pas très élégante, serait de placer la commande dans votre ~/.bashrcplace afin qu'elle soit exécutée à chaque fois que vous ouvrez un terminal.

Une meilleure solution serait de définir une udevrègle qui s'exécutera xmodmaplorsque votre clavier USB sera inséré (j'utilise les valeurs renvoyées pour mon clavier USB, vous devrez éditer cette solution pour l'adapter à la vôtre):

  1. Obtenez les détails de votre clavier USB. Exécutez cette commande avec le clavier branché:

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. Pour écrire des udevrègles, vous devez savoir à quoi elles doivent correspondre. Vous pouvez l'obtenir en recherchant la sortie de udevadm info --export-dbl' event6entrée, ou en l'analysant directement comme ceci:

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

    Cela renvoie plusieurs lignes de texte dont celles que nous utiliserons:

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udevdevient compliqué lors de l'utilisation de programmes X comme xmodmap, je ne pouvais même pas le faire fonctionner lors de l'exportation $DISPLAYet $XAUTHORITY. Quoi qu'il en soit, je ne pouvais pas le faire fonctionner avec votre méthode, donc ma solution utilise à la keymapplace. Tout d'abord, vous devrez trouver les codes clés pour Escet Caps Lock, vous pouvez le faire en exécutant

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

    puis en appuyant sur les touches appropriées. Sur mon système, cela renvoie:

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. Créez une nouvelle règle de keymap contenant ces lignes:

    0x70029 capslock
    0x70039 esc
    

    et enregistrez-le sous /lib/udev/keymaps/speedswap.

  5. Définissez une nouvelle udevrègle. Créez un fichier appelé /etc/udev/rules.d/95-speedswap.ruleset ajoutez-y ces lignes:

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

Cela devrait le faire, au moins sur mon système, brancher mon USB externe fait Escagir comme Caps Locket vice versa .

terdon
la source
Cela semble bon et je vais l'essayer demain ou après-demain. J'espérais une façon indépendante du clavier de le faire, mais c'est plus une chose «ce serait bien» qu'un véritable besoin .
evilsoup
@evilsoup vous devriez pouvoir faire une règle plus générale, essayer udevadm info --export-dbavec quelques claviers et voir le chapeau qu'ils ont en commun. Peut ID_MODEL=USB_Keykoard- être ou ID_USB_DRIVER=usbhidmais cela pourrait également déclencher la règle avec le mauvais appareil. Dépend de vous.
terdon