Como obtenho o layout atual do teclado?


61

Gostaria de saber se existe alguma ferramenta de linha de comando que retorne o layout atual do teclado.

Eu XkbLayoutconfigurei para us, ru.

Atualizar: setxkbmap retorna configurações de layout, não layout selecionado. Por exemplo:

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

Ele retornará o mesmo resultado, independentemente do layout atual.


Eu não sou muito bom no D-Bus, mas deve ser fácil acompanhar o layout atual do teclado usando-o, eu acho. Embora possa não ser capaz de fazê-lo se não houver uma chave ativa.
Benjamin

Respostas:


31

Talvez isso seja dependente da versão, mas na minha máquina que usa a setxkbmap1.3.0, o seguinte comando funciona:

setxkbmap -query | grep layout

Observe que, dependendo da sua necessidade, pode ser inútil conhecer apenas o layout: por exemplo, a variante Dvorak do layout dos EUA é bem diferente do QWERTY padrão. A -queryopção de setxkbmapfornece o layout e a variante, como campos diferentes:

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

3
-queryfoi adicionado no setxkbmap 1.2.0
alanc

Você obtém os layouts atuais e variantes e muitas informações adicionaissetxkbmap -print -verbose 10
erik

Para configurá-lo, por exemplo ambos os layouts Cz e nós, este último com Dvorak variante (por um teclado 104), o usosetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

Obrigado, trabalhando
Indacochea Wachín

19

Há xkb-switch que é descrito assim:

O xkb-switch é um programa C ++ que permite consultar e alterar o estado do layout XKB.

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

Ou, seguindo a sugestão de nozimica, você pode usar:

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

A partir desta discussão nas placas do Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406


1
Obrigado, xkb-switchfunciona bem, mas espero que não havia solução mais portátil
Andrew

1
@ Andrew: sim, é meio estranho que não haja uma maneira simples de obter o layout atual.
22711 Benjamin

7
Você setxkbmapnão mostra o layout ativo no momento quando mais de um layout é definido.
terdon

13

Sim EXISTE UMA ferramenta de linha de comando que faz o que você deseja! Acabei de descobri-lo há 10 minutos :)

Veja aqui: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

faz exatamente o que você deseja (não gera um final de linha, então adicione ; echose precisar). execute a ferramenta sem parâmetros para obter ajuda.


11

Use isto para obter o código para o layout atual:

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

Isso pode precisar ser convertido para o formulário desejado, como:

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

3
Recebo 00000002mesmo que meu layout seja "USA Dvorak international". A língua não é suficiente ...
l0b0

4
Não ajuda se houver três ou mais layouts. O segundo e o terceiro layouts dão o mesmo valor 00001004na minha máquina.
sastanin

problema: alternar o numlock e iniciar este comando novamente;)
andras.tim

Isso não funcionará de maneira confiável - você precisará usar uma máscara, pois o LED indica o status dos botões do teclado também.
fikovnik

9

Outra abordagem mais simples, devido às posições fixas da saída do xset -qcomando, é esta:

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

Ele imprime 00000002ou 00001002depende do seu layout de teclado atual.


Eu gosto deste, acho que você pode reduzi-lo a 8 caracteres. c59-66.
Xlembouras

8

Em sistemas mais novos, você pode usar

localectl status

Por exemplo, mostrará o seguinte:

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

3

As respostas até agora não funcionaram para mim. Eu uso setkbmapcom dois layouts inglês e tcheco, para que qualquer um -printou -querysempre retorne os dois. Cumprir o status do LED xset -qtambém não funciona, pois esse mostra o status de todos os leds do teclado.

O melhor até agora foi escrever rapidamente este pequeno utilitário: 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 compilar usando

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


3

Você pode usar xkbprintpara imprimir o layout atual.

Por exemplo, para imprimir o layout atual como PDF, use

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

que produz:

resultado xkbprint


2

De Goosfrabaa nos fóruns do Arch Linux :

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

Isso funciona corretamente aqui e é impresso us(dvorak-intl)(exibido como "USA Dvorak international" no menu de seleção do teclado GNOME).


7
Imprime apenas o primeiro layout da lista, não o atual.
sastanin

Como posso detectar meu mapa de teclas quando uso a alternância de idioma pelo 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)nesse caso
recebo

0

Resposta parcial: No KDE , você pode aparentemente obter o layout atual do teclado através do qdbuscomando:

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

Eu tenho vários layouts configurados, mas mostra apenas o que está atualmente em uso.

Testado no Kubuntu 18.04 (qdbus versão 4.8.7). Pode haver outras soluções baseadas em d-bus para ambientes que não sejam Qt, mas eu não as conheço.


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

Você pode usar:

setxkbmap -print | grep xkb_symbols

5
ele retorna as configurações do teclado geral, não atual layout (nós ou ru)
Andrew

Execute-o bem, como afirma @jasonwryan, se você analisar cuidadosamente essa linha, nela reside o seu layout. No meu caso é latam.
Nozimica

5
versão jasonwryan apenas saída de uma parte da cadeia depois '+', xkb_symbolsvalor não depende de layout selecionado, eu sempre chegar 'nós'
Andrew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.