Configurando modificadores Hyper e Super para determinadas chaves com setxkbmap ou xmodmap

Configurando modificadores Hyper e Super para determinadas chaves com setxkbmap ou xmodmap

Problema: Quero modificar/redefinir o layout do meu teclado (pc105 se) para que, quando pressiono certas teclas com mod3 (super) e mod4 (hyper), um caractere diferente do normal seja retornado.

Por exemplo

O código-chave 61 produz 'menos' (-) quando pressionado normalmente e 'sublinhado' (_) quando pressionado com shift. Quando pressionado com o primeiro grupo modificador (AltGr) 'dead_belowdot' e 'dead_abovedot' são produzidos (sem/com shift).

O que eu quero é um parêntese esquerdo ou direito (sem/com shift) quando pressiono a tecla com a tecla Super (win) também pressionada, e barra/barra invertida para a tecla Hyper (que configurei para Caps Lock).

Eu tentei adicionar um .Xmodmapao meu diretório inicial e executá-lo xmodmap ~/.Xmodmapusando a seguinte sintaxe

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

No entanto, isso fará com que AltGr resulte em c/d, enquanto win/caps lock ainda resulta apenas em -/_

Também tentei modificar /usr/share/X11/xkb/symbols/se diretamente e tentei as seguintes alterações:

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

Mas tudo o que acontece é ' * ´ × ' * ' * (para normal, altgr, win e caps lock respectivamente). Eu também tentei

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

Mas assim que houver mais de quatro campos especificados, parece quebrar totalmente a chave, e a chave reverte para o comportamento padrão do pc105 (nós?).

Como não consegui encontrar nada no stackoverflow, superusuário ou google sobre como lidar com meu cenário, pergunto aqui.

Este é meuxmodmap -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)

Responder1

Dois anos depois, finalmente estou orgulhoso de responder à minha própria pergunta.

Descobri que o método mais fácil, confiável e extensível é confiar apenas no xmodmap.

1. Obtenha códigos de teclas especiais

Execute xevpara determinar o código das teclas que você deseja usar como alternadores de modo. Em seguida, pressione as teclas de seu interesse e anote okeycode

$ 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

O código-chave está na terceira linha, código-chave 66.

Para mim, estas eram as chaves nas quais eu estava particularmente interessado e seus códigos de chave correspondentes para mim:

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

2. Defina as teclas do switcher

Esta é a configuração que optei, mas você pode escolher sua própria configuração. Eu salvei isso em um arquivo $HOME/.xmodmap.

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

Dessa forma, vinculei Caps Locka Mode_switch, Pause Breaka Composee a Wintecla esquerda a Super_L. A Composechave é particularmente útil porque permite combinar duas chaves para a ligadura. Por exemplo, Composeseguido por Te Mresulta no sinal de marca registrada .

3. Obtenha as ligações atuais do mapa de teclado dexmodmap

Para não destruir o layout do meu teclado, eu queria manter minhas teclas o mais próximo possível do layout original. Para fazer isso, imprimi o mapa de teclado atual e procurei os códigos-chave que queria alterar.

$ xmodmap -pke | ag 'keycode  51' 

Claro, você pode usar grepou ack, com a mesma facilidade, dependendo da ferramenta que preferir usar.

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

A saída disso está no mesmo formato que você especificou assim ~/.xmodmap:

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

4. Faça backup do seu existentexmodmap

Caso algo dê errado, nunca é uma má ideia ter sua corrente xmodmapdisponível para voltar facilmente.

$ xmodmap -pke > ~/.xmodmap.bak

5. Adicione caracteres ao 2º, 3º e 4º nível de suas chaves

Pelo que entendi, o formato do .xmodmaparquivo é assim:

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

Agora, eu não entendo todos esses níveis, mas Mode_Switch( Caps Lockno meu caso) darei a você o nível 2 e Alt Grme dará o nível 3, e isso é praticamente tudo que me interessa, então deixei o resto da linha como estava no meu ~/.xmodmap.bake apenas alterei a 3ª, 4ª, 5ª e 6ª colunas (nível 2 e 3, mais shift) para caracteres válidos (Veja aqui uma 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. Teste seu.xmodmap

Agora vamos xmodmapexecutar .xmodmape testar seu novo layout de teclado.

$ xmodmap /home/user/.xmodmap

7. Certifique-se de que o layout do seu teclado esteja carregado no x init

Eu adicionei isso ao meu $HOME/.xinitrc:

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

Eu espero que isso tenha sido útil!

informação relacionada