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.