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

14

Для использования в скрипте 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

Update2:

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)" };
};
ftiaronsem
источник
К сожалению , это не удар, но с использованием libxklavier, вот [пример питон] [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. Поскольку у меня нет многоязыковой настройки, я не могу сказать, предоставляет ли она детали, которые вам нужны, но при трехкратном -vвыводе здесь разделены на «применяемые правила» и «раскладку ключей». Последняя представляется полной информацией, поэтому первая часть может иметь «активную в данный момент часть».
Иззи
еще раз спасибо, но, к сожалению, это тоже не сработало. Тот же вывод до и после изменения макета. Независимо от многословия.
ftiaronsem
4

Для Ubuntu 17.10 или новее

В Ubuntu 17.10 с GNOME текущее значение gsettings не изменяется при переключении источника ввода. Вместо этого есть 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

Это то, что вы должны увидеть

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

Митч
источник
спасибо за ваш быстрый ответ, к сожалению, это не работает. Вот вывод (первый раз с en layout, второй с de):
ftiaronsem
из-за форматирования, вставленного как вопрос edit ...
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


Swith между макетами

sudo setxkbmap -option grp:alt_shift_toggle pt

Передайте, где это читает 'pt', код языка, чтобы переключиться.

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

Примечание: я использую Gnome в Ubuntu 12.04 (Precise Pangolin)

Zuul
источник
Спасибо за Ваш ответ. Кажется, проблема в том, что пользователи, как правило, переключаются между макетами с помощью апплета на панели задач. Это работает, если вы переключаете макет из cmd, но не работает, если пользователь переключается с помощью апплета панели задач.
ftiaronsem
@ftiaronsem, Вы не упомянули эту часть раньше :) Я посмотрю на нее и обновлю свой ответ, если это возможно!
Зуул
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
user.dz
источник