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