Jak uzyskać aktualny układ klawiatury gnome z terminala?

15

Aby użyć skryptu bash, muszę uzyskać układ klawiatury gnome, z którego aktualnie korzysta użytkownik. Na przykład, jeśli użytkownik ustawi układ klawiatury na en-us, potrzebuję polecenia bash, które mi to wydrukuje.

Jak mogę uzyskać te informacje?

Aktualizacja:

setxkbmap -queryniestety nie działa. Poniżej znajduje się wyjście z aktywowanym układem en(pierwsze polecenie) i de(drugie polecenie). Wygląda na to, że zmiana układu klawiatury ma pewien związek z konfiguracją sesji 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

Aktualizacja 2:

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
źródło
Niestety nie jest to bash, ale przy użyciu libxklavier, oto [przykład python] [1] do zrobienia tego, o co prosisz: [1]: cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
balony
1
<rant> xkb to nieudokumentowane piekło! Te liczne definicje układu nie działają niezawodnie; dla mnie nagle zmieniały się one losowo i po zawieszeniu losowo ustalano, który ze zdefiniowanych układów obowiązuje, a co gorsza - niezależnie dla każdej podłączonej klawiatury. Tak, xkb jest w stanie mieć różne układy dla różnych klawiatur, ale o ile mi wiadomo, nie jest to nigdzie udokumentowane i dlatego jedyne, co robi ta funkcja, to irytuje nas, ponieważ nie możemy tego kontrolować. xkb, serio, nie zaczynaj mnie! </rant>
Christian

Odpowiedzi:

9

Zgodnie z podobnym pytaniem na Stackoverflow , następujące czynności powinny załatwić sprawę :

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

Nie mogłem tego zweryfikować, ponieważ obecnie nie mam dostępnej maszyny * nix z X (nie ma mnie w domu) ...

Izzy
źródło
1
Uruchomienie setxkbmap -print zwraca następujące. Nie sądzę, żeby to pomogł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)" }; };
balony
Czy obecnie masz aktywny układ „my”? To właśnie powyższe stwierdzenie, biorąc pod uwagę twój wkład, dałoby jako wynik (tylko te dwie litery: „nas”). Jak to wygląda po przejściu na inny układ?
Izzy
2
Dzięki za odpowiedź. Niestety, to nie działa. Za każdym razem dostaję nas. Zredagowałem moje pytanie, aby pokazać ci wyjście.
ftiaronsem,
było warto spróbować. Możesz spróbować podać -vparametr (wiele razy), co zwiększa gadatliwość, a tym samym daje więcej informacji. Powinien działać zarówno dla, -queryjak i dla -print. Ponieważ nie mam konfiguracji wielopoziomowej, nie jestem w stanie stwierdzić, czy zapewnia ona potrzebne szczegóły - ale z 3-krotnym -vwyjściem jest podzielony na „zastosowane reguły” i „mapę klawiszy”. Ta ostatnia wydaje się być kompletną informacją, więc pierwsza część może mieć „część aktualnie aktywną”.
Izzy
jeszcze raz dziękuję, ale niestety to też nie wyszło. Ten sam wynik przed i po zmianie układu. Niezależnie od gadatliwości.
ftiaronsem,
4

W systemie Ubuntu 17.10 lub nowszym

W Ubuntu 17.10, w GNOME, bieżąca wartość ustawień nie zmienia się po zmianie źródła wejściowego. Zamiast tego jest MRU-źródła klucz, który wymienia m ost r ecently u sed źródeł wejściowych.

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

Pierwszym źródłem na tej liście jest bieżące, więc oneliner, który uzyska aktualny układ, może wyglądać następująco:

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

Pamiętaj, że ta odpowiedź nie ma zastosowania, jeśli korzystasz z Unity w systemie Ubuntu 17.10. Dzięki Unity działa tak jak poprzednio.

Gunnar Hjalmarsson
źródło
3

Dla Ubuntu 13.04 i niższych

Możesz użyć xkblayout-statenarzędzia. Zobacz plik README.md dla opisu, kompilacji, instalacji i użytkowania.

Następujące polecenie zrobi dokładnie to, co chcesz:

xkblayout-state print "%s"

Dla Ubuntu 13.10 i nowszych

Ubuntu 13.10 przyniósł kilka dobrych ulepszeń w tym sensie i możesz użyć następującej prostej funkcji 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 }'
}

Następujące polecenia działają również w 13.10:

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

lub:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'
Radu Rădeanu
źródło
2

Wystarczy nacisnąć Ctrl+ Alt+ Tna klawiaturze, aby otworzyć Terminal. Po otwarciu uruchom poniższe polecenie.

setxkbmap -query

To powinieneś zobaczyć

wprowadź opis zdjęcia tutaj

Mitch
źródło
dziękuję za szybką odpowiedź, niestety to nie działa. Oto wyjście (pierwszy raz z układem en, drugi z de):
ftiaronsem
z powodu formatowania wklejonego jako edycja pytania ...
ftiaronsem
1
jeszcze raz dziękuję za szybką odpowiedź. To jest inded, co widzę, ale nie mówi mi, czy wybrałem układ niemiecki czy amerykański. A może coś przeoczyłem?
ftiaronsem
2

Korzystając z terminala, przeprowadziłem test zmieniający się między „pt” i „nas”, a po każdej zmianie zbierałem układ klawiatury używany z powodzeniem:

Uzyskaj aktywny układ klawiatury

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • Wydrukuj konfigurację: setxkbmap -print
  • Zbierz linię, która ma znaczenie: grep xkb_symbols
  • pobiera ciąg po pierwszym znaku „+”: awk -F"+" '{print $2}'

Dane wyjściowe z aktywnym układem „us” to: us


Przełączaj między układami

sudo setxkbmap -option grp:alt_shift_toggle pt

Podaj, gdzie brzmi „pt”, kod języka, na który chcesz się przełączyć.

wprowadź opis zdjęcia tutaj

Uwaga: używam Gnome na Ubuntu 12.04 (Precise Pangolin)

Zuul
źródło
Dzięki za odpowiedź. Problem polega na tym, że użytkownicy zwykle przełączają się między układami za pomocą apletu paska zadań. Działa, jeśli zmieniasz układ z cmd, ale nie działa, jeśli użytkownik przełącza się za pomocą apletu paska zadań.
ftiaronsem,
@ftiaronsem, nie wspominałeś wcześniej o tej części :) Zajmę się tym i zaktualizuję swoją odpowiedź, jeśli to możliwe!
Zuul
0

W systemie Ubuntu 13.10 lub nowszym

(Nie jestem pewien, czy działa w poprzednich wersjach)

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"

Aby zobaczyć więcej opcji:

gsettings list-recursively org.gnome.desktop.input-sources
user.dz
źródło