Come ottenere l'attuale layout di tastiera gnome dal terminale?


14

Per l'utilizzo in uno script bash, ho bisogno di ottenere il layout di tastiera gnome che l'utente sta attualmente utilizzando. Ad esempio, se l'utente imposta il layout della tastiera su en-us, ho bisogno di un comando bash che mi stampa questo.

Come posso ottenere queste informazioni?

Aggiornare:

setxkbmap -querypurtroppo non funziona. Di seguito è riportato il risultato con il layout en(primo comando) e de(secondo comando) attivato. Il cambio di layout della tastiera sembra avere qualche relazione con la configurazione della sessione di 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)" };
};

Purtroppo non è bash, ma usando libxklavier, ecco un [esempio di pitone] [1] per fare ciò che stai
palloncini

1
<rant> xkb è un inferno senza documenti! Queste definizioni di layout multipli non funzionano in modo affidabile; per me sono cambiati improvvisamente in momenti casuali e dopo la sospensione è stato determinato casualmente quale dei layout definiti era attivo e - peggio ancora - indipendentemente per ogni tastiera collegata. Sì, xkb è in realtà in grado di avere layout diversi per tastiere diverse, ma questo non è documentato da nessuna parte per quanto ne so e quindi l'unica cosa che questa funzionalità fa è infastidirci perché non possiamo controllarlo. xkb, sul serio, non farmi iniziare! </rant>
Christian,

Risposte:


9

Secondo una domanda simile su StackOverflow , il seguente dovrebbe fare il trucco:

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

Non ho potuto verificarlo, poiché al momento non ho * nix machine con X disponibile (non sono a casa) ...


1
L'esecuzione di setxkbmap -print restituisce quanto segue. Non penso che questo aiuti l'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)" }; };
palloncini

Quindi attualmente hai il layout "noi" attivo? Questo è ciò che l'istruzione precedente, dato il tuo input, produrrebbe come output (solo quelle due lettere: "noi"). Come appare quando si passa a un layout diverso?
Izzy,

2
Grazie per la tua risposta. Sfortunatamente questo non sta facendo il trucco. Entrambe le volte ci capisco. Ho modificato la mia domanda per mostrarti l'output.
ftiaronsem,

valeva la pena provare. Potresti provare a specificare il -vparametro (più volte), che aumenta la verbosità e quindi fornisce più informazioni. Dovrebbe funzionare per entrambi, -querycosì come -print. Dato che non ho una configurazione multilang, non posso dire se fornisce i dettagli di cui hai bisogno, ma con 3 volte l' -voutput qui è diviso in "regole applicate" e "keymap". Quest'ultima sembra essere l'informazione completa, quindi la prima parte potrebbe avere la "parte attualmente attiva".
Izzy,

grazie ancora, ma purtroppo neanche questo ha funzionato. Lo stesso output prima e dopo la modifica del layout. Indipendentemente dalla verbosità.
ftiaronsem,

4

Per Ubuntu 17.10 o successive

In Ubuntu 17.10, con GNOME, il valore gsettings corrente non viene modificato quando si cambia sorgente di input. Invece c'è un MRU-sources chiave che elenca il m ost r ecently u sed sorgenti di ingresso.

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

La prima fonte in quella lista è quella attuale, quindi un oneliner per ottenere il layout attuale può apparire così:

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

Questa risposta non si applica se si utilizza Unity su un sistema Ubuntu 17.10. Con Unity continua a funzionare come in precedenza.


3

Per Ubuntu 13.04 e versioni precedenti

Puoi usare lo xkblayout-statestrumento. Vedere il file README.md per descrizione, compilazione, installazione e utilizzo.

Il seguente comando farà esattamente quello che vuoi:

xkblayout-state print "%s"

Per Ubuntu 13.10 e versioni successive

Ubuntu 13.10 è arrivato con alcuni buoni miglioramenti in questo senso e puoi usare la seguente semplice funzione 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 }'
}

I seguenti comandi funzionano anche in 13.10:

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

o:

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

2

Premi Ctrl+ Alt+ Tsulla tastiera per aprire Terminale. Quando si apre, esegui il comando seguente.

setxkbmap -query

Questo è ciò che dovresti vedere

inserisci qui la descrizione dell'immagine


grazie per la tua pronta risposta, purtroppo questo non funziona. Ecco l'uscita (prima volta con layout, seconda con de):
ftiaronsem

a causa della formattazione incollata come modifica della domanda ...
ftiaronsem

1
grazie ancora per la tua pronta risposta. Questo è ciò che vedo, ma non mi dice se ho selezionato il layout tedesco o americano. O ho perso qualcosa?
ftiaronsem,

2

Usando il terminale, ho eseguito un test cambiando tra 'pt' e 'us', e dopo ogni modifica, ho raccolto il layout della tastiera utilizzato con successo:

Ottieni il layout della tastiera attiva

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • Stampa la configurazione: setxkbmap -print
  • Raccogli la linea che conta: grep xkb_symbols
  • ottiene la stringa dopo il primo segno "+": awk -F"+" '{print $2}'

L'output con layout 'us' attivo è: us


Passa da un layout all'altro

sudo setxkbmap -option grp:alt_shift_toggle pt

Passa dove legge 'pt', il codice della lingua a cui passare.

inserisci qui la descrizione dell'immagine

Nota: sto usando Gnome su Ubuntu 12.04 (Precise Pangolin)


Grazie per la tua risposta. Il problema sembra essere che gli utenti tendono a passare da un layout all'altro usando l'applet della barra delle applicazioni. Funziona se si sta cambiando layout da cmd, ma non funziona, se l'utente passa con l'applet della barra delle applicazioni.
ftiaronsem,

@ftiaronsem, non hai mai menzionato quella parte prima :) Ci penserò e aggiornerò la mia risposta se possibile!
Zuul,

0

Per Ubuntu 13.10 o successivo

(Non sono sicuro che funzioni nelle versioni precedenti)

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"

Per vedere più opzioni:

gsettings list-recursively org.gnome.desktop.input-sources
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.