Переключение раскладки клавиатуры (три раскладки)

Автор olegwhite, марта 27, 2016, 14:23:19

« предыдущая - следующая »

olegwhite

марта 27, 2016, 14:23:19 Последнее редактирование: марта 27, 2016, 14:25:08 от olegwhite
 В процессе поиска "идеального" подхода к настройке операционной системы я обратил внимание на установленный, в некоторых Debian-системах, пакет fbxkb и в трее уже отображается используемая раскладка клавиатуры, поэтому я подумал о резонности настройки переключения раскладок не через возможности рабочего окружения XFCE, а через системные возможности в /etc/default/keyboard или еще как. Кое-кто может сказать: "А зачем городить огород?". Я даже и не знаю, что ответить на это, ну вот захотелось мне и все тут. В процессе поиска решения попадались разные варианты, но в памяти все время всплывала, возможная ранее, циклическая смена раскладок, когда пользователь использующий более двух раскладок (я постоянно использую три us, ua, ru) мог переключать левым сочетанием клавиш в порядке us - ua - ru, а правым: us - ru - ua. Это было очень удобно, поскольку не нужно было лишний раз "мучить клавиши". В последних версиях операционных систем такая возможность пропала, решения я так и не нашел. Предложений много, а результата - "0". И вот эта идея снова меня "зацепила" и я стал размышлять на эту тему немножко под другим углом, если нельзя сделать это штатными средствами, то может скрипт поможет.


   Размышления мои "плыли" по такому руслу - при работе я использую три раскладки, при наборе текста одного документа, как правило, используется либо одна, либо две - русская или украинская в сочетании с английской раскладкой, очень редко используются три одновременно, и русская, и украинская, английская вместе. Наиболее приемлемый вариант из предлагаемых был основан на использовании варианта RUU, суть которого заключается в том, что в системе используется только две раскладки (ru и us), а возможность вводить украинские литеры осуществляется нажатием на "волшебную" клавишу и вместо "ы" получаем "i" и т.д. Но он мне не подходит в виду активного использования обеих кириллических раскладок, поэтому мои поиски продолжались, нужно заметить, безрезультатные.


   Я не программист, и понятие о внутренней работе компьютера и ПО имею только общие, но простенький алгоритм уже сформировался. Если бы я был программистом, у меня на решение этой задачки ушло бы минут пять - десять, а так, пришлось попыхтеть. В общем - идея такова: в нужное время в системе используется одна комбинация раскладок, допустим US-RU, а при необходимости нажимаем клавишу и получаем другую US-UA. Можно назначить два сочетания "горячих" клавиш, но это будет немножко неудобно, я решил привязать все к одной. В размышлениях я определил три кандидата - Caps Lock, Num Lock, Scroll Lock, все три могут сохранять свое состояние (нажата или нет), остается только запустить скрипт, который определит состояние клавиши на момент запуска скрипта и установит в системе соответствующее комбинацию раскладок. Осталось дело за малым - состряпать этот скриптик. В процессе "исследований", на одном буржуйском сайте я нашел вот это:


#!/bin/bash
state=$(xset -q | grep Caps | awk '{print $4}')
if [ "$state" = "on" ]
then
notify-send "Caplock :ON"
fi



   Как видим (я-то это прочитал в пояснении), этот скрипт проверяет включена ли клавиша Caps Lock и если "да" то выводит на экран сообщение "Caplock :ON". Соответственно, я подставил команду setxkbmap для установки соответствующих комбинаций раскладок. Ура-а-а-а! Заработало-о-о-о! Но радость моя была не долгой, идея с Caps Lock хороша, но как убрать действие ее прямого назначения? В XFCE я такой возможности не нашел, находил разные консольные команды, в принципе, ничего страшного, "вшить" в скриптик и все, но эти команды либо переназначали клавишу, либо вообще удаляли ее, так что на использовании клавиши Caps Lock пришлось "поставить крест". И тут я подумал об одной замечательной клавише, Scroll Lock называется. Для чего она нужна, признаюсь - не знаю, вернее я раньше знал, а теперь основательно забыл. Вот ее, родимую, я и решил задействовать. Снова в поиск, и снова к немцам, и снова у них нашел вот этот скриптик, он аналогичен первому, только теперь он выводит сообщение, и когда клавиша Scroll Lock выключена, и когда включена.


