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)" };
};

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) ...


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.


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

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


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)


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.