Configuración de modificadores Hyper y Super para ciertas claves con setxkbmap o xmodmap

Configuración de modificadores Hyper y Super para ciertas claves con setxkbmap o xmodmap

Problema: Quiero modificar/redefinir la distribución de mi teclado (pc105 se) para que cuando presione ciertas teclas con mod3 (super) y mod4 (hyper), se devuelva un carácter diferente al habitual.

P.ej

El código clave 61 produce 'menos' (-) cuando se presiona normalmente y 'guión bajo' (_) cuando se presiona con mayúsculas. Cuando se presiona con el primer grupo de modificadores (AltGr), se producen 'dead_belowdot' y 'dead_abovedot' (sin/con mayúscula).

Lo que quiero es una paréntesis izquierda o paréntesis derecha (sin/con mayúsculas) cuando presiono la tecla con la tecla Super (win) también presionada, y barra diagonal/barra invertida para la tecla Hyper (que he configurado para Bloq Mayús).

Intenté agregar un .Xmodmapa mi directorio de inicio y ejecutarlo xmodmap ~/.Xmodmapusando la siguiente sintaxis

keycode 61 = minus underscore a b c d e f g h i j k l m n o p

Sin embargo, eso hará que AltGr dé como resultado c/d, mientras que ganar/bloqueo de mayúsculas solo dará como resultado -/_

También intenté modificar /usr/share/X11/xkb/symbols/se directamente y probé los siguientes cambios:

key <BKSL>  { [apostrophe, asterisk, acute, multiply], [a,b,c,d], [e,f,g,h], [i,j,k,l]};

Pero todo lo que sucede es ' * ´ × ' * ' * (para normal, altgr, win y mayúsculas respectivamente). yo también lo he probado

key <BKSL>  { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]};

Pero tan pronto como hay más de cuatro campos especificados, parece que la clave se rompe por completo y la clave vuelve al comportamiento predeterminado de pc105 (¿nosotros?).

Como no pude encontrar nada en stackoverflow, superusuario o Google sobre cómo lidiar con mi escenario, pregunto aquí.

Este es mixmodmap -pm

xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock      
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        Hyper_L (0x42),  Hyper_L (0xcf)
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

Respuesta1

Dos años después, finalmente me siento orgulloso de responder mi propia pregunta.

He descubierto que el método más fácil, confiable y extensible es confiar únicamente en xmodmap.

1. Obtenga códigos clave de claves especiales

Ejecute xevpara determinar el código de las teclas que desea utilizar como conmutadores de modo. Luego presione las teclas que le interesen y anote laskeycode

$ xev
KeyRelease event, serial 40, synthetic NO, window 0x2600001,
    root 0x2a6, subw 0x0, time 1221887800, (885,743), root:(3447,805),
    state 0x2010, keycode 66 (keysym 0xff7e, Mode_switch), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

El código clave está en la tercera línea, código clave 66.

Para mí, estas fueron las claves que me interesaban especialmente y sus códigos de clave correspondientes:

  • Caps Lock, código clave 66
  • Pause|Break, código clave 128
  • Left Windows key, código clave 133
  • Num Lock, código clave 77

2. Establecer teclas de cambio

Esta es la configuración por la que he optado, pero puedes elegir tu propia configuración. He guardado esto en un archivo $HOME/.xmodmap.

~/.xmodmap
keycode  66 = Mode_switch
keycode 127 = Multi_key
keycode 133 = Super_L
...

De esta manera me he vinculado Caps Locka Mode_switch, Pause Breaka y la tecla Composeizquierda a . La clave es particularmente útil ya que permite combinar dos claves para ligar. Por ejemplo, seguido de y da como resultado el signo de marca registrada .WinSuper_LComposeComposeTM

3. Obtenga enlaces de mapas de teclas actuales dexmodmap

Para no destruir la distribución de mi teclado, quería mantener mis teclas lo más parecidas posible a mi distribución original. Para hacer eso, imprimí el mapa de teclas actual y busqué los códigos de teclas que quería cambiar.

$ xmodmap -pke | ag 'keycode  51' 

Por supuesto, puedes usar grepo ack, dependiendo de la herramienta que prefieras usar.

$ xmodmap -pke | grep 'keycode  41' 
$ xmodmap -pke | ack 'keycode  31' 

La salida de esto está en el mismo formato que el que usted especifica en su ~/.xmodmapejemplo:

keycode  31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless

4. Haga una copia de seguridad de su existentexmodmap

En caso de que algo salga mal, nunca es mala idea tener la corriente xmodmapdisponible para recurrir fácilmente.

$ xmodmap -pke > ~/.xmodmap.bak

5. Agrega personajes al segundo, tercer y cuarto nivel de tus claves.

Según tengo entendido, el formato del .xmodmaparchivo es el siguiente:

keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ...

Ahora, no entiendo todos esos niveles pero Mode_Switch( Caps Locken mi caso) te dará el nivel 2 y Alt Grme da el nivel 3, y eso es prácticamente todo lo que me interesa, así que dejé el resto de esa línea como estaba en mi ~/.xmodmap.baky simplemente cambié las columnas 3, 4, 5 y 6 (nivel 2 y 3, más turno) a caracteres válidos (Consulte aquí para obtener una lista de caracteres válidos.).

~/.xmodmap
...
keycode  51 = apostrophe asterisk dollar ampersand acute multiply acute multiply apostrophe asterisk acute multiply apostrophe asterisk acute multiply
keycode  59 = comma semicolon parenleft parenright dead_cedilla dead_ogonek dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek
keycode  60 = period colon bracketleft bracketright periodcentered dead_abovedot periodcentered dead_abovedot period colon periodcentered dead_abovedot period colon periodcentered dead_abovedot
keycode  61 = minus underscore braceleft braceright slash backslash braceleft braceright
keycode  65 = space space space space space underscore space space
...

6. Pon a prueba tu.xmodmap

Ahora xmodmapejecute .xmodmapy pruebe su nueva distribución de teclado.

$ xmodmap /home/user/.xmodmap

7. Asegúrese de que la distribución de su teclado esté cargada en x init

Agregué esto a mi $HOME/.xinitrc:

~/.xinitrc
...
[-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap
...

¡Espero que esto haya sido útil!

información relacionada