it-swarm-ru.tech

Как получить текущую раскладку клавиатуры?

Мне интересно, есть ли инструмент командной строки, который возвращает текущую раскладку клавиатуры.

У меня XkbLayout установлено us, ru.

pdate:setxkbmap возвращает настройки макета, а не выбранный макет. Например.:

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

Он будет возвращать один и тот же результат независимо от того, какой текущий макет.

61
Andrew

Возможно, это зависит от версии, но на моем компьютере, который использует setxkbmap 1.3.0, работает следующая команда:

setxkbmap -query | grep layout

Обратите внимание, что в зависимости от ваших потребностей может быть бесполезно знать только макет: например, вариант Dvorak для американского макета сильно отличается от стандартного QWERTY. -query опция setxkbmap дает как макет, так и вариант в виде различных полей:

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

Есть xkb-switch, который описан так:

xkb-switch - это программа на C++, которая позволяет запрашивать и изменять состояние макета XKB.

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

Или, следуя совету nozimica, вы можете использовать:

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

Из этой темы на платах Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406

21
jasonwryan

Да ТАМ IS инструмент командной строки, который делает то, что вы хотите! Я только что обнаружил это 10 минут назад :)

Посмотрите здесь: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

делает именно то, что вы хотите (он не выводит конец строки, поэтому добавьте ; echo если тебе надо). Запустите инструмент без параметров для помощи.

14
Pablo Saratxaga

Используйте это, чтобы получить код для текущего макета:

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

Это может быть необходимо преобразовать в форму, которую вы хотите, например:

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

Другой более простой подход из-за фиксированных позиций вывода xset -q команда, это:

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

Печатает 00000002 или 00001002 в зависимости от вашей текущей раскладки клавиатуры.

9
nikospag

На более новых системах вы можете использовать

localectl status

Например, он покажет вам следующее:

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

Ответы до сих пор не работают для меня. Я использую setkbmap с двумя макетами английским и чешским, поэтому любой -print или -query всегда вернет два. Отключение статуса светодиодов для xset -q также не работает, так как тот показывает состояние всех светодиодных индикаторов клавиатуры.

Лучше всего было быстро написать эту маленькую утилиту: 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;
}

и скомпилировать используя

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

5
fikovnik

Вы можете использовать xkbprint для печати текущего макета.

Например, чтобы напечатать текущий макет как PDF использовать

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

который производит:

xkbprint result

3
Flow

От Goosfrabaa на форумах Arch Linux :

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

Здесь это работает правильно и печатает us(dvorak-intl) (отображается как "USA Dvorak international" в меню выбора клавиатуры GNOME).

2
l0b0

Частичный ответ: В KDE вы можете получить текущую раскладку клавиатуры с помощью команды qdbus:

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

У меня настроено несколько макетов, но он показывает только тот, который используется в данный момент.

Протестировано на Kubuntu 18.04 (версия 4.8.7 для qdbus). Могут быть и другие решения на основе d-bus для не-Qt сред, но я не знаю о них.

1
Qeole
#! /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
0
Alberto Salvia Novella