Como obter o layout atual do teclado gnome do terminal?

13

Para uso em um script bash, preciso obter o layout do teclado gnome que o usuário está usando no momento. Por exemplo, se o usuário definir seu layout de teclado en-us, preciso de um comando bash que me imprima isso.

Como posso obter essa informação?

Atualizar:

setxkbmap -queryinfelizmente não está funcionando. Abaixo está a saída com o layout en(primeiro comando) e de(segundo comando) ativado. Mudar o layout do teclado parece ter alguma relação com a configuração da sessão do gnome

setxkbmap -query 
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

setxkbmap -query
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

Update2:

setxkbmap -print #with en-us layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};
setxkbmap -print #after switching to german layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};
ftiaronsem
fonte
Infelizmente não é bash, mas usando libxklavier, aqui está um [exemplo de python] [1] para fazer o que você está perguntando: [1]: cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
balloons
1
<rant> xkb é um inferno sem documentos! Essas múltiplas definições de layout não funcionam de maneira confiável; para mim, eles mudaram repentinamente em momentos aleatórios e, após a suspensão, foi determinado aleatoriamente qual dos layouts definidos estava em vigor e - o que é pior - independentemente para cada teclado conectado. Sim, o xkb é realmente capaz de ter layouts diferentes para teclados diferentes, mas isso não está documentado em nenhum lugar até onde eu sei e, portanto, a única coisa que esse recurso faz é nos incomodar porque não podemos controlá-lo. xkb, sério, não me faça começar </ discurso>!
Christian

Respostas:

9

De acordo com uma pergunta semelhante no Stackoverflow , o seguinte deve fazer o truque:

setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'

Não consegui verificar, pois atualmente não tenho uma máquina * nix com o X disponível (não estou em casa) ...

Izzy
fonte
1
A execução de setxkbmap -print retorna o seguinte. Eu não acho que isso ajude o OP. xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)" }; xkb_geometry { include "pc(pc105)" }; };
Balões #
Então você tem o layout "nós" ativo? Isso é o que a declaração acima, dada a sua entrada, produziria como saída (apenas essas duas letras: "nós"). Como fica quando você muda para um layout diferente?
Izzy
2
Obrigado pela sua resposta. Infelizmente isso não está funcionando. Ambas as vezes eu nos pego. Eu editei minha pergunta para mostrar a saída.
ftiaronsem
valeu a pena tentar. Você pode tentar especificar o -vparâmetro (várias vezes), o que aumenta a verbosidade e, portanto, fornece mais informações. Deve funcionar para ambos, -querybem como -print. Como não tenho configuração de vários idiomas, não sei dizer se ele fornece os detalhes necessários - mas com três vezes a -vsaída aqui é dividida em "regras aplicadas" e "mapa de teclas". A última parece ser a informação completa; portanto, a primeira parte pode ter a "parte atualmente ativa".
Izzy
obrigado novamente, mas infelizmente isso também não deu certo. A mesma saída antes e depois da alteração do layout. Independentemente da verbosidade.
ftiaronsem
4

Para Ubuntu 17.10 ou posterior

No Ubuntu 17.10, com o GNOME, o valor atual de gsettings não é alterado quando você alterna a fonte de entrada. Em vez disso existe um mru-fontes chave que lista o m ais r ecentemente u sed fontes de entrada.

$ gsettings get org.gnome.desktop.input-sources mru-sources
[('xkb', 'se'), ('xkb', 'us')]

A primeira fonte dessa lista é a atual, portanto, um oneliner para obter o layout atual pode ser assim:

gsettings get org.gnome.desktop.input-sources mru-sources | sed -r "s/\S*\s'([^']+).*/\1/"

Observe que esta resposta não se aplica se você usar o Unity em um sistema Ubuntu 17.10. Com o Unity, ele continua trabalhando como anteriormente.

Gunnar Hjalmarsson
fonte
3

Para o Ubuntu 13.04 e inferior

Você pode usar a xkblayout-stateferramenta. Veja o arquivo README.md para descrição, compilação, instalação e uso.

O comando a seguir fará exatamente o que você deseja:

xkblayout-state print "%s"

Para Ubuntu 13.10 e superior

O Ubuntu 13.10 veio com algumas boas melhorias nesse sentido, e você pode usar a seguinte função simples do bash:

get_current_xkblayout () {
      current_input_nr=$(gsettings get org.gnome.desktop.input-sources current | \
          awk '{ print $NF }')
      shift=$(( 2 * ( $current_input_nr + 1 )))
      gsettings get org.gnome.desktop.input-sources sources | tr -d "\',[]()" | \
          awk -v cur="$shift" '{ print $cur }'
}

Os seguintes comandos também funcionam na 13.10:

setxkbmap -query | awk -F"(,|[ ]+)" '/layout:/ { print $2 }'

ou:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'
Radu Rădeanu
fonte
2

Basta pressionar Ctrl+ Alt+ Tno teclado para abrir o Terminal. Quando abrir, execute o comando abaixo.

setxkbmap -query

Isto é o que você deve ver

insira a descrição da imagem aqui

Mitch
fonte
obrigado pela sua pronta resposta, infelizmente isso não está funcionando. Aqui está a saída (primeira vez com en layout, segunda com de):
ftiaronsem
devido a formatação colado como questão editar ...
ftiaronsem
1
obrigado novamente por sua pronta resposta. Isso é inded o que estou vendo, mas não me diz se selecionei o layout alemão ou americano. Ou eu perdi alguma coisa?
ftiaronsem
2

Usando o terminal, executei um teste alterando entre 'pt' e 'us' e, após cada alteração, coletei o layout do teclado sendo usado com êxito:

Obtenha o layout de teclado ativo

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • Imprima a configuração: setxkbmap -print
  • Colete a linha que importa: grep xkb_symbols
  • obtém a string após o primeiro sinal "+": awk -F"+" '{print $2}'

A saída com o layout 'us' ativo é: us


Swith entre layouts

sudo setxkbmap -option grp:alt_shift_toggle pt

Passe para onde está escrito 'pt', o código do idioma para o qual alternar.

insira a descrição da imagem aqui

Nota: Estou usando o Gnome no Ubuntu 12.04 (Precise Pangolin)

Zuul
fonte
Obrigado pela sua resposta. O problema parece ser que os usuários tendem a alternar entre layouts usando o applet da barra de tarefas. Funciona se alguém estiver alternando o layout do cmd, mas não funcionar, se o usuário alternar com o miniaplicativo da barra de tarefas.
ftiaronsem
@ftiaronsem, você não mencionou essa parte antes :) Vou dar uma olhada nela e atualizar minha resposta, se possível!
Zuul
0

Para Ubuntu 13.10 ou posterior

(Não tenho certeza se funciona em versões anteriores)

current_layout=gsettings get org.gnome.desktop.input-sources current | awk '{print $2}'
gsettings get org.gnome.desktop.input-sources sources | grep -Po "'[[:alpha:]]+'\)" | sed -ne "s/['|)]//g;$(($current_layout+1))p"

Para ver mais opções:

gsettings list-recursively org.gnome.desktop.input-sources
user.dz
fonte