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.


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

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


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.


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

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.


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

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


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


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ü).


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.


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

Sie können verwenden:

setxkbmap -print | grep xkb_symbols

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.