Jak uzyskać aktualny układ klawiatury?


61

Zastanawiam się, czy istnieje narzędzie wiersza polecenia, które zwraca bieżący układ klawiatury.

Mam XkbLayoutustawiony us, ru.

Aktualizacja: setxkbmap zwraca ustawienia układu, a nie wybrany układ. Na przykład:

$ setxkbmap -print | grep xkb_symbols
xkb_symbols   { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)"   };

Zwróci ten sam wynik bez względu na obecny układ.


Nie jestem dobry w D-Bus, ale myślę, że powinno być łatwo śledzić obecny układ klawiatury za jego pomocą. Chociaż może nie być w stanie tego zrobić, jeśli nie ma aktywnego przełącznika.
Benjamin

Odpowiedzi:


31

Może to zależy od wersji, ale na moim komputerze, który używa setxkbmap1.3.0, działa następująca komenda:

setxkbmap -query | grep layout

Zauważ, że w zależności od potrzeb znajomość tylko układu może być bezużyteczna: na przykład wariant Dvoraka w amerykańskim układzie jest zupełnie inny niż domyślny QWERTY. -queryOpcja setxkbmapdaje zarówno układ i wariant, jako różnych dziedzin:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle

3
-queryzostał dodany w setxkbmap 1.2.0
alanc

Bieżące układy i warianty oraz wiele dodatkowych informacji można uzyskać za pomocąsetxkbmap -print -verbose 10
erik

Aby to ustawić, na przykład oba układy cz i nas, ten ostatni z wariantem dvorak (dla 104-klawiszowej klawiatury), użyjsetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

Dzięki, pracuję
Indacochea Wachín

19

Istnieje przełącznik xkb, który jest opisany w następujący sposób:

xkb-switch to program w C ++, który pozwala wyszukiwać i zmieniać stan układu XKB.

https://github.com/ierton/xkb-switch

Lub, zgodnie z sugestią nozimicy, możesz użyć:

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

Z tego wątku na tablicach Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406


1
Dzięki, xkb-switchdziała dobrze, ale mam nadzieję, że było bardziej przenośne rozwiązanie
Andrew

1
@Andrew: tak, to trochę dziwne, nie ma prostego sposobu na uzyskanie bieżącego układu.
Benjamin,

7
Twój setxkbmapukład nie pokazuje aktualnie aktywnego układu, gdy zdefiniowano więcej niż jeden układ.
terdon

13

Tak, istnieje narzędzie wiersza polecenia, które robi to, co chcesz! Właśnie to odkryłem 10 minut temu :)

Spójrz tutaj: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

robi dokładnie to, co chcesz (nie wyświetla końca linii, więc dodaj, ; echojeśli potrzebujesz). uruchom narzędzie bez parametrów pomocy.


11

Użyj tego, aby uzyskać kod dla bieżącego układu:

$(xset -q|grep LED| awk '{ print $10 }')

Może to wymagać konwersji do odpowiedniego formularza, takiego jak:

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac

3
Rozumiem, 00000002chociaż mój układ to „USA Dvorak international”. Język to za mało ...
l0b0

4
Nie pomaga, jeśli są trzy lub więcej układów. Drugi i trzeci układ dają taką samą wartość 00001004na moim komputerze.
sastanin,

problem: przełącz swój numlock i ponownie uruchom to polecenie;)
andras.tim

To nie zadziała niezawodnie - musisz użyć maski, ponieważ dioda LED wskazuje również stan przycisków diodowych klawiatury.
fikovnik

9

Innym prostszym podejściem ze względu na stałe pozycje danych wyjściowych xset -qpolecenia jest:

xset -q | grep -A 0 'LED' | cut -c59-67

Drukuje się 00000002lub w 00001002zależności od bieżącego układu klawiatury.


Podoba mi się ten, myślę, że można go zawęzić do 8 znaków. c59-66.
xlembouras

8

W nowszych systemach możesz użyć

localectl status

Na przykład pokaże Ci:

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

