Comment puis-je obtenir la disposition actuelle du clavier?


61

Je me demande s'il existe un outil de ligne de commande qui retourne la disposition actuelle du clavier.

J'ai XkbLayoutmis à us, ru.

Mettre à jour: setxkbmap renvoie les paramètres de présentation, pas la disposition sélectionnée. Par exemple:

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

Il retournera le même résultat quelle que soit la disposition actuelle.


Je ne suis pas très bon chez D-Bus, mais je pense qu’il devrait être facile de suivre la disposition actuelle du clavier. Bien qu'il puisse ne pas être en mesure de le faire s'il n'y a pas de commutateur actif.
Benjamin

Réponses:


31

Peut-être que cela dépend de la version, mais sur ma machine qui utilise setxkbmap1.3.0, la commande suivante fonctionne:

setxkbmap -query | grep layout

Notez que selon vos besoins, il peut être inutile de ne connaître que la mise en page: par exemple, la variante Dvorak de la mise en page US est assez différente de la valeur QWERTY par défaut. L' -queryoption de setxkbmapdonne à la fois la mise en page et la variante, sous forme de champs différents:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle

3
-querya été ajouté dans setxkbmap 1.2.0
alanc

Vous obtenez les dispositions actuelles et les variantes et de nombreuses informations supplémentaires avecsetxkbmap -print -verbose 10
erik

Pour le définir, par exemple les deux dispositions cz et nous, cette dernière avec la variante dvorak (pour un clavier à 104 touches), utilisezsetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

Merci d'avoir travaillé
Indacochea Wachín le

19

Il y a xkb-switch qui est décrit ainsi:

xkb-switch est un programme C ++ qui permet d'interroger et de modifier l'état de la mise en page XKB.

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

Ou, suivant la suggestion de nozimica, vous pouvez utiliser:

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

À partir de ce fil sur les cartes Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406


1
Merci, xkb-switchfonctionne bien, mais j'espère qu'il y avait plus de solution portable
Andrew

1
@ Andrew: oui, c'est un peu bizarre, il n'y a pas de moyen simple d'obtenir la mise en page actuelle.
Benjamin

7
Votre setxkbmapne montre pas la mise en page active lorsque plusieurs mises en page sont définies.
terdon

13

Oui, il existe un outil en ligne de commande qui fait ce que vous voulez! Je viens de le découvrir il y a 10min :)

Regardez ici: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

fait exactement ce que vous voulez (il ne sort pas de fin de ligne, alors ajoutez ; echosi vous avez besoin). exécuter l'outil sans paramètres pour l'aide.


11

Utilisez ceci pour obtenir le code de la mise en page actuelle:

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

Cela doit éventuellement être converti en un formulaire de votre choix, comme:

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac

3
Je reçois 00000002même si ma mise en page est "USA Dvorak international". La langue ne suffit pas ...
l0b0

4
Cela n'aide pas s'il y a trois dispositions ou plus. Les deuxième et troisième mises en page donnent la même valeur 00001004sur ma machine.
Sastanin

problème: bascule ton pavé numérique et lance cette commande à nouveau;)
andras.tim

Cela ne fonctionnera pas de manière fiable - vous devez utiliser un masque car le voyant indique également l'état des boutons du clavier.
Fikovnik

9

Une autre approche plus simple, en raison des positions fixes de la sortie de la xset -qcommande, est la suivante:

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

Il imprime 00000002ou 00001002dépend de votre disposition de clavier actuelle.


J'aime celui-ci, je pense que vous pouvez le réduire à 8 caractères. c59-66.
xlembouras

8

Sur les nouveaux systèmes, vous pouvez utiliser

localectl status

Il vous montrera par exemple ce qui suit:

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

3

Les réponses jusqu'à présent n'ont pas fonctionné pour moi. J'utilise setkbmapavec deux mises en page anglais et tchèque afin tout -printou -queryretournera toujours les deux. Le verrouillage de l'état des voyants xset -qne fonctionne pas non plus, car celui-ci indique l'état de toutes les voyants du clavier.

Jusqu'à présent, le mieux était d'écrire rapidement ce petit utilitaire: 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;
}

et compiler en utilisant

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


3

Vous pouvez utiliser xkbprintpour imprimer la mise en page actuelle.

Par exemple, pour imprimer la mise en page actuelle au format PDF, utilisez

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

qui produit:

résultat xkbprint


2

De Goosfrabaa dans les forums Arch Linux :

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

Cela fonctionne correctement ici et s’imprime us(dvorak-intl)(affiché comme "USA Dvorak international" dans le menu de sélection du clavier GNOME).


7
Il n'imprime que la première mise en page de la liste, pas la mise en page actuelle.
Sastanin

Comment détecter mon clavier, lorsque j'utilise le bascule de langage avec 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)dans ce cas, j'ai chaque fois "nous"
andras.tim

0

Réponse partielle: Sous KDE , vous pouvez apparemment obtenir la configuration de clavier actuelle via la qdbuscommande:

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

J'ai plusieurs configurations configurées, mais elle ne montre que celle qui est actuellement utilisée.

Testé sur Kubuntu 18.04 (version qdbus 4.8.7). Il existe peut-être d'autres solutions basées sur d-bus pour les environnements non Qt, mais je ne les connais pas.


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

Vous pouvez utiliser:

setxkbmap -print | grep xkb_symbols

5
il retourne les réglages généraux du clavier, pas la disposition actuelle (us ou ru)
Andrew

Exécutez-la bien, comme le dit @jasonwryan si vous analysez soigneusement cette ligne, votre mise en page réside. Dans mon cas c'est latam.
nozimica

5
jasonwryan version vient de sortir une partie de la chaîne après '+', la xkb_symbolsvaleur ne dépend pas de la mise en page sélectionnée, je reçois toujours 'nous'
Andrew
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.