#!/bin/sh

result=$(xset q | grep "Scroll Lock: off")
if [ -z "$result" ]; then # Scroll Lock must be on
  echo "Off"
  xset -led named "Scroll Lock"
else
  echo "On"
  xset led named "Scroll Lock"
fi




   Основываясь на этих двух подсказках я состряпал вот такой простенький скриптик:



#!/bin/sh

result=$(xset q | grep "Scroll Lock: off")
if [ -z "$result" ]; then # Scroll Lock must be on
  notify-send "Keyboard :US,UA"
  setxkbmap "us,ua" ",winkeys" "grp:ctrl_shift_toggle"
  xset -led named "Scroll Lock"
else
  notify-send "Keyboard :US,RU"
  setxkbmap "us,ru" "" "grp:ctrl_shift_toggle"
  xset led named "Scroll Lock"
fi




   Теперь, если клавиша Scroll Lock выключена (в скрипте, также, еще и назначается состояние оной), у меня будет задействована комбинация раскладок US,UA с переключением между ними сочетанием клавиш ctrl_shift (можно вместо прописать свою /свое сочетание)  и с выводом сообщения на экран "Keyboard :US,UA", а если клавиша включена то будет задействована комбинация раскладок US,RU с переключением между ними сочетанием клавиш ctrl_shift и с выводом сообщения на экран "Keyboard :US,RU". Осталось дело за малым, прицепить ее куда-то. Немножко поразмышляв, я решил прицепить этот скрипт к ней же, к Scroll Lock, ведь что делает скрипт? Он проверяет, состояние клавиши, т.е. при нажатии сначала сигналы идут аппаратно, а потом система при помощи скрипта проверяет состояние клавиши, которое на аппаратном уровне уже находится в определенной позиции.



   В итоге, все работает, как и планировалось, создал файлик с именем xkb_Scroll.sh, добавил в него содержимое и получился - скриптик, при помощи контекстного меню сделал его исполняемым, разместил в домашней папке (можно разместить где угодно, в /usr/bin , например), добавил его в автозагрузку (Панель управления - Сеансы и запуск - Автозапуск), потом назначил клавишу запуска скрипта - Scroll Lock, чтобы в процессе работы можно было переключаться между комбинациями раскладок...


   Вот и все, теперь при загрузке проверяется состояние клавиши Scroll Lock, устанавливается соответствующая положению комбинация раскладок и выводится сообщение на экран, а при нажатии Scroll Lock эта комбинация меняется. Испытав это у себя, выяснилось, что указанная в скрипте комбинация клавиш смены раскладки в Xubuntu/MintXFCE не работает в случае, если не задействовать штатные средства переключения раскладки (в МАТЕ и LXDE работает как и задумано). Я добавил на панель соответствующий апплет, добавил к английской русскую раскладку (в принципе, не важно какую), назначил свое сочетание переключения раскладок (ctrl_shift), так или иначе нам все равно нужна индикация, тем более здесь можно настроить действие (глобально, для окна, для каждого приложения). Вот теперь все, теперь при наборе текста (и в данный момент тоже), у меня задействованы только две раскладки, а при необходимости -- нажимаю Scroll Lock и получаю другие.  Не знаю как кому, а мне стало намного удобнее работать.

На некоторых моделях ноутбуков клавиша Scroll Lock отсутствует, решением может быть назначение горячих клавиш для каждой комбинации раскладок отдельно.

PS. Если у кого есть другие интересные решения в использовании более 2-х раскладок, милости прошу, тема актуальна всегда.