Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Определить текущую раскладку BASH

#ubuntu #bash #клавиатура


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

Пробовал так:

xset -q | awk 'BEGIN { a[1]="ru"; a[0]="en" } /LED/ { print a[substr($10,5,1)]; }'


Но этот код всегда выдает "en", независимо от раскладки.

ОС Ubuntu 14.04 LTS.
    


Ответы

Ответ 1



За управление раскладкой в консоли отвечает команда setxkbmap, а при запуске с параметром -print она показывает текущее положение дел. $ setxkbmap -print xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete+ledscroll(group_lock)" }; xkb_symbols { include "pc+ru+us:2+inet(evdev)+compose(caps)" }; xkb_geometry { include "pc(pc105)" }; }; Если немного поиграться, можно достать вот эти вот ru: $ setxkbmap -print | sed -n 's#xkb_symbols[^"]*"\([^"]*\)".*$#\1#p' | awk -F+ '{print $2}' ru При переключении раскладки сменится на us.

Ответ 2



компиляция из ответов (и добавка от меня) к этому вопросу: штатного «из-коробочного» средства определить выбранную сейчас раскладку (группу — group — в терминологии xkb) — нет. довольно близка к решению программа xset, запущенная с опцией -q. можно отличтить первую раскладку от всех остальных: $ xset -q | sed -rn 's/.*LED mask.*(.)[[:xdigit:]]{3}$/\1/p' для первой раскладки эта команда вернёт 0, для всех остальных — 1. если вы используете всего две раскладки, то это подходящее решение. некоторые криво спроектированные (моё оценочное суждение) «переключатели раскладок» (например, встроенный в современные версии gnome апплет) вместо изменения раскладки полностью перезагружают всю конфигурацию xkb, в чём несложно убедиться, сравнив выводы команды xkbcomp $DISPLAY - при выборе разных языков через такой апплет (или клавиатурным сокращением, вызывающим тот же код). если вы — «счастливый» обладатель такого «переключателя», то вот такая команда выдаст наименование переконфигурированной в данный момент раскладки: $ xkbcomp $DISPLAY - | sed -nr 's/.*name\[group1\]="([^"]+)".*/\1/p' примеры её вывода: English (US), Russian и т.п. для не столь «счастливых» людей выходом остаётся, пожалуй, только сборка какой-нибудь вспомогательной программы типа: https://github.com/ierton/xkb-switch https://github.com/nonpop/xkblayout-state или чего-то подобного.

Ответ 3



Вот мой любительский, но рабочий вариант без sed, awk, perl и т.д. Старался решить это силами bash, чтоб работал быстрее и экономичнее. xset -q | while read -r line ; do [[ $line = *Group* ]] && line=${line//13*} && ([[ $line = *off* ]] && echo 'EN ' || echo 'RU ') && exit ; done Вылавливаем значения "Group 2: on/off" из этой строки: 12: Group 2: off 13: Mouse Keys: off

Ответ 4



xset -q|grep Group\ 2|awk {'print $4'}|sed 's/on/en/g;s/off/ru/g'

Комментариев нет:

Отправить комментарий