Como mapear o caps lock para as teclas de seta?

5

Estou tentando mapear Caps Lock para a tecla de seta para baixo e Caps Lock com um modificador de deslocamento para a tecla de seta para cima.

Eu tentei usar o xmodmap com o seguinte arquivo de entrada:

remove Lock = Caps_Lock
keycode 66 = Down Up

Pressionar o Caps Lock funciona para enviar a tecla de seta para baixo, mas pressionar Caps Lock + Shift não envia para cima.

O que estou fazendo de errado?

    
por Jared Beach 28.01.2018 / 07:48

1 resposta

3

Haverá muito a detalhes técnicos para esta solução. Sinta-se à vontade para pular para a seção layout file se não se importar com o problema, mas apenas com a solução.

xmodmap

Movendo para cima e para baixo via CAPS e Shift + CAPS funciona no meu sistema com o dado .Xmodmap como esperado.

Você verifica se suas configurações estão realmente em efeito chamando

$ xmodmap -pk | grep ^\s*66
     66     0xffe5 (Caps_Lock)  0x0000 (NoSymbol)   0xffe5 (Caps_Lock)
$ setxkbmap -layout us && xmodmap ~/.Xmodmap
$ xmodmap -pk | grep ^\s*66
     66     0xff54 (Down)   0xff52 (Up)

o modificador LEVEL2

Existe outro problema (real) para a sua pergunta que vem a seguir:

O modificador LEVEL2 <SHIFT> que é ativado pressionando o botão Shift está lá para marcar visualmente os caracteres em um editor de texto ao se mover pelas linhas com as teclas de seta. Se você atribuir <UP> ao segundo nível de <CAPS> , o que você está efetivamente fazendo é pressionar Shift + . Você tem que desativar o modificador Shift apenas para esse cenário. Afaik você não pode fazer isso usando xmodmap.

redirecionando o modificador LEVEL2

A "maneira real" de modificar os principais mapas é com xkb . Eu encontrei a solução em uma antiga lista de discussão xorg . O LEVEL2 de Caps deve ser redirecionado para a chave ( <UP> ) (a tecla Up-Key tem apenas um nível). No X.org você pode desativar o modificador Shift durante o redirecionamento com a função interna RedirectKey(key=<UP>, clearmods=Shift) . clearmods "libera" o modificador Shift antes que a chave seja realmente "pressionada".

arquivo de layout

A maneira mais simples de ativar o comportamento é criar um novo arquivo de layout:

/ usr / share / X11 / xkb / símbolos / capslockarrow

default partial xkb_symbols "basic" {

    include "de(basic)"
    include "shift(both_capslock_cancel)"

    key <CAPS> {
        type[Group1] = "TWO_LEVEL",
        symbols[Group1] = [ Down, NoSymbol ],
        actions[Group1] = [ NoAction(), RedirectKey(key=<UP>, clearmods=Shift) ]
    };
 };

ativar o novo layout com

setxkbmap capslockarrow

Notas sobre o arquivo de layout

  • O novo arquivo de layout deriva de de(basic) . Esse é o layout do teclado alemão padrão . Você pode adicionar qualquer outro layout aqui, como us(basic) ou us(euro) . veja /usr/share/X11/xkb/symbols/ para ver o que é possível. O código de duas letras é o nome do arquivo e entre colchetes está a respectiva definição xkb_symbols do arquivo.

  • Você não teria mais um modificador de tecla caps. Portanto, eu adicionei um tipo de substituição para Caps : shift(both_capslock_cancel) Pressionando ambos LSHIFT e RSHIFT juntos, você pode ativar CAPS Lock e você libera o Lock novamente com qualquer outro pressionamento de uma tecla Shift .

  • Se alguém estiver se perguntando por que eu não usei uma nova definição de tipo para isso: eu simplesmente não consegui liberar o modificador Shift antes que a ação da Tecla Up fosse acionada. A liberação da tecla Shift deve ser possível explicitamente chamando preserve[Shift] = None em% spearatedxkb_types.

  • Como afirmado nos comentários abaixo, o Wayland também dependerá do XKB, mas não permitirá redirecionamentos.

por ukos 04.02.2018 / 00:16