Como posso mapear a tecla Shift esquerda e direita individualmente?

11

Primeiro, desculpe minha ignorância de X e XKB; Eu tenho tentado hackear uma solução na esperança de ser capaz de alcançar o que eu quero sem exigir uma compreensão detalhada disso.

Eu estou tentando criar um mapa de teclado XKB no Ubuntu 12.04 que me permite estipular qual das duas teclas shift constitui o modificador Level2. Especificamente, a chave 4 deve produzir apenas um $ quando o turno da direita é mantido, não a esquerda.

Minha leitura até agora:

Eu tentei definir um tipo personalizado e, em seguida, consultá-lo explicitamente em um mapa de símbolos:

/usr/share/X11/xkb/types/mbfisher :

default xkb_types "mbfisher" {
  type "RIGHT_SHIFT" {
    modifiers = None+Shift_R;
    map[None] = Level1;
    map[Shift_R] = Level2;
  };
}

/usr/share/X11/xkb/symbols/mbfisher :

default
partial alphanumeric_keys
xkb_symbols "basic" {

  name[Group1]= "mbfisher";

  key <AE04> {
    type= "RIGHT_SHIFT",
    symbols[Group1]= [ 4,  dollar ]
  };

};

Estou selecionando o mapa com a GUI de layout de teclado do Ubuntu.

Isso obviamente desativa o teclado alfanumérico além da tecla 4 , mas o sinal de cifrão ainda pode ser digitado com a tecla shift.

Estou consciente de escrever uma pergunta enorme com muitas informações inúteis, então vou parar por aqui; por favor, peça qualquer coisa que eu tenha perdido.

Alguma idéia?

    
por mbfisher 03.10.2012 / 10:11

2 respostas

3

Aqui está o que finalmente funcionou! Eu usei o arquivo xmodmap e um arquivo ~/.Xmodmap em vez da configuração xkb.

~/.Xmodmap :

clear Shift

! Key Shift+Key mode_switch+Key mode_switch+Shift+Key AltGr+Key AltGr+Shift+Key
! Key Shift_L+Key Shift_R+Key Shift_R+Shift_L+Key AltGr+Key AltGr+Shift_L+Key

keycode 10 = 1 1 exclam 1
keycode 11 = 2 2 at 2
keycode 12 = 3 3 numbersign 3
keycode 13 = 4 4 dollar 4
keycode 14 = 5 5 percent 5

keysym Shift_R = Mode_switch
add Shift = Shift_L

As duas linhas comentadas (com ! ) mostram os títulos das colunas antes e depois das minhas alterações. Isso permitiu que eu especificasse col 2 como Shift_L e col 3 como Shift_R, já que mapeei shift_R como Mode_switch.

As alterações são feitas executando:

 # setxkbmap us
 # xmodmap ~/.Xmodmap

setxkbmap us define o mapa padrão dos EUA para que você trabalhe em uma lista limpa e xmodmap anexa as alterações personalizadas a ele.

Quando implementado, os caracteres ! , @ , # , $ e % só podem ser digitados com a tecla shift direita e ^ , & , * , ( e ) só podem ser digitados com a tecla shift esquerda.

Agora posso continuar mapeando todas as teclas no lado esquerdo do teclado para apenas serem modificadas pela tecla shift direita (ou seja, os caracteres aplaônicos e suas modificações maiúsculas) e vice-versa; essa solução significa que eu só preciso remapear o lado esquerdo.

Outros links úteis encontrados ao longo do caminho:

Muito obrigado ao @Trudbert por ter me ajudado bastante na resposta!

    
por 25.10.2012 / 12:48
2

Eu não sei se é a solução que você quer, mas uma possibilidade de desabilitar a tecla shift esquerda seria usar o xmodmap. Crie um arquivo ~/.Xmodmap com conteúdo

clear shift
add shift = Shift_R

e execute xmodmap ~/.Xmodmap .

Veja comentários / chat:

Você pode ter problemas se houver outras modificações feitas no seu xkbmap por algum outro programa, então pode ser necessário redefinir um xkbmap padrão com algo como setxkbmap us .

Se você quiser que algumas teclas respondam a apenas uma tecla de deslocamento, você poderá obter o layout atual do teclado com xmodmap -pke > .Xmodmap . Isso dá a você .Xmodmap com uma Lista de todas as chaves na forma de keycode XX = functions . Nesta atribuição, cada código de tecla pode ter várias funções no lado direito. Cada um corresponde a um modificador diferente + dessa chave. Você pode então inserir o clear + add de cima e adicionar algo como add mod5 = Shift_L . A tecla shift direita corresponderia a mod2, enquanto a esquerda seria mod5. Você pode então continuar e mover as funções mod2 das teclas que deseja chamar com a tecla shift esquerda para mod5 simplesmente inserindo NoSymbol e espaços até chegar à coluna da direita ( keycode 57 = n N - > keycode 57 = n NoSymbol NoSymbol NoSymbol N ).

    
por 22.10.2012 / 15:15