Intercambiar <esc> y <mayúsculas> de una manera que persista con teclados externos

8

Tengo un archivo llamado ~ / .speedswapper que contiene lo siguiente:

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

... cuando corro xmodmap ~/.speedswapper, esto cambia las teclas escy Caps Lock. Tengo esta línea en mi ~ / .profile, por lo que cada vez que inicio sesión estas teclas se cambian.

Sin embargo , si conecto un teclado USB externo, esta configuración no parece persistir. El teclado de mi computadora portátil funciona perfectamente bien, pero tengo que ejecutar el comando nuevamente para que el teclado externo cambie las dos teclas. Afortunadamente, hacerlo no parece afectar el teclado de mi computadora portátil, parecen sincronizarse.

Una solución sería encontrar alguna forma de ejecutar ese comando xmodmap cada vez que se conecta un teclado externo, pero estaría abierto a otra solución de intercambio de teclas, si fuera más robusto. El sistema operativo es Ubuntu 13.04.

Dado el comentario de justbrowsing, parece que esto se puede lograr escribiendo una regla udev: creo que tengo que usar la opción EJECUTAR y que debe activarse en / dev / hidraw0 o / dev / hidraw1, que son los dispositivos que aparece cuando conecto mi teclado ... pero todavía estoy tratando de entender el concepto, así que agradecería cualquier ayuda de alguien que sepa lo que está haciendo con udev.

maldad
fuente
Mira en escribir reglas de udev para esto.
justbrowsing

Respuestas:

3

Dado que tiene este comando en su ~/.profile, solo se ejecutará una vez, cuando inicie sesión. Una solución no muy elegante sería colocar el comando en su ~/.bashrclugar para que se ejecute cada vez que abra un terminal.

Una mejor solución sería definir una udevregla que se ejecute xmodmapcuando se inserte su teclado USB (estoy usando los valores devueltos para mi teclado USB, deberá editar esta solución para que se ajuste al suyo):

  1. Obtenga los detalles de su teclado USB. Ejecute este comando con el teclado enchufado:

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. Para escribir udevreglas, necesita saber con qué deben coincidir. Puede obtenerlo buscando en la salida de udevadm info --export-dbla event6entrada, o simplemente analizarla directamente así:

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

    Eso devuelve varias líneas de texto, incluidas las que usaremos:

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udevse complica al usar programas X como xmodmap, ni siquiera pude hacerlo funcionar al exportar $DISPLAYy $XAUTHORITY. De todos modos, no pude hacerlo funcionar con su método, por lo que mi solución usa en su keymaplugar. Primero, deberá encontrar los códigos clave para Escy Caps Lock, puede hacerlo ejecutando

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

    y luego presionando las teclas relevantes. En mi sistema, esto devuelve:

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. Cree una nueva regla de mapa de teclas que contenga estas líneas:

    0x70029 capslock
    0x70039 esc
    

    y guardarlo como /lib/udev/keymaps/speedswap.

  5. Define una nueva udevregla. Cree un archivo llamado /etc/udev/rules.d/95-speedswap.rulesy agregue estas líneas:

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

Eso debería hacerlo, al menos en mi sistema, enchufar mi USB externo hace Escque actúe como Caps Locky viceversa .

terdon
fuente
Esto se ve bien y lo intentaré mañana o pasado mañana. Esperaba una forma agnóstica de teclado para hacer esto, pero eso es más una 'sería genial' que una necesidad genuina .
evilsoup
@evilsoup debería poder hacer una regla más general, probar udevadm info --export-dbcon algunos teclados y ver qué tienen en común. Quizás ID_MODEL=USB_Keykoardo ID_USB_DRIVER=usbhideso también podría desencadenar la regla con el dispositivo incorrecto. Depende de usted.
terdon