3

Dotychczasowe odpowiedzi nie działały dla mnie. Używam setkbmapz dwoma układami angielskim i czeskim, więc każdy -printlub -queryzawsze zwróci dwa. Grepowanie statusu diody LED xset -qrównież nie działa, ponieważ pokazuje status wszystkich diod LED klawiatury.

Najlepsze do tej pory było szybkie napisanie tego małego narzędzia: https://gist.github.com/fikovnik/ef428e82a26774280c4fdf8f96ce8eeb

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <X11/XKBlib.h>
#include <X11/extensions/XKBrules.h>

int main(int argc, char **argv) {
  Display *dpy = XOpenDisplay(NULL);

  if (dpy == NULL) {
    fprintf(stderr, "Cannot open display\n");
    exit(1);
  }

  XkbStateRec state;
  XkbGetState(dpy, XkbUseCoreKbd, &state);

  XkbDescPtr desc = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
  char *group = XGetAtomName(dpy, desc->names->groups[state.group]);
  printf("Full name: %s\n", group);

  XkbRF_VarDefsRec vd;
  XkbRF_GetNamesProp(dpy, NULL, &vd);

  char *tok = strtok(vd.layout, ",");

  for (int i = 0; i < state.group; i++) {
    tok = strtok(NULL, ",");
    if (tok == NULL) {
      return 1;
    }
  }

  printf("Layout name: %s\n", tok);

  return 0;
}

i skompiluj za pomocą

gcc -I/usr/include getxkblayout.c -lX11 -lxkbfile


3

Możesz użyć xkbprintdo wydrukowania bieżącego układu.

Na przykład, aby wydrukować bieżący układ jako plik PDF

xkbprint -color "${DISPLAY}" - |\
    ps2pdf - > current_keyboard_layout.pdf

który produkuje:

wynik xkbprint


2

Od Goosfrabaa na forach Arch Linux :

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

Działa to tutaj poprawnie i drukuje us(dvorak-intl)(wyświetlane jako „USA Dvorak international” w menu wyboru klawiatury GNOME).


7
Drukuje tylko pierwszy układ na liście, a nie bieżący.
sastanin,

Jak mogę wykryć mapę klawiszy, kiedy używam przełączania języka przez setxkbmap? $ setxkbmap -v>> Trying to build keymap using the following components: | keycodes: evdev+aliases(qwerty) | types: complete | compat: complete+ledscroll(group_lock) | symbols: pc+us+hu:2+inet(evdev)+group(alt_shift_toggle)+compose(rwin)+terminate(ctrl_alt_bksp) | geometry: pc(pc105)w tym przypadku dostaję za każdym razem „nas”
andras.tim

0

Częściowa odpowiedź: w KDE można pozornie uzyskać bieżący układ klawiatury za pomocą qdbuspolecenia:

$ qdbus org.kde.keyboard /Layouts getCurrentLayout
gb(intl)

Mam skonfigurowanych kilka układów, ale pokazuje tylko ten, który jest aktualnie używany.

Testowane na Kubuntu 18.04 (qdbus wersja 4.8.7). Mogą istnieć inne rozwiązania oparte na magistrali D dla środowisk innych niż Qt, ale nie wiem o nich.


0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


keyboardLayout () {
    layout=$(variableInFile "KEYMAP" "/etc/vconsole.conf")
    echo ${layout}
}


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


keyboardLayout

-1

Możesz użyć:

setxkbmap -print | grep xkb_symbols

5
zwraca ogólne ustawienia klawiatury, a nie bieżący układ (us lub ru)
Andrew

Wykonaj to dobrze, jak stwierdza @jasonwryan, jeśli dokładnie przeanalizujesz tę linię, w niej znajduje się twój układ. W moim przypadku tak jest latam.
nozimica

5
wersja jasonwryan po prostu wyświetla część ciągu po „+”, xkb_symbolswartość nie zależy od wybranego układu, zawsze otrzymuję „nas”
Andrew
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.