Use setxkbmap para trocar o Shift esquerdo e o controle esquerdo

17

É possível trocar as teclas Esquerda Shifte Esquerda CTRLusando em setxkbmapvez de xmodmap?

EDITAR

Mudei para o Fcitx , que funciona muito melhor com meu layout de teclado e mapa de teclas personalizado do que o IBus em todos os aspectos. Eu recomendo.

dia
fonte

Respostas:

28

xmodmapé obsoleto; então, de fato, isso deve ser feito com as xkbferramentas.

A troca que você deseja parece não ser incluída por padrão com os arquivos X11; então você tem que escrever você mesmo.

A página http://madduck.net/docs/extending-xkb/ me ajudou a entender e encontrar uma maneira de fazê-lo.

Crie um arquivo ~/.xkb/keymap/mykbdonde você coloca a saída setxkbmap, será sua definição de teclado base; por exemplo:

setxkbmap -print > ~/.xkb/keymap/mykbd

em seguida, crie um arquivo de símbolos para definir sua troca de chaves, por exemplo, em ~/.xkb/symbols/myswap

coloque as seguintes linhas:

partial modifier_keys
xkb_symbols "swap_l_shift_ctrl" {
    replace key <LCTL>  { [ Shift_L ] };
    replace key <LFSH> { [ Control_L ] };
};

edite o ~/.xkb/keymap/mykbdarquivo e altere a xkb_symbolslinha para adicionar

+myswap(swap_l_shift_ctrl)

finalmente, você pode carregá-lo xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY(você não pode usar "~" para o -Iparâmetro). Provavelmente emitirá muitos avisos sobre símbolos indefinidos para algumas chaves raras, mas você pode ignorá-las (por exemplo, erro de redirecionamento para dave:) 2> /dev/null.

Se você deseja trocar facilmente entre um normal e o seu invertido, pressione Ctrl / Shift; basta criar em ~/.xkb/keymap/outro arquivo, sem a opção extra "myswap", e carregá-lo com xkbcomp. Você pode criar dois pequenos scripts para carregá-los.

Pablo Saratxaga
fonte
1
Obrigado. Funciona, mas pela primeira vez. O problema é que estou usando um mecanismo de entrada chamado IBus. Sempre que troquei o método de entrada e, em seguida, pressione novamente a tecla "Ctrl + Space", a tecla Shift esquerda e o controle esquerdo são retornados. Qualquer sugestão sobre como evitá-lo.
Dia
mmn, talvez o IBus faça algumas redefinições de teclado. tente xkbcomp $DISPLAY some.dumpdepois e antes de ligar para o IBus e faça uma comparação dos dois dumps (esses são a definição completa do teclado); você provavelmente verá diferenças.
Pablo Saratxaga 22/02
Hmm, como é chato. Alguma idéia para se livrar do problema? Observe que o comando setxkbmap -option caps:escapefunciona. O IBus lembrou as teclas trocadas Esc e Caps_Lock, mas isso não acontece com as teclas Shift esquerda e Controle esquerdo trocadas.
day
talvez o IBus leia o teclado quando lançado. Tente descarregar o IBus, alterar o teclado e carregá-lo novamente. Se persistir problemas, então uma pergunta específica IBus deve ser feita (e talvez relatar um bug; imho é, IBus deve detectar mudanças teclado e honrá-los)
Pablo Saratxaga
Oi. Alguém pode me dizer como eu usaria a mesma técnica para trocar a tecla Alt esquerda pela tecla Control esquerda? Tentei alterar o arquivo myswap para: parcial modifier_keys xkb_symbols "swap_l_shift_ctrl" {substituir chave <LCTL> {[Alt_L]}; substituir chave <LALT> {[Control_L]}; }; mas não funcionou. TIA !!!
Neil Girardi 29/03
3

Corri para alguns problemas de mapeamento LALTpara Control_Lusar a solução de Pablo , parece que você precisa definir as modifier_mapopções também.

Copiei um modelo de /usr/share/X11/xkb/symbols/altwin- procure xkb_symbols "ctrl_alt_win"- e modifiquei para definir as seguintes alterações:

  • Tecla LALT para Controlar **
  • Tecla LWIN para Alt
  • Tecla MENU para tecla Windows

O ~/.xkb/symbols/myswaparquivo final foi:

partial modifier_keys
xkb_symbols "swap" {
   key <MENU> {     [   Super_L     ]   };
   key <LALT> { [ Control_L, Control_L  ] };
   key <RALT> { type[Group1] = "TWO_LEVEL",
                symbols[Group1] = [ Alt_R, Meta_R ] };
   key <LWIN> { [ Alt_L, Meta_L ] };
   key <LCTL> { [ Control_L ] };
   key <RCTL> { [ Control_R ] };
   modifier_map Control { <LALT>, <LCTL>, <RCTL> };
   modifier_map Mod1 { <LWIN>, <RALT> };
   modifier_map Mod4 { <MENU> };
};

Também adicionei -w0ao xkbcompcomando para evitar qualquer saída de aviso ao abrir um novo shell.

xkbcomp -w0 -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY

** Alternando muito entre Mac e Linux, eu gosto de ter duas teclas de controle no Linux para aproximar o teclado do Mac da minha memória muscular.

Jo-el
fonte