MyTetra Share
Делитесь знаниями!
Переключение раскладки клавиатуры через консольную команду в Linux
Время создания: 11.11.2020 17:24
Текстовые метки: linux, клавиатура, раскладка, язык, переключение, консоль, команда
Раздел: Компьютер - Linux - Bash - Кодировки и локализация
Запись: xintrea/mytetra_syncro/master/base/1605104646qg2htcz0nq/text.html на raw.github.com

Переключение через setxkbmap


Вариант команды переключения на язык RU:



setxkbmap -layout us,ru



Проблемы этой команды:


  • после ее выполнения останется только одна раскладка (ru)
  • слетит привязка к горячим клавишам, по которым переключатеся раскладка
  • индикатор раскладки клавиатуры не будет оповещен о том, что раскладка переключилась


Есть виртуозы, которые говорят, что работают следующие команды:



setxkbmap -layout 'us,ru' -option 'grp:ctrl_shift_toggle'

setxkbmap -layout 'ru,us' -option 'grp:ctrl_shift_toggle'



Якобы, в итоге и переключение остаётся, и текущая раскладка меняется. Но потом они убеждаются, что такой вариант работает правильно лишь тогда, когда текущая раскладка английская, иначе раскладки меняются ролями.


Тогда пробуют добавить в эти команды принудительное начальное переключение на английскую раскладку:



setxkbmap -layout 'us' && setxkbmap -layout 'ru,us' -option 'grp:ctrl_shift_toggle'

setxkbmap -layout 'us' && setxkbmap -layout 'us,ru' -option 'grp:ctrl_shift_toggle'



Но такой способ тоже не работает: все так же проявляется зависимость от текущей раскладки. И конечно, не оповещается индикатор раскладки клавиатуры.



Переключение через setxkbmap + xdotool


Единственный рабочий вариант - это настроить переключение раскладок на нужное сочетание клавиш, а потом вызвать нажатие данного сочетания клавиш через xdotool. Например:


1. Вешаем переключение раскладок на какую-то левую клавишу, например правый win:


setxkbmap -layout 'us,ua,ru' -option 'grp:rwin_toggle'


2. Переключение срабатывает командами:


xdotool key ISO_Next_Group


В любом случае, если выяснить на какое сочетание клавиш навешено переключение раскладки клавиатуры, то переключить раскладку можно соответствующей командой. Например, если раскладка переключается сочетанием Ctrl+Shift, то переключить раскладку можно командой:



xdotool key Ctrl+Shift



Далее, например для переключения на нужную раскладку (например, при трех раскладках в системе), можно написать скрипт, который нужное количество раз виртуально нажмет клавиши переключения раскладки, чтобы выставилась заданная раскладка.


Подробности: https://www.linux.org.ru/forum/desktop/4443738?cid=4443819



Переключение через xkb-switch


Ранее существовала программа xkb-switch. Она делала ровно то что нужно: просто переключала раскладку клавиатуры. К сожалению, начиная с какого-то момента (примерно с появлением Debian 8) данная программа перестала включаться в дистрибутивы Debian, Ubuntu и им подобные.


Опции команды следующие:



Usage: xkb-switch -s ARG Sets current layout group to ARG

xkb-switch -l|--list Displays all layout groups

xkb-switch -h|--help Displays this message

xkb-switch -v|--version Shows version number

xkb-switch -w|--wait [-p] Waits for group change and exits

xkb-switch -W Infinitely waits for group change

xkb-switch -n|--next Switch to the next layout group

xkb-switch [-p] Displays current layout group


Примеры команд:


xkb-switch -s us

xkb-switch -s de


Преимущества:


  • Быстро работает, при вызове этой программы нет задержки, в отличие от переключения  setxkbmap.
  • Правильно переключает индикатор раскладки в области значков на панели задач. Индикатор не исчезает, не зависает и не перестает работать, как это происходит при setxkbmap.
  • Не отключает переключение раскладки клавиатуры на экране блокировки, предотвращая ввод правильного пароля, если перед блокировкой была выбрана неправильная раскладка (в отличии от того как делает это setxkbmap.
  • Не изменяет основные комбинации клавиш, такие как Ctrl-C, Ctrl-V. Все сочетания работают с одними и теми же клавишами, причем в разных раскладках. 
  • Поддерживает механику компоновки Cinnamon, такую ​​как настройка использования одинакового языка для всех окон или же отдельного языка для каждого окна.


Возможно, для правильной работы xkb-switch потребуется настроенная переменная DISPLAY.


Еще есть информация о том, что xkb-switch примерно с 2017 года перестал работать в Unity и в Gnome 3. В этом случае можно использовать следующую команду:



qdbus org.gnome.SettingsDaemon.Keyboard /org/gnome/SettingsDaemon/Keyboard org.gnome.SettingsDaemon.Keyboard.SetInputSource 0


Взять исходники этой программы можно на GitHUb: https://github.com/grwlf/xkb-switch. Программа небольшая и должна легко собираться в любом Linux с X11 и установленнымии средствами разработки.


 
MyTetra Share v.0.59
Яндекс индекс цитирования