Come posso ottenere l'attuale layout di tastiera?


61

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

Ho XkbLayoutimpostato 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.


Non sono molto bravo con D-Bus, ma dovrebbe essere facile tenere traccia dell'attuale layout della tastiera usando quello che penso. Anche se potrebbe non essere in grado di farlo se non è presente alcun interruttore attivo.
Benjamin,

Risposte:


31

Forse questo dipende dalla versione, ma sulla mia macchina che utilizza setxkbmap1.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. L' -queryopzione di setxkbmapfornisce sia il layout che la variante, come campi diversi:

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

3
-queryè stato aggiunto in setxkbmap 1.2.0
alanc

Ottieni i layout e le varianti attuali e molte informazioni aggiuntive consetxkbmap -print -verbose 10
erik,

Per impostarlo, ad esempio entrambi i layout cz e us, quest'ultimo con la variante dvorak (per una tastiera da 104 tasti), utilizzaresetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

Grazie, lavorando
Indacochea Wachín il

19

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


1
Grazie, xkb-switchfunziona benissimo, ma spero che ci fosse una soluzione più portatile
Andrew,

1
@Andrew: sì, è strano che non ci sia un modo semplice per ottenere il layout attuale.
Benjamin,

7
Il tuo setxkbmapnon mostra il layout attualmente attivo quando è definito più di un layout.
terdon

13

Sì, esiste 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 ; echose ne hai bisogno). eseguire lo strumento senza parametri per l'aiuto.


11

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

3
Capisco 00000002anche se il mio layout è "USA Dvorak international". La lingua non è abbastanza ...
l0b0

4
Non aiuta se ci sono tre o più layout. Il secondo e il terzo layout danno lo stesso valore 00001004sulla mia macchina.
sastanin,

problema: attiva il tuo blocco numerico e riavvia questo comando;)
andras.tim

Questo non funzionerà in modo affidabile - è necessario utilizzare una maschera poiché il LED indica anche lo stato dei pulsanti led della tastiera.
fikovnik,

9

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

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

Stampa 00000002o in 00001002base al layout di tastiera corrente.


Mi piace questo, penso che puoi restringerlo a 8 caratteri. c59-66.
xlembouras,

8

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

3

Le risposte finora non hanno funzionato per me. Io uso setkbmapcon due layout inglese e ceco, quindi qualsiasi -printo -queryrestituirà sempre i due. Il grepping dello stato del LED per xset -qnon funziona neanche poiché si 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


3

È possibile utilizzare xkbprintper stampare il layout corrente.

Ad esempio per stampare il layout corrente come PDF

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

che produce:

risultato xkbprint


2

Da Goosfrabaa nei forum Arch Linux :

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

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


7
Stampa solo il primo layout dell'elenco, non quello corrente.
sastanin,

Come posso rilevare la mia keymap, quando uso il selettore della lingua tramite 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)in questo caso ho sempre ricevuto "noi"
andras.tim il

0

Risposta parziale: su KDE , apparentemente puoi ottenere l'attuale layout di tastiera tramite il qdbuscomando:

$ 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.


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

Puoi usare:

setxkbmap -print | grep xkb_symbols

5
restituisce le impostazioni generali della tastiera, non il layout corrente (us o ru)
Andrew,

Eseguilo bene, come afferma @jasonwryan se analizzi attentamente quella linea, in essa risiede il tuo layout. Nel mio caso lo è latam.
Nozimica,

5
la versione jasonwryan ha appena emesso una parte della stringa dopo '+', il xkb_symbolsvalore non dipende dal layout selezionato, ottengo sempre 'noi'
Andrew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.