GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo reasignar teclas en Linux solo para un teclado específico

Sí, es posible usando XKB. A diferencia de xmodmap, XKB puede reasignar sus claves para dispositivos individuales.

Nota:asegúrese de tener xkbcomp> 1.2.0

Primero enumere sus dispositivos con:

xinput list

Obtendrás algo como esto:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

Identifique la cadena de su dispositivo y edite el siguiente script de shell, cambiando la línea sed por una que se ajuste al nombre de su dispositivo. Luego cambie las teclas que necesita reasignar.

Ejemplo:Cargar xev y presione una tecla que desee reasignar. Suponga que descubre que es el código clave 84. Busque 84 en https://gist.github.com/zoqaeski/3880640. El nombre clave allí es <KP5> . Luego busque la clave por la que desea reemplazarla (en el mismo enlace, más abajo) y copie lo que está dentro de los corchetes. Repite el proceso para todas las llaves que quieras.

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
 | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
 | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

Luego obténgalo (puede agregarlo a su .xinitrc). ¡Todo listo! Ahora, presionar las teclas debería generar la salida deseada, solo para el dispositivo que especificó.

Editar :Recientemente, noté que, por alguna razón, la nueva configuración no se aplica de inmediato. Primero debe presionar una tecla en su otro luego pruebe las teclas configuradas en su teclado modificado. No sé por qué sucede esto, tal vez algún tipo de caché.


Para cualquier otra persona que venga aquí desde Google y quiera una respuesta más acorde con lo que esperaba originalmente el autor de la pregunta, conozco dos formas de reasignar eventos en el evdev nivel para que el cambio se aplique a todas las aplicaciones:

  1. udev proporciona una API para modificar las entradas de la base de datos de hardware que controlan las asignaciones entre códigos de escaneo y códigos clave. Esta página de ArchiWiki, que contiene instrucciones, dice explícitamente que funcionará tanto para X11 como para entrada de consola.

    La esencia es que creas una entrada personalizada en /etc/udev/hwdb.d/ que consiste en un patrón de coincidencia de dispositivo y algunas definiciones de reasignación de código de escaneo a código clave, luego ejecute systemd-hwdb update para reconstruir la base de datos y udevadm trigger aplicarlo sin reiniciar.

  2. Dado que Wayland no usa el subsistema de teclado de X11 y los principales compositores de Wayland como GNOME Shell y Weston no implementan interfaces de usuario para configurar los aspectos relevantes de libinput, alguien escribió un demonio llamado evdevremapkeys que resuelve el problema de manera similar al controlador de espacio de usuario G15Daemon para Logitech Teclados para juegos G15.

    (Se traga los eventos que tiene la intención de reasignar, por lo que nadie más que escuche en el dispositivo pueda verlos, luego emite los eventos corregidos a través del uinput API para crear dispositivos de entrada a nivel de kernel desde el espacio de usuario).


Linux
  1. Linux:¿cómo buscar una palabra específica y tomar texto?

  2. Cómo usar expansiones de shell para generar tokens de shell en Linux

  3. ¿Cómo diferencia un directorio solo para archivos de un tipo específico?

  4. cómo saber el número de interrupción/GPIO para un pin específico en Linux

  5. Cómo configurar la ID del proceso en Linux para un programa específico

Cómo navegar por su escritorio GNOME Linux con solo un teclado

Cómo ejecutar un comando durante un tiempo específico en Linux

Cómo instalar Setuptools para Python en Linux

Reasignar teclas de teclado personalizadas en Linux - Tutorial

¿Cómo limitar la velocidad de una tubería en Linux?

Cedilla bajo C (ç) en el diseño de teclado 'US international with dead keys' en Linux