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

Andrés
fuente
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
Marte
fuente
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

jasonwryan
fuente
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.

Pablo Saratxaga
fuente
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
Pepa
fuente
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.

nikospag
fuente
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
oLen
fuente
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

fikovnik
fuente
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

Fluir
fuente
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).

l0b0
fuente
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.

Qeole
fuente
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
Alberto Salvia Novella
fuente
-1

Puedes usar:

setxkbmap -print | grep xkb_symbols
nozimica
fuente
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