Posso alterar o Caps Lock para Hyper / Additional Modifier?

5

No Arch Linux, eu tenho a função Caps Lock como um Ctrl alternativo: no console por meio de um mapa de teclas pessoal, e no X por meio de uma opção "kbd" em xorg.conf .

Eu já pesquisei um pouco sobre a mudança do Caps Lock para um modificador Hyper, e parecia que isso não era viável no console, mas há alguma maneira de fazer isso para o X?

Veja o que eu uso atualmente para o X:

Option "XkbOptions" "ctrl:nocaps"

Existe uma opção XkbOptions ou algo similar para fazer com que o Caps Lock atue como um modificador adicional?

Meu objetivo nisso é poder criar mais mapeamentos de teclas personalizados no Emacs com o novo modificador.

    
por mellowmaroon 21.09.2013 / 06:59

3 respostas

2

Enquanto as outras respostas usando xmodmap estão corretas, existe uma maneira muito mais fácil. Em vez de:

Option "XkbOptions" "ctrl:nocaps"

Use apenas:

Option "XkbOptions" "caps:hyper"

Você pode encontrar todas as opções em /usr/share/X11/xkb/rules/base.lst

    
por 29.08.2016 / 09:25
7

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.

    
por 21.09.2013 / 14:20
2

Isso funcionou para mim:

keycode 66 = BackSpace
remove Mod4 = Hyper_L
add Mod3 = Hyper_L
keycode 66 = Hyper_L
    
por 23.02.2015 / 22:07