Isso pode ser mais fácil de fazer com o xmodmap. Coloque o seguinte em seu .xsession ou .xinitrc:
xmodmap -e "keysym Caps_Lock = Hyper_L"
Você também precisará garantir que Hyper_L seja atribuído a um mapa de modificadores não compartilhado com outras chaves, caso contrário, pode gerar o modificador para essas chaves (ou essas chaves podem se tornar Hyper). Execute xmodmap
sem parâmetros (sua saída pode ser diferente):
> xmodmap
xmodmap: up to 3 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x25), Control_L (0x42), 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 (0x4e)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
Neste exemplo, Hyper_L é atribuído ao mesmo modificador que as chaves Super e, portanto, é tratado como uma chave Super. Estes comandos irão removê-lo do mod4 e colocá-lo no mapa modificador vazio do mod3:
xmodmap -e "remove Mod4 = Hyper_L" -e "add Mod3 = Hyper_L"
Se o Hyper_L não aparecer na listagem do mapa de modificadores, o comando remove pode não ser necessário.
A possibilidade de mapeamento do modificador é devido a como o X11 se comunica se um modificador está inativo. Ele envia um campo de bits de um byte, cada bit correspondendo a um dos mapas modificadores, em vez de enviar "Hyper" ou "Super". As aplicações precisam ir e olhar o mapa de modificadores e descobrir o que um bit em particular realmente significava. Se você tiver, por exemplo Ambas as chaves Super e Hyper designadas para mod4, um aplicativo não tem como saber se Super ou Hyper (ou ambos) está sendo pressionado.