Script para alternar setxkbmap


8

Eu gostaria de um script bash que alterna entre: setxkbmap see setxkbmap us.

Então, minhas intenções são mapear esse script CtrlEscatravés dos atalhos personalizados Teclado>.

O ponto é que eu quero mudar o layout do teclado CtrlEscape. Como posso implementar isso?


1
Qual DE você usa?
daisy

3
O XKB pode configurar uma tecla para alternar entre layouts. Isso não é algo que você gostaria de escrever, mas provavelmente existe uma configuração pré-preparada em algum lugar onde você só precisa selecionar qual par de layouts e qual combinação de teclas você prefere.
Gilles 'SO- stop be evil' em

Respostas:


3

Não sei qual ambiente de área de trabalho você está executando, como pode atribuir uma tecla de atalho pode variar, mas esse script funciona globalmente, pelo menos no meu Ubuntu 12.04 boxe Arch Linux:

#!/bin/bash

(setxkbmap -query | grep -q "layout:\s\+us") && setxkbmap se || setxkbmap us

Infelizmente, isso não funciona se você alterar o layout usando um método GUI. Pelo menos, não está na minha caixa do xfce. Funciona apenas se você usar setxkbmap para alternar layouts. A única maneira que eu descobri que sempre funciona consistentemente é analisando xmodmapcomo na minha resposta abaixo.
terdon

@terdon ele funciona pelo menos na minha caixa do Ubuntu 12.04, você já tentou isso no seu sistema?
daisy

Sim, acredite, passei muito tempo lidando com esse tipo de problema. Alterno regularmente entre três layouts de teclado (nos, fr, es) e entre dois teclados físicos, um com layout nos EUA e outro com espanhol. Se eu usar o applet no meu painel tint2 para alterar o layout do teclado, não haverá nenhuma diferença na saída de setxkbmap. O mesmo acontece se eu alternar layouts usando um atalho configurado através da keyboard shortcutsGUI no meu LMDE. setxkbmapsó muda quando eu troco de usá-lo.
terdon

Realmente limpo com uma solução de linha. Obrigado.
Fredrik

O que acabei fazendo foi salvar a linha em um arquivo .sh no meu diretório pessoal. Em seguida, mapeados para ./toggleLayout.sh ctrl-esc
Fredrik

4

Existem várias respostas para perguntas semelhantes . No entanto, nenhum deles funciona robusta para mim.

O script a seguir deve funcionar em todos os casos. Certamente funciona no meu sistema debian ao alternar layouts com setxkbmap:

#!/bin/bash
seven=`xmodmap -pke | grep "keycode  16" | awk '{print \$5}'` 
## If this is the "us" layout
if [ $seven == "ampersand" ]; then
    setxkbmap se
else
  setxkbmap us
fi

O script analisa a saída do xmodmap para ver se o layout atual é "us" ou "se". No layout "us", SHIFT+ 7é mapeado para "e comercial". Se você alternar apenas entre os layouts "us" e "se", ativar "e comercial" 7significa que você está usando o layout "us" e o script será alterado para "se". Se você não tiver "e comercial" ativado 7, o script mudará para "us".


4

a melhor maneira seria não usar um script, mas carregar um teclado de duas camadas (por exemplo :) setxmodmap "us,se"e redefinir o Ctrl- Escpara enviar ISO_Next_Group

Veja esta resposta no xkb para redefinir algumas chaves sem precisar editar os arquivos padrão principais (portanto, não precisa ser root). No arquivo de símbolos locais (por exemplo ~/.xkb/symbols/mysymbols:), coloque uma pequena seção como:

partial modifier_keys 
xkb_symbols "ctrl_esc_toggle" {
    key <ESC> {
        type[Group1]="PC_CONTROL_LEVEL2",
        symbols[Group1]= [ Escape,     ISO_Next_Group ]
    };
};

o PC_CONTROL_LEVEL2 informa que o símbolo sencond para essa chave é obtido com Control (em vez de Shift).

e no arquivo de mapa de chaves local (por exemplo :; ~/.xkb/keymap/mykbdvocê pode criá-lo com setxkbmap "us,se" ; setxkbmap -print > ~/.xkb/keymap/mykbd) altere a linha xkb_symbols para adicionar "mysymbols (ctr_esc_toggle)" para que você tenha algo como:

xkb_symbols   { include "pc+us+se:2+inet(evdev)+terminate(ctrl_alt_bksp)+compose(rwin)+mysymbols(ctr_esc_toggle)"   };

(observe o "se: 2", o ": 2" indica para carregar as definições de símbolos "se" como Grupo2; você pode empilhar vários grupos).

agora você pode carregá-lo com: xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY Ctrl-Esc alternará entre os layouts "us" e "se".

NOTA, no entanto, é necessário pressionar Ctrl (e segurar) antes de Esc; da outra maneira, não funciona (seria necessário definir um modificador virtual para o Escape, e não sei como fazê-lo)


1
Como seria leftwin+leftalt+space?
Hotschke 02/12/2015

@Hotschke, thanks{ include "pc+us+ru:2+inet(evdev)+group(win_space_toggle)" };
contributorpw
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.