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


15

Для використання в bash-скрипті мені потрібно отримати розкладку клавіатури gnome, яку користувач використовує. Наприклад, якщо користувач встановлює розкладку клавіатури на en-us, мені потрібна команда bash, яка мені це друкує.

Як я можу отримати цю інформацію?

Оновлення:

setxkbmap -queryна жаль, не працює. Нижче показано вихід en(з першою командою) та 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

Оновлення2:

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)" };
};

На жаль, це не баш, але, використовуючи libxklavier, ось [приклад python] [1], щоб зробити те, що ви запитуєте: [1]: cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
повітряні кулі

1
<rant> xkb - бездокументоване пекло! Ці декілька визначень макета не працюють надійно; для мене вони раптово переключились у випадковий час, і після призупинення було випадково визначено, яка з визначених макетів діє, а що гірше - незалежно для кожної доданої клавіатури. Так, xkb насправді може мати різні макети для різних клавіатур, але це ніде не зафіксовано, наскільки я знаю, і тому єдине, що ця функція робить, це дратувати нас, тому що ми не можемо контролювати це. xkb, серйозно, не запускай мене! </rant>
Крістіан

Відповіді:


9

Відповідно до аналогічного запитання щодо Stackoverflow , слід зробити фокус наступним чином:

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

Я не міг це перевірити, оскільки на даний момент у мене немає * nix-машини з X (немає мене вдома) ...


1
Запуск setxkbmap -print повертає наступне. Я не думаю, що це допомагає ОП. 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)" }; };
повітряні кулі

Отже, у вас зараз активний макет "нам"? Це те, що вищезазначене твердження, враховуючи ваше введення, дало б як вихід (лише ці дві літери: "ми"). Як це виглядає, коли ви переходите на інший макет?
Іззі

2
Дякую за вашу відповідь. На жаль, це не робить трюк. Обидва рази я отримую нас. Я відредагував своє запитання, щоб показати вам вихід.
ftiaronsem

варто було спробувати. Ви можете спробувати вказати -vпараметр (кілька разів), який збільшує багатослівність і тим самим дає більше інформації. Має працювати як для, -queryтак і для -print. Оскільки у мене немає багатоядерної настройки, я не можу сказати, чи вона забезпечує необхідну деталь - але при 3-кратному -vвиведенні тут розділяється на "застосовані правила" та "ключові карти". Остання, здається, є повною інформацією, тому перша частина могла б мати "поточно активну частину".
Іззи

ще раз дякую, але, на жаль, це теж не вийшло. Той самий вихід до та після зміни макету. Незалежно від багатослівності.
ftiaronsem

4

Для Ubuntu 17.10 або новішої версії

У Ubuntu 17.10 з GNOME поточне значення встановлення не змінюється при переключенні джерела введення. Замість цього є MRU-джерела ключ , який перераховує м ОСТ г ecently у СЕД вхідних джерел.

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

Перше джерело в цьому списку є поточним, тому однолінійка для отримання поточного макета може виглядати так:

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

Зверніть увагу, що ця відповідь не застосовується, якщо ви використовуєте Unity в системі Ubuntu 17.10. З Unity він продовжує працювати, як раніше.


3

Для Ubuntu 13.04 та новіших версій

Ви можете використовувати xkblayout-stateінструмент. Опис, складання, встановлення та використання див. У файлі README.md .

Наступна команда виконає саме те, що ви хочете:

xkblayout-state print "%s"

Для Ubuntu 13.10 та новіших версій

Ubuntu 13.10 в цьому сенсі отримав деякі хороші вдосконалення, і ви можете використовувати таку просту функцію bash:

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 }'
}

Наступні команди також працюють у 13.10:

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

або:

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

2

Просто відкрийте термінал Ctrl+ Alt+ Tна клавіатурі. Коли він відкриється, запустіть команду нижче.

setxkbmap -query

Це те, що ви повинні бачити

введіть тут опис зображення


дякую за вашу швидку відповідь, на жаль це не працює. Ось вихід (перший раз з розкладкою, другий з де):
ftiaronsem,

завдяки форматуванню, вставленому як редагування питань ...
ftiaronsem,

1
ще раз дякую за вашу швидку відповідь. Це вказується на те, що я бачу, але це не говорить мені, чи я обрав німецьку чи американську верстку. Або я щось пропустив?
ftiaronsem

2

Використовуючи термінал, я провів тест, змінюючи 'pt' і 'us', і після кожної зміни я зібрав розкладку клавіатури, яка успішно використовується:

Отримайте активну розкладку клавіатури

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • Друк конфігурації: setxkbmap -print
  • Зберіть рядок, який має значення: grep xkb_symbols
  • отримує рядок після першого знаку "+": awk -F"+" '{print $2}'

Вихід із активацією макета "us": us


Розмістіть між макетами

sudo setxkbmap -option grp:alt_shift_toggle pt

Перейдіть там, де він читає "pt", код мови для переходу.

введіть тут опис зображення

Примітка: я використовую Gnome на Ubuntu 12.04 (Precision Pangolin)


Дякую за вашу відповідь. Здається, проблема полягає в тому, що користувачі прагнуть перемикатися між макетами за допомогою аплету панелі завдань. Він працює, якщо перемикає макет з cmd, але він не працює, якщо користувач перемикається з аплетом панелі завдань.
ftiaronsem

@ftiaronsem, Ви раніше не згадували про цю частину :) Я перегляну її і, якщо можливо, оновлю відповідь!
Zuul

0

Для Ubuntu 13.10 або новішої версії

(Не впевнений, чи працює він у попередніх випусках)

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"

Щоб переглянути більше варіантів:

gsettings list-recursively org.gnome.desktop.input-sources
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.