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.

Andrzej
źródło
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
Mars
źródło
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

jasonwryan
źródło
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.

Pablo Saratxaga
źródło
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
Pepa
źródło
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.

nikospag
źródło
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
oLen
źródło
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

fikovnik
źródło
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

Pływ
źródło
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).

l0b0
źródło
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.

Qeole
źródło
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
Alberto Salvia Novella
źródło
-1

Możesz użyć:

setxkbmap -print | grep xkb_symbols
nozimica
źródło
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