Wie erhalte ich das aktuelle Tastaturlayout für Gnome vom Terminal?

13

Für die Verwendung in einem Bash-Skript muss das Gnome-Tastaturlayout angegeben werden, das der Benutzer derzeit verwendet. Wenn der Benutzer beispielsweise das Tastaturlayout auf festlegt en-us, benötige ich einen Bash-Befehl, der mir diesen ausgibt.

Wie kann ich diese Informationen erhalten?

Aktualisieren:

setxkbmap -queryfunktioniert leider nicht. Unten ist die Ausgabe mit aktiviertem Layout en(erster Befehl) und de(zweiter Befehl). Das Umschalten des Tastaturlayouts scheint in gewissem Zusammenhang mit der Konfiguration der Gnome-Sitzung zu stehen

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
quelle
Leider ist es keine Bash, aber mit libxklavier, hier ist ein [Python-Beispiel] [1], um zu tun, was Sie fragen: [1]: cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
balloons
1
<rant> xkb ist eine undokumentierte Hölle! Diese mehreren Layoutdefinitionen funktionieren nicht zuverlässig. Für mich wechselten sie plötzlich zu zufälligen Zeiten und nach dem Anhalten wurde zufällig bestimmt, welches der definierten Layouts wirksam war und - was noch schlimmer ist - unabhängig für jede angeschlossene Tastatur. Ja, xkb kann tatsächlich verschiedene Layouts für verschiedene Tastaturen haben, aber soweit ich weiß, ist dies nirgends dokumentiert, und daher nervt uns diese Funktion nur, weil wir sie nicht steuern können. xkb, im Ernst, fang nicht an! </ rant>
Christian

Antworten:

9

Entsprechend einer ähnlichen Frage zu Stackoverflow sollte Folgendes ausreichen :

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

Ich konnte es nicht verifizieren, da ich momentan keinen * nix-Rechner mit X zur Verfügung habe (ich bin nicht zu Hause) ...

Izzy
quelle
1
Das Ausführen von setxkbmap -print gibt Folgendes zurück. Ich denke nicht, dass dies dem OP hilft. 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)" }; };
Ballons
Sie haben also gerade "uns" Layout aktiv? Dies ist, was die obige Aussage angesichts Ihrer Eingabe als Ausgabe erzeugen würde (nur diese beiden Buchstaben: "uns"). Wie sieht es aus, wenn Sie zu einem anderen Layout wechseln?
Izzy
2
Danke für deine Antwort. Leider ist dies nicht der Trick. Beide Male bekomme ich uns. Ich habe meine Frage bearbeitet, um Ihnen die Ausgabe zu zeigen.
FTIARONSEM
war einen Versuch wert. Sie können versuchen, den -vParameter (mehrmals) anzugeben , wodurch die Ausführlichkeit erhöht und somit mehr Informationen bereitgestellt werden. Sollte sowohl für -queryals auch für funktionieren -print. Da ich kein Multilang-Setup habe, kann ich nicht sagen, ob es die Details liefert, die Sie benötigen - aber bei -vdreifacher Ausgabe ist hier die Aufteilung in "Angewandte Regeln" und "Keymap". Letzteres scheint die vollständige Information zu sein, so dass der erste Teil den "derzeit aktiven Teil" haben könnte.
Izzy
Nochmals vielen Dank, aber leider hat dies auch nicht geklappt. Gleiche Ausgabe vor und nach dem Layoutwechsel. Unabhängig von der Ausführlichkeit.
FTIARONSEM
4

Für Ubuntu 17.10 oder höher

In Ubuntu 17.10 mit GNOME wird der aktuelle gsettings-Wert nicht geändert, wenn Sie die Eingabequelle wechseln. Stattdessen gibt es eine MRU-Quellen - Taste , die die Listen m ost r ecently u Eingangsquellen Sed.

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

Die erste Quelle in dieser Liste ist die aktuelle, sodass ein Oneliner zum Abrufen des aktuellen Layouts folgendermaßen aussehen kann:

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

Bitte beachten Sie, dass diese Antwort nicht gilt, wenn Sie Unity auf einem Ubuntu 17.10-System verwenden. Mit Unity funktioniert es weiter wie bisher.

Gunnar Hjalmarsson
quelle
3

Für Ubuntu 13.04 und niedriger

Sie können xkblayout-stateWerkzeug verwenden. Siehe README.md Datei für die Beschreibung, Erstellung, Installation und Nutzung.

Der folgende Befehl macht genau das, was Sie wollen:

xkblayout-state print "%s"

Für Ubuntu 13.10 und höher

Ubuntu 13.10 brachte in diesem Sinne einige gute Verbesserungen mit sich, und Sie können die folgende einfache Bash-Funktion verwenden:

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 }'
}

Die folgenden Befehle funktionieren auch in 13.10:

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

oder:

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

Drücken Sie einfach Ctrl+ Alt+ Tauf Ihrer Tastatur, um das Terminal zu öffnen. Führen Sie beim Öffnen den folgenden Befehl aus.

setxkbmap -query

Das sollten Sie sehen

Bildbeschreibung hier eingeben

Mitch
quelle
Vielen Dank für Ihre schnelle Antwort, leider funktioniert dies nicht. Hier ist die Ausgabe (zum ersten Mal mit en Layout, zum zweiten Mal mit de):
ftiaronsem
aufgrund der Formatierung als Frage bearbeitet eingefügt ...
ftiaronsem
1
Nochmals vielen Dank für Ihre schnelle Antwort. Dies ist indiziert was ich sehe, aber es sagt mir nicht, ob ich das deutsche oder das amerikanische Layout gewählt habe. Oder habe ich etwas verpasst?
FTIARONSEM
2

Mit dem Terminal habe ich einen Test durchgeführt, bei dem zwischen 'pt' und 'us' gewechselt wurde, und nach jeder Änderung habe ich das erfolgreich verwendete Tastaturlayout gesammelt:

Holen Sie sich das aktive Tastaturlayout

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • Drucken Sie die Konfiguration aus: setxkbmap -print
  • Sammeln Sie die Linie, die zählt: grep xkb_symbols
  • Ruft den String nach dem ersten "+" ab: awk -F"+" '{print $2}'

Die Ausgabe mit aktivem 'us'-Layout ist: us


Wechseln Sie zwischen den Layouts

sudo setxkbmap -option grp:alt_shift_toggle pt

Übergeben Sie die Stelle, an der "pt" steht, den Sprachcode, zu dem gewechselt werden soll.

Bildbeschreibung hier eingeben

Hinweis: Ich benutze Gnome unter Ubuntu 12.04 (Precise Pangolin)

Zuul
quelle
Danke für deine Antwort. Das Problem scheint zu sein, dass Benutzer dazu neigen, mithilfe des Taskleisten-Applets zwischen Layouts zu wechseln. Es funktioniert, wenn man das Layout von cmd wechselt, aber es funktioniert nicht, wenn der Benutzer mit dem Taskleisten-Applet wechselt.
FTIARONSEM
@ftiaronsem, Du hast diesen Teil noch nicht erwähnt :) Ich werde es mir ansehen und meine Antwort aktualisieren, wenn möglich!
Zuul
0

Für Ubuntu 13.10 oder höher

(Nicht sicher, ob es in früheren Versionen funktioniert)

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"

Um mehr Optionen zu sehen:

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