CapsLock como chave modificadora para mapas de teclado de aplicativos

11

Sou desenvolvedor e atualmente estou usando o Ubuntu Linux com PyCharm IDE para desenvolvimento de website. Para melhorar o desempenho da digitação, considere alterar o CapsLock para Hyper_L e atribuí-lo ao mod3 usando o xmodmap. Depois disso, quero mapear o mod3 da tecla 'i' para 'Up'. Até agora, o que eu fiz é:

xmodmap -e "keysym Caps_Lock = Hyper_L"

a saída é assim:

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

então eu removo o Hyper_L do mod4

xmodmap -e "remove Mod4 = Hyper_L"

Depois tentei atribuir Hyper_L ao mod3

xmodmap -e "add Mod3 = Hyper_L"

No entanto, recebi o erro da seguinte forma:

X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  118 (X_SetModifierMapping)
  Value in failed request:  0x17
  Serial number of failed request:  11
  Current serial number in output stream:  11

Então, qual foi o problema aqui? Como eu posso fazer isso funcionar? Minha abordagem está certa? Ou devo usar uma abordagem diferente para usar o mod3 para chaves personalizadas?

PS Estou usando o teclado Microsoft Natural Ergonomic 7000

Khamidulla
fonte

Respostas:

20

Há um bajilhão de respostas na internet, a maioria delas confusa.

A chave é que você precisa mapear 'keycode 66' para sua hiper-chave, remover o mapeamento dessa chave de outros mod {1,2,4,5} 's (somente se houver) e, em seguida, definir mod3.

Abra ~ / .Xmodmap e coloque o seguinte:

! Unmap capslock
clear Lock
keycode 66 = Hyper_L

! Leave mod4 as windows key _only_
remove mod4 = Hyper_L

! Set mod3 to capslock
add mod3 = Hyper_L

Rode isto

xmodmap ~/.Xmodmap

Se algo der errado, você pode redefinir seu teclado com:

setxkbmap -layout us

As causas prováveis ​​de algo explodir são que o Hyper_L é mapeado para outro lugar. Corrija isso executando o xmodmap sem args para descobrir o que mais está vinculado ao Hyper_L. Quando você souber o que precisa remover, solte um 'remove BINDING = Hyper_L' no seu arquivo .Xmodmap.

O arquivo .Xmodmap será carregado quando você abrir as sessões do X11. Esse mapeamento deverá ser implementado na próxima vez que você fizer login ou reinicializar.

Esta configuração funciona para a minha instalação do ubuntu 14.04. Se você tiver um * nix diferente e isso não funcionar, poste o que você fez para contornar isso aqui e eu o incorporarei na resposta.

heymatthew
fonte
@antindexer funcionou para você?
precisa saber é o seguinte
Tentei várias respostas, e essa foi a que funcionou para mim. Pelo menos, ele foi instalado em um linux bare metal. Estranhamente, ele falha no QEMU / KVM, trabalhando apenas em pressionamentos alternativos da tecla caps lock.
Diagon
0

Sei que essa pergunta é bastante antiga, mas preciso compartilhar minha solução, pois (frustrantemente) a resposta de heymantthew não funcionou para mim. O que acabou funcionando para mim:

setxkbmap -layout us -option lv3:caps_switch -variant intl

Isso habilitará o capslock como a tecla mod3, defina o layout como "us" e defina a variante como "intl". Se você usar um shell interativo como o fish, poderá pressionar tab após "-layout", "-option" ou "-variant" para obter uma lista completa dos possíveis parâmetros.

Antecedentes adicionais: tentei a abordagem xmodmap há um ano em uma máquina Ubuntu executando o gerenciador de janelas i3, alternando do ambiente padrão do gnome. Eu havia modificado o layout do teclado "nos" xkb, especificamente o internacional com chaves inoperantes - funcionou bem ao usar o gnome-desktop-manager (há uma opção para definir caps-lock como a tecla mod3), mas não consegui faça com que funcione com o xmodmap. Este foi o meu erro: eu pensei que a GUI do gdm estava usando o xmodmap para mapear o caps lock para o mod3, mas, na realidade, estava definindo essa opção X11. Agora que mudei para Arch, fui forçado a descobrir.

Eu recomendo a todos que planejam mexer com isso para ler as páginas de manual nos layouts localectl, xmodmap, setxkbmap e testing adicionando uma parte de suspensão e reversão:

setxkbmap ... ; sleep 10; setxkbmap <INSERT DEFAULT SETTINGS>

isso me salvou uma boa quantidade de tempo.

Ainda não entendo como a abordagem xmodmap não funciona, no entanto. Espero que isso ajude alguém.

Mark IO
fonte