¿Cómo obtengo la distribución actual del teclado?


61

Me pregunto si hay alguna herramienta de línea de comando que devuelva la distribución actual del teclado.

Me he XkbLayoutpuesto a us, ru.

Actualización: setxkbmap devuelve configuraciones de diseño, diseño no seleccionado. P.ej:

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

Devolverá el mismo resultado sin importar cuál sea el diseño actual.


No soy muy bueno en D-Bus, pero creo que debería ser fácil rastrear la distribución actual del teclado. Aunque es posible que no pueda hacerlo si no hay un interruptor activo.
Benjamin

Respuestas:


31

Quizás esto depende de la versión, pero en mi máquina que usa setxkbmap1.3.0 funciona el siguiente comando:

setxkbmap -query | grep layout

Tenga en cuenta que, según su necesidad, puede ser inútil conocer solo el diseño: por ejemplo, la variante Dvorak del diseño de EE. UU. Es bastante diferente del QWERTY predeterminado. La -queryopción de setxkbmapda tanto el diseño como la variante, como campos diferentes:

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

3
-queryse agregó en setxkbmap 1.2.0
alanc el

Obtiene los diseños y variantes actuales y mucha información adicional consetxkbmap -print -verbose 10
erik

Para configurarlo, por ejemplo, tanto los diseños cz como nosotros, este último con la variante dvorak (para un teclado de 104 teclas), usesetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

Gracias, trabajando
Indacochea Wachín

19

Hay xkb-switch que se describe así:

xkb-switch es un programa C ++ que permite consultar y cambiar el estado del diseño XKB.

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

O, siguiendo la sugerencia de nozimica, puede usar:

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

Desde este hilo en las placas Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406


1
Gracias, xkb-switchfunciona bien, pero espero que haya una solución más portátil
Andrew

1
@ Andrew: sí, es un poco extraño, no hay una manera simple de obtener el diseño actual.
Benjamin

77
Su setxkbmapno muestra la disposición activa en ese momento cuando se define más de un diseño.
terdon

13

Sí, ¡HAY una herramienta de línea de comandos que hace lo que quieres! Lo acabo de descubrir hace 10 minutos :)

Mira aquí: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

hace exactamente lo que desea (no genera un final de línea, así que agregue ; echosi lo necesita). ejecute la herramienta sin parámetros para la ayuda.


11

Use esto para obtener el código para el diseño actual:

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

Es posible que esto deba convertirse a la forma que desee, como:

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

3
Me sale 00000002a pesar de que mi diseño es "EE.UU. Dvorak internacional". El lenguaje no es suficiente ...
l0b0

44
No ayuda si hay tres o más diseños. El segundo y el tercer diseño dan el mismo valor 00001004en mi máquina.
sastanin

problema: alterna tu bloqueo numérico e inicia este comando nuevamente;)
andras.tim

Esto no funcionará de manera confiable: debe usar una máscara ya que el LED también indica el estado de los botones LED del teclado.
fikovnik

9

Otro enfoque más simple, debido a las posiciones fijas de la salida del xset -qcomando, es este:

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

Imprime 00000002o 00001002depende de la distribución actual del teclado.


Me gusta este, creo que puedes reducirlo a 8 caracteres. c59-66.
xlembouras

8

En sistemas más nuevos, puede usar

localectl status

Por ejemplo, le mostrará lo siguiente:

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

3

Las respuestas hasta ahora no funcionaron para mí. Lo uso setkbmapcon dos diseños inglés y checo, por lo que cualquiera -printo -querysiempre devolverá los dos. Grepping el estado del LED xset -qtampoco funciona ya que muestra el estado de todos los leds del teclado.

Lo mejor hasta ahora fue escribir rápidamente esta pequeña utilidad: 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;
}

y compilar usando

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


3

Puede usar xkbprintpara imprimir el diseño actual.

Por ejemplo, para imprimir el diseño actual como uso de PDF

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

que produce:

resultado de xkbprint


2

De Goosfrabaa en los foros de Arch Linux :

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

Esto funciona correctamente aquí y se imprime us(dvorak-intl)(se muestra como "USA Dvorak international" en el menú de selección del teclado GNOME).


77
Imprime solo el primer diseño de la lista, no el actual.
sastanin

¿Cómo puedo detectar mi mapa de teclas cuando uso el cambio de idioma mediante 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)en este caso siempre tengo "nosotros"
andras.tim

0

Respuesta parcial: en KDE , aparentemente puede obtener la distribución actual del teclado a través del qdbuscomando:

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

Tengo varios diseños configurados, pero solo muestra el que está actualmente en uso.

Probado en Kubuntu 18.04 (qdbus versión 4.8.7). Puede haber otras soluciones basadas en d-bus para entornos que no sean Qt, pero no las conozco.


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

Puedes usar:

setxkbmap -print | grep xkb_symbols

55
devuelve la configuración general del teclado, no el diseño actual (us o ru)
Andrew

Ejecútelo bien, como dice @jasonwryan si analiza cuidadosamente esa línea, en ella reside su diseño. En mi caso lo es latam.
nozimica

55
La versión jasonwryan solo muestra una parte de la cadena después de '+', el xkb_symbolsvalor no depende del diseño seleccionado, siempre obtengo 'nosotros'
Andrew
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.