Як отримати поточну розкладку клавіатури?


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
erik

Щоб встановити його, наприклад, обидва макети cz і нас, останній з варіантом дворак (для клавіатури 104), використовуйтеsetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

Дякую, працюю
Indacochea Wachín

19

Існує xkb-перемикач, який описаний так:

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


1
Дякую, xkb-switchдобре працює, але сподіваюся, що було більш портативне рішення
Ендрю

1
@Andrew: так це дивно, немає простого способу отримати поточний макет.
Бенджамін

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хоча моя макет "США Дворак міжнародний". Мов не вистачає ...
l0b0

4
Це не допоможе, якщо є три або більше макетів. Другий і третій макети дають однакове значення 00001004на моїй машині.
зустріч

Проблема: перемкніть свій numlock і запустіть цю команду ще раз;)
andras.tim

Це не спрацює надійно - вам потрібно використовувати маску, оскільки світлодіод вказує стан також кнопок на клавіатурі.
fikovnik

9

Інший простіший підхід, через фіксовані позиції виходу xset -qкоманди, такий:

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

Він друкує 00000002або 00001002залежно від вашого поточного розкладки клавіатури.


Мені це подобається, я думаю, ви можете зменшити його до 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


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)(відображається як "США Dvorak international" у меню вибору клавіатури GNOME).


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 (qdbus версія 4.8.7). Можуть бути й інші рішення на основі d-bus для середовищ, що не належать до Qt, але я не знаю про них.


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

5
він повертає загальні налаштування клавіатури, а не поточний макет (у нас чи ru)
Ендрю

Виконайте це добре, як стверджує @jasonwryan, якщо ви ретельно аналізуєте цю лінію, в ній розміщується ваш макет. У моєму випадку це так latam.
nozimica

5
Версія Jasonwryan просто виводить частину рядка після "+", xkb_symbolsзначення не залежить від вибраного макета, я завжди отримую "нас"
Ендрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.