RuEn раскладка для беспроводных клавиатур
Содержание
Если вы хотя бы раз задавались вопросом, почему на русском и английском языках такие частые символы как точка и запятая расположены на разных клавишах, или почему на русском нельзя напечатать фигурную скобку, подход RuEn позволяет решить это недоразумение, унифицируя положение символов на русской и английской раскладке.
Расположить символы можно одинаково и на любом другом языке, русским и английским языками подход не ограничен.
Основная идея
В целом печать какого либо символа работает так: клавиатура отправляет информацию, что была нажата клавиша в определенной позиции, а ОС принимает это нажатие, и в зависимости от того, какая сейчас раскладка в ОС, напечатает нужный символ. Рассмотрим на примерах.
На клавиатуре нажата клавиша “KC_Q”
- если в ОС выбрана стандартная английская раскладка, то напечатается буква “Q”;
- если в ОС выбрана стандартная русская раскладка, то напечатается буква “Й”.
Наличие разных букв в разных раскладках по большей части привычное дело, хотя существуют и фонетические раскладки, при которых, например букву “О” располагают в русском и английском на одном месте, это позволяет снизить когнитивную нагрузку на запоминание разных раскладок, но слова в русском и английском строятся по-разному, и в удобстве печати фонетическая раскладка будет уступать.
На клавиатуре нажата клавиша “SLASH”
- если в ОС выбрана стандартная английская раскладка, то напечатается слэш “/”;
- если в ОС выбрана стандартная русская раскладка, то напечатается точка “.”.
На клавиатуре нажата клавиша “DOT”
- если в ОС выбрана стандартная английская раскладка, то напечатается точка “.”;
- если в ОС выбрана стандартная русская раскладка, то напечатается буква “Ю”.
На клавиатуре нажата клавиша “LEFT_BRACE”
- если в ОС выбрана стандартная английская раскладка, то напечатается символ “{”;
- если в ОС выбрана стандартная русская раскладка, то напечатается буква “Х”.
Проблематика обозначена - в стандартных раскладках ОС точка, и многие другие символы, печатаются совсем разными клавишами, а некоторых символов, как например “{” в русской раскладке нет вовсе. Рассмотрим возможные решения задачи унификации расположения символов. Решить можно двумя способами:
- на стороне ОС, установив на компьютер раскладку, в которой символы находятся на одной клавише, например https://github.com/braindefender/universal-layout, но тут стоит учитывать, что устанавливать раскладку надо на каждый компьютер, также как и на удаленные рабочие столы к которым подключаетесь;
- на стороне клавиатуры, настроив раскладку с использованием подхода RuEn, тут также есть минус в том, что эти настройки находятся именно в клавиатуре и на встроенной клавиатуре ноутбука символы на разных языках будут находиться на разных клавишах.
Далее в статье рассказано о способе решения задачи на стороне клавиатуры с использованием подхода RuEn.
С чего начать
Для клавиатур Ergohaven подготовлены раскладки, содержащие в себе нужные для настройки макросы, эти раскладки имеют постфикс _ruen в названии.

Можно взять ruen раскладку за основу, или если у вас уже есть много наработок в своей раскладке, просто создать в ней такие же макросы и создать отдельные слои для каждого языка.
При переносе макросов в свою раскладку обратите внимание также на параметры макросов, отображаемые при нажатии на кнопку с иконкой гаечного ключа, важно не забыть перенести настройки
Wait (ms)иTap (ms).
Макросы в раскладке ruen ориентированы на использование сочетаний для безусловного переключения языка, Ctrl + Shift + 1 для включения английского языка, и Ctrl + Shift + 2 для включения русского языка (аналог режима RuEn M1M2 из Vial). Такой подход требует дополнительной настройки на стороне ОС, но при этом сильно упрощает синхронизацию языка в клавиатуре с языком в ОС. Если же такой подход переключения языка Вам по какой-то причине не подходит, подход ruen неплохо уживается и со стандартным сочетанием клавиш GUI + Space, подробнее описано в разделе Переключение языка по модели тоггл (аналог режимов RuEn M0 и RuEn Default из Vial).
Как работает RuEn
Поделим символы на 2 группы и разберем отдельно каждую.
Символы, которые встречаются в обоих языках
Первая группа - символы, которые встречаются в обоих языках, но расположены на разных клавишах, как например точка или знак вопроса.
Для объединения расположения таких символов нам нужно каким-то образом дать клавиатуре понять, какой сейчас язык в ОС, чтобы клавиатура нажала соответствующую языку клавишу. Например, если мы хотим унифицировать положение точки, то на русском языке клавиатуре надо отправить в ОС нажатие клавиши SLASH, а на английском DOT.
Для решения этой задачи отлично подходит функционал слоев, мы можем настроить так, чтобы одновременно с переключенем языка в ОС, переключался и слой в клавиатуре, и тогда он будет выполнять функцию переменной, в зависимости от этой переменной и отправится код нужной клавиши.
В качестве описанной ранее переменной, в раскладке ruen имеются 2 отдельных слоя en и ru. Чтобы расположить точку на одну и ту же клавишу делаем следующие действия:
- На слое en назначаем на нужную клавишу поведение
&kp DOT

- На слое ru на эту же позицию назначаем поведение
&kp SLASH

- Для переключения языка надо использовать только макросы
&layer_enи&layer_ru. Макрос&layer_ruотправит в ОС сочетание клавишCtrl + Shift + 2, таким образом ОС переключится на русский язык и одновременно с этим клавиатура переключится на слой ru, таким образом ОС и клавиатура будут синхронно находиться на русской раскладке, аналогично макрос&layer_enотправит в ОС сочетаниеCtrl + Shift + 1для включения английской раскладки, и переключит клавиатуру на слой en.

В раскладке ruen по умолчанию эти макросы назначены на комбо клавиш “E” + “R”. Находясь на ru слое нажатие комбо “E” + “R” переключит язык в ОС на английский и сменит слой на en, а находясь на en слое при нажатии комбо произойдет обратное, язык в ОС переключится на русский, слой сменится на ru.

Макросы
&layer_enи&layer_ruможно назначить на любое место в раскладке, например на две разные клавиши или два разных комбо “E” + “R” и “U” + “I”.
Цель достигнута, теперь точка печатается на обоих языках нажатием одной и той же клавиши.

Символы, которые встречаются только в одном из языков
Вторая группа - символы, которые есть в раскладке только одного из языков, например символ “&” есть только на английской раскладке. Чтобы напечатать символ из этой группы, находясь на русской раскладке, надо сделать следующие действия:
Переключить язык в ОС на английский нажатием
Ctrl + Shift + 1;Нажать сочетание клавиш для печати символа, в случае с символом
&, это сочетание клавишShift + 7;Переключить язык в ОС обратно на русский нажатием
Ctrl + Shift + 2.
Все эти действия содержит в себе параметризованный макрос &en из ruen раскладки. Просто назначаем макрос на клавишу на слое ru, и в качестве параметра указываем кейкод AMPS, либо сочетание клавиш Shift + 7.
В некоторых ситуациях может оказаться полезным удержать клавишу с символом нажатой, и макрос
&enизruenраскладки корректно обработает это нажатие, зажав символ в английской раскладке.

Но что делать, если сейчас включен английский язык, ведь если мы используем этот макрос на нем, то напечатается символ “&” и последним шагом язык переключится на русский? С решением этой проблемы нас снова выручает функционал слоев в клавиатуре. Находясь на английском языке для того чтобы напечатать этот символ нет необходимости в переключении на другой язык, и мы просто можем назначить стандартное поведение &kp AMPS на нужную клавишу.
Символов, которые есть только на русской раскладке, не очень много, и макроса под них в раскладке
ruenнет, но если вдруг Вы хотели бы печатать символ “№” на любой раскладке, то можете создать макрос&ruскопировав макрос&enи поменяв местами сочетания клавиш для переключения языка в ОС.
Символьный слой
На базовых слоях ru и en кнопок под все нужные символы конечно же не хватит, да и в целом символы может быть удобнее расположить на отдельном символьном слое, чтобы применить подход ruen для создания отдельного символьного слоя потребуется создать 2 отдельных слоя, один для печати символов, находясь на русском языке, и второй, для печати символов, находясь на английском языке. В раскладке ruen по умолчанию это слои sym_en и sym_ru.

Чтобы соблюсти синхронизацию языков в ОС и клавиатуре переход на sym_ru должен происходить с слоя ru, а на sym_en с слоя en, таким образом клавиатура будет понимать, какой сейчас активен язык, и для печати символа будет отправлять соответствующие текущему языку действия.

Для переключения на языковые символьные слои также отлично подойдет поведение
&sl, активирующее символьный слой на одно нажатие, и после возвращает пользователя на предыдущий активный слой, при необходимости такую клавишу можно зажать и она будет работать как обычный&mo.
Отображение кириллицы в keymap-editor
Для удобства модификации раскладки в прошивке ruen добавлены кейкоды алиасы, такие как RU_COMMA или RU_CYRILLIC_TSE, отображающие на раскладке символы русской раскладки, при этом при нажатии RU_COMMA в ОС передастся скан-код SC_SLASH так как в стандартной раскладке ЙЦУКЕН точка находится на клавише слэш.

Эти кейкоды облегчают визуальное понимание раскладки, при этом RU_COMMA это просто алиас для кейкода SLASH, и если при нажатии RU_COMMA в ОС включена английская раскладка, то напечатается буква слэш.
С этими кейкодами-алиасами очень удобно настраивать раскладки, отличные от ЙЦУКЕН.

Переключение языка по модели тоггл
Полноценной работы RuEn можно добиться и используя стандартные сочетания клавиш для переключения языка в ОС, такие как GUI + Space, Ctrl + Space. Чтобы этого достичь при нажатии сочетания клавиш переключения языка мы также должны и переключать слой в клавиатуре.
Как это реализовать рассмотрим на примере с сочетанием GUI + Space.
Первым шагом создадим макрос &lg_tog, состоящий из двух действий - нажатия GUI + Space и &tog 1. &tog 1 включит слой ru, если мы находимся на слое en, и обратно, включит en, если сейчас активен ru. Таким макросом мы одновременно тогглим и язык в ОС, и слой в клавиатуре.

Далее, чтобы выходить из ситуаций, когда на клавиатуре включен слой ru, а в ОС английский язык, нам нужен способ синхронизации состояния языков. Для этого Вы можете назначить на одну из клавиш поведение &tog 1, и когда произошла рассинхронизация - просто нажмите эту клавишу и состояния снова синхронизируются.
Подход по модели тоггл не является предпочтительным как раз из-за необходимости отдельно синхронизировать состояния языка ОС с клавиатурой. Имея 2 отдельных сочетания клавиш для языков, синхронизация происходит регулярно, при нажатии
&layer_enили&layer_ru.
Следующим шагом сделаем так, чтобы при нажатии на клавиатуре сочетания GUI + Space, срабатывал созданный ранее макрос &lg_tog, для этого нам пригодится поведение mod-morph из ZMK.
- Создадим новое кастомное поведение типа Mod Morph Behavior;
- Назовем его “lg_space”;
- При нажатии
&lg_spaceбез модификатора “LGUI” сработает действиеNORMALи нажмется&kp SPACE; - Если при нажатии
&lg_spaceбыл зажат модификатор “LGUI”, то сработаетMODIFIEDи вызовется макрос&lg_tog.

Также нам необходимо изменить сочетание клавиш смены языка в макросах &to_ru и &to_en, так как эти макросы задействованы в макросе &en, используемом для печати символов.

Последним шагом назначаем созданный mod-morph вместо обычного пробела на нужных слоях, и все, состояние языков в ОС и клавиатуре будет синхронно переключаться.
На Android устройствах для переключения языка также используется сочетание клавиш
GUI + Space, если выберете этот способ переключения, то ruen будет работать также на телефоне и планшете.
Переключение по GUI + Space без необходимости синхронизации
Избавиться от необходимости ручной синхронизации языков при использовании переключения по нажатию GUI + Space возможно с помощью гибрида переключения по модели тоггл и переключения отдельными сочетаниями клавиш, как это сделано с комбо в раскладке ruen по умолчанию, все еще потребуется настроить отдельные сочетания в ОС, но для переключения языка можно будет нажимать привычное сочетание клавиш.
Настраиваем в ОС сочетания клавиш Ctrl + Shift + 1 для включения английского языка, и Ctrl + Shift + 2 для включения русского и создаем два mod-morph поведения:
&en_space: без модификаторов нажатие&kp Space, с модификаторомLGUIвызов макроса&layer_en;&ru_space: без модификаторов нажатие&kp Space, с модификаторомLGUIвызов макроса&layer_ru.

Далее назначаем на en слое вместо &kp Space поведение &ru_space, на ru слое вместо &kp Space поведение &en_space. Теперь при нажатии GUI + Space язык будет переключаться в ОС и одновременно производиться синхронизация языка в клавиатуре.
Комбо
Реализовать печать символов с любого языка в комбо нам поможет настройка слоев, на которых это комбо активно.
Создадим комбо, печатающее символ “#”, при нажатии на клавиши “N” + “M”.
Чтобы реализовать ruen поведение в случае с символом “#” нам потребуется создать 2 отдельных комбо: одно будет описывать действия, необходимые для печати символа если сейчас активен русский язык, второе комбо будет описывать действия, в случае если сейчас активен английский язык.
- Комбо для русского языка. Для печати символа “#” на русском языке нам потребуется макрос
&enтак как “#” нет на русской раскладке, выберем макрос и в параметре передадим кейкодHASH. Чтобы задать слои, на которых комбо активно, надо нажать кнопку с иконкой гаечного ключа, нажмем ее и выберем слои ru и sym_ru.

- Комбо для английского языка. Символ “#” есть в английской раскладке, в качестве действия для комбо назначим обычны
&kp HASH. Также настроим чтобы комбо было активно только на слоях en и sym_en.

Макросы
Макросы также отлично сочетаются с подходом ruen, позволяя печатать символьные конструкции, или шаблоны из текста независимо от текущего языка.
Рассмотрим на примере макроса, который напечатает две фигурные скобки {}, и нажмёт стрелку влево для перемещения курсора между скобками.
Чтобы печатать фигурные скобки независимо от языка, нам потребуется создать два отдельных макроса под каждый язык.

Вызов макроса назначим на комбо клавиш “J” + “L”, такое расположение будет несложно запомнить, ведь фигурные скобки на символьном слое находятся на этих же местах.

Если использование комбо неудобно, Вы можете просто назначить эти макросы на подходящие клавиши на соответствующих языковых слоях.
Создаем комбо, настраиваем слои, на которых это комбо активно, и все, фигурные скобки доступны на любом языке на базовом слое!
Также удобным может оказаться использование аналогичных комбо для квадратных скобок, круглых скобок (круглые скобки находятся на одинаковых местах в обоих языках и не требуют создания 2 макросов) и двойных кавычек.

Caps Word на русской раскладке
В ZMK есть встроенное поведение Caps Word, на данный момент оно отлично работает на английском языке, но, к сожалению, с русскими буквами возникают проблемы, ведь буква “Б” расположена на клавише DOT, и хоть мы и можем настроить, чтобы Caps Word не прерывался после нажатия этой буквы, но заглавную “Б” с штатны Caps Word напечатать не получится. Однако есть возможность имитировать эту функцию с помощью слоёв.
Для воссоздания поведения Caps Word потребуется:
- Продублировать слой ru, удобнее всего это сделать в keymap-editor, нажав ••• -> Duplicate layer.

- Всем клавишам, печатающим буквы, добавить модификатор
LShift. Таким образом, попав на этот слой, все напечатанные буквы будут заглавными.

- В примере рассмотрим активацию режима Caps Word по нажатию комбо клавиш “C” + “V”. Для слоя en создадим комбо со стандартным поведением
&caps_word, комбо должно активироваться только на слое en. Для слоя ru создадим комбо с поведением&tog 2(2 - номер слоя cw_ru), на клавиши “C” + “V”, ограничим чтобы это комбо срабатывало только на слоях ru и cw_ru.

Для воссоздания активации Caps Word по нажатию
LShift+RShift, как в проводных клавиатурах на QMK, можно воспользоваться поведением mod-morph.
- Далее сделаем так, чтобы после нажатия пробела слой cw_ru выключался, для этого создадим параметризованный макрос
&cw_off. Первым действием макрос вернет клавиатуру на слой ru нажатием&to 1, вторым действием нажмет переданный в параметре символ.

Назначаем на слое cw_ru на место &kp SPACE созданный макрос &cw_off, указав в параметре пробел, и все, мы воссоздали поведение Caps Word для русского языка.
Аналогичным образом можно воссоздать и фичу
RuEn wordиз реализации RuEn в QMK, просто создаем отдельный слой для этой фичи, выделяем клавишу для переключения на этот слой, и также клавишу, которая этот слой выключит. Также можно реализовать, например,Num Wordдля ввода нескольких цифр и переключения обратно на буквенный слой, может пригодиться, если часто вводите IP-адреса, ведь можно настроить так, чтобы слойNum Wordне выключался при нажатии точек.