¿Cómo obtener la distribución actual del teclado gnome desde la terminal?


14

Para usar en un script bash, necesito obtener la distribución del teclado gnome que el usuario está usando actualmente. Por ejemplo, si el usuario establece la distribución del teclado en en-us, necesito un comando bash que me imprima esto.

¿Cómo puedo obtener esa información?

Actualizar:

setxkbmap -querydesafortunadamente no funciona. A continuación se muestra la salida con el diseño en(primer comando) y el de(segundo comando) activado. Cambiar el diseño del teclado parece tener alguna relación con la configuración de la sesión de gnome

setxkbmap -query 
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

setxkbmap -query
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

Actualización2:

setxkbmap -print #with en-us layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};
setxkbmap -print #after switching to german layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};

Lamentablemente no es bash, pero usando libxklavier, aquí hay un [ejemplo de python] [1] para hacer lo que pides: [1]: cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
globos del

1
<rant> xkb es un infierno indocumentado! Estas definiciones de diseño múltiple no funcionan de manera confiable; para mí, de repente cambiaron en momentos aleatorios y después de suspender se determinó aleatoriamente cuál de los diseños definidos estaba vigente y, lo que es peor, independientemente para cada teclado conectado. Sí, xkb en realidad puede tener diferentes diseños para diferentes teclados, pero esto no está documentado en ningún lugar hasta donde yo sé y, por lo tanto, lo único que hace esta característica es molestarnos porque no podemos controlarlo. xkb, en serio, ¡no me hagas empezar! </rant>
Christian

Respuestas:


9

Según una pregunta similar sobre Stackoverflow , lo siguiente debería ser el truco:

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

No pude verificarlo, ya que actualmente no tengo una máquina * nix con X disponible (no estoy en casa) ...


1
La ejecución de setxkbmap -print devuelve lo siguiente. No creo que esto ayude al OP. xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)" }; xkb_geometry { include "pc(pc105)" }; };
globos

¿Así que actualmente tienes el diseño "nosotros" activo? Eso es lo que la declaración anterior, dada su entrada, produciría como salida (solo esas dos letras: "nosotros"). ¿Cómo se ve cuando cambias a un diseño diferente?
Izzy

2
Gracias por tu respuesta. Desafortunadamente esto no está haciendo el truco. Ambas veces me entiendo. He editado mi pregunta para mostrarle la salida.
ftiaronsem

valió la pena intentarlo. Podría intentar especificar el -vparámetro (varias veces), lo que aumenta la verbosidad y, por lo tanto, proporciona más información. Debería funcionar para ambos, -queryasí como también -print. Como no tengo una configuración de varios idiomas, no puedo decir si proporciona los detalles que necesita, pero con 3 veces la -vsalida aquí se divide en "reglas aplicadas" y "mapa de teclas". Esta última parece ser la información completa, por lo que la primera parte podría tener la "parte actualmente activa".
Izzy

gracias de nuevo, pero desafortunadamente esto tampoco funcionó. La misma salida antes y después del cambio de diseño. Independientemente de la verbosidad.
ftiaronsem

4

Para Ubuntu 17.10 o posterior

En Ubuntu 17.10, con GNOME, el valor actual de gsettings no cambia cuando cambia la fuente de entrada. En su lugar hay una MRU-fuentes clave que enumera el m ost r ecientemente u sed fuentes de entrada.

$ gsettings get org.gnome.desktop.input-sources mru-sources
[('xkb', 'se'), ('xkb', 'us')]

La primera fuente en esa lista es la actual, por lo que una línea para obtener el diseño actual puede verse así:

gsettings get org.gnome.desktop.input-sources mru-sources | sed -r "s/\S*\s'([^']+).*/\1/"

Tenga en cuenta que esta respuesta no se aplica si utiliza Unity en un sistema Ubuntu 17.10. Con Unity sigue funcionando como antes.


3

Para Ubuntu 13.04 y versiones inferiores

Puedes usar la xkblayout-stateherramienta. Consulte el archivo README.md para obtener una descripción, compilación, instalación y uso.

El siguiente comando hará exactamente lo que quieras:

xkblayout-state print "%s"

Para Ubuntu 13.10 y superior

Ubuntu 13.10 vino con algunas buenas mejoras en este sentido, y puede usar la siguiente función bash simple:

get_current_xkblayout () {
      current_input_nr=$(gsettings get org.gnome.desktop.input-sources current | \
          awk '{ print $NF }')
      shift=$(( 2 * ( $current_input_nr + 1 )))
      gsettings get org.gnome.desktop.input-sources sources | tr -d "\',[]()" | \
          awk -v cur="$shift" '{ print $cur }'
}

Los siguientes comandos también funcionan en 13.10:

setxkbmap -query | awk -F"(,|[ ]+)" '/layout:/ { print $2 }'

o:

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

2

Simplemente presione Ctrl+ Alt+ Ten su teclado para abrir Terminal. Cuando se abra, ejecute el siguiente comando.

setxkbmap -query

Esto es lo que deberías ver

ingrese la descripción de la imagen aquí


Gracias por su pronta respuesta, desafortunadamente esto no está funcionando. Aquí está la salida (primera vez con diseño en, segundo con de):
ftiaronsem

debido al formato pegado como edición de preguntas ...
ftiaronsem

1
Gracias de nuevo por su pronta respuesta. Esto es lo que estoy viendo, pero no me dice si seleccioné el diseño alemán o americano. ¿O me he perdido algo?
ftiaronsem

2

Usando el terminal, ejecuté una prueba que cambiaba entre 'pt' y 'nosotros', y después de cada cambio, reuní la distribución del teclado que se utilizó con éxito:

Obtener la distribución activa del teclado

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • Imprima la configuración: setxkbmap -print
  • Recoge la línea que importa: grep xkb_symbols
  • obtiene la cadena después del primer signo "+": awk -F"+" '{print $2}'

La salida que tiene el diseño 'nosotros' activo es: us


Swith entre diseños

sudo setxkbmap -option grp:alt_shift_toggle pt

Pase donde se lee 'pt', el código de idioma para cambiar.

ingrese la descripción de la imagen aquí

Nota: Estoy usando Gnome en Ubuntu 12.04 (Precise Pangolin)


Gracias por tu respuesta. El problema parece ser que los usuarios tienden a cambiar entre diseños utilizando el applet de la barra de tareas. Funciona si uno está cambiando el diseño de cmd, pero no funciona si el usuario cambia con el applet de la barra de tareas.
ftiaronsem

@ftiaronsem, no has mencionado esa parte antes :) ¡Lo investigaré y actualizaré mi respuesta si es posible!
Zuul

0

Para Ubuntu 13.10 o posterior

(No estoy seguro si funciona en versiones anteriores)

current_layout=gsettings get org.gnome.desktop.input-sources current | awk '{print $2}'
gsettings get org.gnome.desktop.input-sources sources | grep -Po "'[[:alpha:]]+'\)" | sed -ne "s/['|)]//g;$(($current_layout+1))p"

Para ver más opciones:

gsettings list-recursively org.gnome.desktop.input-sources
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.