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

61

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

Я XkbLayoutнастроен на us, ru.

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

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

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

Андрей
источник
Я не очень хорош в D-Bus, но, думаю, должно быть легко отслеживать текущую раскладку клавиатуры. Хотя это может быть невозможно, если нет активного переключателя.
Бенджамин

Ответы:

31

Возможно, это зависит от версии, но на моем компьютере, который использует setxkbmap1.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
Марс
источник
3
-queryбыл добавлен в setxkbmap 1.2.0
alanc
Вы получаете текущие макеты и варианты и много дополнительной информации сsetxkbmap -print -verbose 10
Эрик
Чтобы установить его, например, оба макета cz и us, последний с вариантом dvorak (для клавиатуры с 104 клавишами), используйтеsetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik
Спасибо, работаю
Indacochea Wachín
19

Есть 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

jasonwryan
источник
1
Спасибо, xkb-switchотлично работает, но надеюсь, что появилось более портативное решение
Андрей
1
@ Андрей: да, это странно, что нет простого способа получить текущий макет.
Бенджамин
7
Ваш setxkbmapтекущий активный макет не отображается, если определено более одного макета.
Terdon
13

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

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

xkblayout-state print "%s"

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

Пабло Саратчага
источник
11

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

$(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
Пепа
источник
3
Я понимаю, 00000002хотя мой макет "USA Dvorak International". Языка недостаточно ...
10
4
Это не поможет, если есть три или более макетов. Второй и третий макеты дают одинаковую ценность 00001004на моей машине.
Састанин
проблема: переключи свой numlock и запусти эту команду снова;)
andras.tim
Это не будет работать надежно - вам нужно использовать маску, так как светодиодный индикатор также показывает состояние светодиодных кнопок клавиатуры.
фиковник
9

Еще один более простой подход из-за фиксированных позиций вывода xset -qкоманды:

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

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

nikospag
источник
Мне нравится этот, я думаю, вы можете сузить его до 8 символов. c59-66,
xlembouras
8

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

localectl status

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

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
Олен
источник
3

Ответы до сих пор не работают для меня. Я использую 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

fikovnik
источник
3

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

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

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

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

результат xkbprint

поток
источник
2

Из Goosfrabaa в форумах Arch Linux :

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

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

l0b0
источник
7
Он печатает только первый макет в списке, а не текущий.
Састанин
Как я могу определить свою раскладку клавиш, когда я использую переключение языка с помощью 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)В этом случае я каждый раз получал "нас"
andras.tim
0

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

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

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

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

Qeole
источник
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

Вы можете использовать:

setxkbmap -print | grep xkb_symbols
nozimica
источник
5
он возвращает общие настройки клавиатуры, а не текущую раскладку (us или ru)
Андрей
Выполните это хорошо, как говорит @jasonwryan, если вы тщательно проанализируете эту строку, в нее будет помещен ваш макет. В моем случае это так latam.
nozimica
5
jasonwryan версия просто выводит часть строки после '+', xkb_symbolsзначение не зависит от выбранного макета, я всегда получаю 'нас'
Эндрю