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.