Wie erhalte ich das aktuelle Tastaturlayout?

61

Ich frage mich, ob es ein Befehlszeilentool gibt, das das aktuelle Tastaturlayout zurückgibt.

Ich habe XkbLayouteingestellt us, ru.

Aktualisieren: setxkbmap Gibt die Layouteinstellungen zurück, nicht das ausgewählte Layout. Z.B:

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

Unabhängig vom aktuellen Layout wird dasselbe Ergebnis zurückgegeben.

Andrew
quelle
Ich bin nicht wirklich gut in D-Bus, aber ich denke, es sollte einfach sein, das aktuelle Tastaturlayout damit zu verfolgen. Dies ist jedoch möglicherweise nicht möglich, wenn kein Schalter aktiv ist.
Benjamin

Antworten:

31

Möglicherweise ist dies versionsabhängig, aber auf meinem Computer, der setxkbmap1.3.0 verwendet, funktioniert der folgende Befehl:

setxkbmap -query | grep layout

Beachten Sie, dass es je nach Bedarf unbrauchbar sein kann, nur das Layout zu kennen: Beispielsweise unterscheidet sich die Dvorak-Variante des US-Layouts erheblich von der Standard-QWERTY. Die -queryOption von setxkbmapgibt sowohl das Layout als auch die Variante als unterschiedliche Felder an:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle
Mars
quelle
3
-querywurde in setxkbmap 1.2.0
alanc am
Die aktuellen Layouts und Varianten sowie viele Zusatzinformationen erhalten Sie mitsetxkbmap -print -verbose 10
erik
Zum Einstellen der beiden Layouts cz und us, letzteres mit der Variante dvorak (für eine Tastatur mit 104 Tasten), verwenden Siesetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik
Vielen Dank, arbeiten
Indacochea Wachín
19

Es gibt einen xkb-Schalter, der folgendermaßen beschrieben wird:

xkb-switch ist ein C ++ - Programm, mit dem der XKB-Layoutstatus abgefragt und geändert werden kann.

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

Auf Vorschlag von nozimica können Sie auch Folgendes verwenden:

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

Aus diesem Thread auf den Arch Linux-Boards: https://bbs.archlinux.org/viewtopic.php?pid=539406

jasonwryan
quelle
1
Danke, xkb-switchfunktioniert gut, aber ich hoffe, dass es mehr tragbare Lösung gab
Andrew
1
@ Andrew: Ja, es ist seltsam, dass es keinen einfachen Weg gibt, das aktuelle Layout zu erhalten.
Benjamin
7
Sie setxkbmapzeigt nicht das aktuell aktive Layout , wenn mehr als ein Layout definiert ist.
Terdon
13

Ja, ES GIBT ein Befehlszeilentool, das macht, was Sie wollen! Ich habe es gerade vor 10 Minuten entdeckt :)

Schau mal hier: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

macht genau das, was Sie wollen (es gibt kein Zeilenende aus, also fügen ; echoSie es hinzu, wenn Sie es brauchen). Führen Sie das Tool ohne Parameter für die Hilfe aus.

Pablo Saratxaga
quelle
11

Verwenden Sie dies, um den Code für das aktuelle Layout abzurufen:

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

Dies muss möglicherweise in ein gewünschtes Formular konvertiert werden, z.

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac
Pepa
quelle
3
Ich bekomme 00000002, obwohl mein Layout "USA Dvorak International" ist. Sprache ist nicht genug ...
l0b0
4
Es hilft nicht, wenn drei oder mehr Layouts vorhanden sind. Das zweite und das dritte Layout geben 00001004auf meinem Computer den gleichen Wert .
Sastanin
problem: schalte dein numlock um und starte diesen befehl erneut;)
andras.tim
Dies funktioniert nicht zuverlässig - Sie müssen eine Maske verwenden, da die LED auch den Status der LED-Tasten der Tastatur anzeigt.
Fikovnik
9

Ein anderer einfacherer Ansatz aufgrund fester Positionen der Ausgabe des xset -qBefehls ist der folgende:

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

Es wird gedruckt 00000002oder 00001002hängt von Ihrem aktuellen Tastaturlayout ab.

nikospag
quelle
Ich mag dieses, ich denke, Sie können es auf 8 Zeichen eingrenzen. c59-66.
Xlembouras
8

Auf neueren Systemen können Sie verwenden

localectl status

Es wird Ihnen zum Beispiel Folgendes zeigen:

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

Die bisherigen Antworten haben bei mir nicht geklappt. Ich benutze setkbmapmit zwei Layouts Englisch und Tschechisch, so dass jeder -printoder -querywird immer die beiden zurückgeben. Das Ermitteln des LED-Status für xset -qfunktioniert auch nicht, da der Status aller Tastatur-LEDs angezeigt wird.

Das bisher beste war, dieses kleine Hilfsprogramm schnell zu schreiben: 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;
}

und kompilieren mit

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

fikovnik
quelle
3

Mit können Sie xkbprintdas aktuelle Layout drucken.

Zum Beispiel um das aktuelle Layout als PDF zu drucken

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

welche produziert:

xkbprint Ergebnis

Fließen
quelle
2

Aus Goosfrabaa in den Arch Linux-Foren :

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

Dies funktioniert hier korrekt und wird gedruckt us(dvorak-intl)(angezeigt als "USA Dvorak International" im GNOME-Tastaturauswahlmenü).

l0b0
quelle
7
Es wird nur das erste Layout in der Liste gedruckt, nicht das aktuelle.
Sastanin
Wie kann ich meine Keymap erkennen, wenn ich die Sprachumschaltung von setxkbmap verwende? $ 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)in diesem fall habe ich jedes mal "uns" bekommen
andras.tim
0

Teilantwort: Unter KDE können Sie das aktuelle Tastaturlayout anscheinend über den folgenden qdbusBefehl abrufen:

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

Ich habe mehrere Layouts konfiguriert, aber es wird nur das aktuell verwendete angezeigt.

Getestet auf Kubuntu 18.04 (qdbus Version 4.8.7). Es gibt möglicherweise andere D-Bus-basierte Lösungen für Nicht-Qt-Umgebungen, aber ich kenne sie nicht.

Qeole
quelle
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
quelle
-1

Sie können verwenden:

setxkbmap -print | grep xkb_symbols
nozimica
quelle
5
es gibt die allgemeinen Tastatureinstellungen zurück, nicht das aktuelle Layout (us oder ru)
Andrew
Führen Sie es gut aus, wie @jasonwryan feststellt, wenn Sie diese Zeile sorgfältig analysieren. Darin befindet sich Ihr Layout. In meinem Fall ist es das latam.
Nozimica
5
Die jasonwryan-Version gibt nur einen Teil des Strings nach '+' aus. Der xkb_symbolsWert hängt nicht vom ausgewählten Layout ab. Ich erhalte immer 'uns'
Andrew