it-swarm.com.de

Wie erhalte ich das aktuelle Tastaturlayout?

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

Ich habe XkbLayout auf us, ru Gesetzt.

pdate :setxkbmap gibt Layouteinstellungen zurück, nicht ausgewähltes Layout. Z.B.:

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

Es wird das gleiche Ergebnis zurückgegeben, unabhängig vom aktuellen Layout.

61
Andrew

Möglicherweise ist dies versionabhängig, aber auf meinem Computer, der setxkbmap 1.3.0 verwendet, funktioniert der folgende Befehl:

setxkbmap -query | grep layout

Beachten Sie, dass es je nach Bedarf möglicherweise nutzlos ist, nur das Layout zu kennen: Beispielsweise unterscheidet sich die Dvorak-Variante des US-Layouts erheblich von der Standard-QWERTZ. Das -query Option von setxkbmap gibt 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
33
mars

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

Oder Sie folgen dem Vorschlag von nozimica und könnten 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

21
jasonwryan

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

Schauen Sie 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 Sie bei Bedarf ; echo hinzu). Führen Sie das Tool ohne Parameter für die Hilfe aus.

14
Pablo Saratxaga

Verwenden Sie diese Option, 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
11
Pepa

Ein weiterer einfacherer Ansatz aufgrund fester Positionen der Ausgabe des xset -q Befehl, ist dies:

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

Es druckt 00000002 oder 00001002 abhängig von Ihrem aktuellen Tastaturlayout.

9
nikospag

Auf neueren Systemen können Sie verwenden

localectl status

Es zeigt Ihnen zum Beispiel Folgendes:

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

Die Antworten haben bisher bei mir nicht funktioniert. Ich benutze setkbmap mit zwei Layouts Englisch und Tschechisch, also jedes -print oder -query gibt immer die beiden zurück. Grepping des LED-Status für xset -q funktioniert auch nicht, da dieser den Status aller Tastatur-LEDs anzeigt.

Das Beste war bisher, dieses kleine Dienstprogramm 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

5
fikovnik

Sie können xkbprint verwenden, um das aktuelle Layout zu drucken.

Zum Beispiel, um das aktuelle Layout als PDF verwenden) zu drucken

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

welches produziert:

(xkbprint result

3
Flow

Von Goosfrabaa in den Arch Linux-Foren :

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

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

2
l0b0

Teilantwort: Auf KDE können Sie anscheinend das aktuelle Tastaturlayout über den Befehl qdbus abrufen:

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

Ich habe mehrere Layouts konfiguriert, aber es wird nur das angezeigt, das derzeit verwendet wird.

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 weiß nichts darüber.

1
Qeole
#! /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