it-swarm.it

Come posso ottenere l'attuale layout di tastiera?

Mi chiedo se esiste uno strumento da riga di comando che restituisce il layout di tastiera corrente.

Ho XkbLayout impostato su us, ru.

Aggiorna:setxkbmap restituisce le impostazioni del layout, non il layout selezionato. Per esempio.:

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

Restituirà lo stesso risultato, indipendentemente dal layout attuale.

61
Andrew

Forse questo dipende dalla versione, ma sulla mia macchina che utilizza setxkbmap 1.3.0 funziona il seguente comando:

setxkbmap -query | grep layout

Nota che, a seconda delle tue necessità, potrebbe essere inutile conoscere solo il layout: ad esempio la variante Dvorak del layout americano è abbastanza diversa dalla QWERTY predefinita. Il -query L'opzione setxkbmap fornisce sia il layout che la variante, come campi diversi:

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

C'è xkb-switch che è così descritto:

xkb-switch è un programma C++ che consente di interrogare e modificare lo stato del layout XKB.

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

Oppure, seguendo il suggerimento di Nozimica, è possibile utilizzare:

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

Da questo thread sulle schede Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406

21
jasonwryan

Sì QUI IS uno strumento da riga di comando che fa quello che vuoi! L'ho appena scoperto 10 minuti fa :)

Guarda qui: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

fa esattamente quello che vuoi (non genera un fine riga, quindi aggiungi ; echo se hai bisogno). eseguire lo strumento senza parametri per l'aiuto.

14
Pablo Saratxaga

Usa questo per ottenere il codice per il layout corrente:

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

Potrebbe essere necessario convertirlo nel modulo desiderato, ad esempio:

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

Un altro approccio più semplice, a causa di posizioni fisse dell'output di xset -q comando, è questo:

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

Stampa 00000002 o 00001002 a seconda del layout di tastiera corrente.

9
nikospag

Sui sistemi più recenti, è possibile utilizzare

localectl status

Ad esempio ti mostrerà quanto segue:

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

Le risposte finora non hanno funzionato per me. Uso setkbmap con due layout inglese e ceco, quindi qualsiasi -print o -query restituirà sempre i due. Grepping dello stato del LED per xset -q non funziona neanche poiché mostra lo stato di tutti i led della tastiera.

Il migliore finora è stato scrivere velocemente questa piccola utility: 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;
}

e compilare usando

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

5
fikovnik

È possibile utilizzare xkbprint per stampare il layout corrente.

Ad esempio, per stampare il layout corrente come PDF

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

che produce:

xkbprint result

3
Flow

Da Goosfrabaa nei forum Arch Linux :

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

Funziona correttamente qui e stampa us(dvorak-intl) (visualizzato come "USA Dvorak international" nel menu di selezione della tastiera GNOME).

2
l0b0

Risposta parziale: Su KDE, apparentemente puoi ottenere l'attuale layout di tastiera tramite il comando qdbus:

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

Ho diversi layout configurati, ma mostra solo quello attualmente in uso.

Testato su Kubuntu 18.04 (qdbus versione 4.8.7). Potrebbero esserci altre soluzioni basate su d-bus per ambienti non Qt, ma non ne sono a conoscenza.

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