Русская инженерная раскладка (Ручей)

Будучи программистом, я много печатаю как код программ, так и технические тексты. Мне постоянно приходиться переключаться между раскладками, часть текста набирать на английском языке, а часть на русском. И в принципе это нормально, если бы не спецсимволы.

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

Решено было избавиться от этой проблемы. Собственно разработать саму раскладку (по сути две) и сформировать установочные пакеты для операционных систем.

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

Разработка раскладки

Начальные требования к раскладкам:

  • удобство набора технических текстов и кодов программ;

  • полный набор спецсимволов;

  • одинаковое расположение спецсимволов для раскладок;

  • переключаться должны именно раскладки, а не языки ввода.

В разработке, лёгких для восприятия, раскладок есть ограничения. Первое - это число клавиш, а второе - уже нанесённые символы на клавиши. Существуют раскладки, позволяющие заметно ускорить печать слепым методом, использовать больше символов, но к сожалению производители выпускают клавиатуры только с QWERTY и ЙЦУКЕН раскладками (про «кастомные» поговорим отдельно).

Удобство набора, также зависит от языка программирования, но всё же в первую очередь нужно обратить внимание на «C-подобные» языки и такие, как JSP, HTML, XML, JSON т.к. они имеют большое количество спецсимволов.

Отсюда еще требования:

  • раскладка не должна решать проблему скорости набора, т.е. все буквы остаются на своих местах. В конце концов, Дворак потратил 20 лет, а в результате мы видим QWERTY на клавиатурах;

  • спецсимволам также желательно находиться на своих местах, но при этом должен быть обеспечен удобный набор часто встречаемых спецсимволов в коде;

  • перенос спецсимоволов должен компенсироваться их лёгким запоминанием;

  • не должен стратать опыт набора методом «слепой печати».

Разумеется, чтобы вместить все спецсимволы в Русской раскладке, необходимо использовать третий уровень. Первый уровень идёт без модификаторов, второй - с нажатым Shift, третий - с нажатым AltGr (он же правый Atl, он же левый Ctrl + левый Alt).

Самый простой вариант - это вынос цифр в третий уровень и размещение на первом самых встречающихся спецсимволов. Правда он приводит к тому, что набор большого диапазона цифр (например ip-адреса) превращается в ад, а большой палец очень часто находится в подвёрнутом состоянии и начинает болеть.

Вот тут-то кажется и подошла бы «кастомная» клавиатура с дополнительным рядом под цифры, но, как оказалось, дополнительного ряда символов нет ни у кого: только фан и светодиоды, а изготавливать самому, да еще и контроллер выдумывать в планы не входит. Отмечу, что и драйвер под Windows, и описание в Linux, и раскладку придётся делать всё равно.

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

Пришлось подходить неформально и подбирать «удобные» варианты. За основу решено взять Русскую раскладку, составленные требования и перебор возможных вариантов (по сути их не так много). А позже применить замечания от коллег по работе и по духу (в надежде, что они будут).

Подробный порядок изменения расположения символов

1) Буквы, цифры, точка, запятая оставлены на своём месте.

2) В цифровом ряду на третий уровень вынесены «@» «#» «$» «%» «^» «&», к тому же эти символы обычно не парные и после их ввода идёт некая задержка. Редко используемый «№» переехал на третий уровень цифры «1». Знак «~» переехал на третий уровень цифры «8», удобство набора комбинации «~/» оказалось вполне сносным.

3) Косая черта «/» была размещена на первом уровне, т.к. встречается в дробях, путях, закрывающихся тэгах. Обратная косая черта «\» вынесена на второй уровень, а прямая «|» - на третий.

4) При наборе фигурных и квадратных скобок, а так же символов меньше и больше, во время «слепой печати», оказалось удобным переносить кисть так, чтобы маркером являлась не клавиша «О», а правый Alt (AltGr). Т.е. кисть смещается, как если бы была необходимость воспользоваться стрелками. По сути так и есть, ведь при наборе сначала печатается пара скобок, а потом их содержимое. Но чтобы перейти в место ввода содержимого нужно нажать «←».

5) Фигурные скобки оставлены на своих клавишах, но перенесены на третий уровень. Квадратные скобки перенесены на третий уровень клавиш «Ж» и «Э». Знаки больше-меньше или угловые скобки, оставлены на своих клавишах, но перенесены на третий уровень.

6) На второй уровень цифрового ряда вынесены «`», «'», «"», «;» Причём двойные кавычки перенесены с безымянного пальца на средний, а точка запятой перенесена с среднего на указательный для компенсации скорости набора кода для «С-подобных» языках.

7) На третий уровень цифр «9» и «0» добавлены символы « и », а на клавишу «Ё» добавлен знак рубля «₽» (в Windows символ недоступен т. к. для раскладки на основе «Русской» отсутствует поддержка юникода).

В итоге получилось, что на клавишах будут отсутствовать подсказки только для символов: «№», «`», «'», «"», «;», «~», «[»,«]» (опционально ₽, «, »). Всего 8 символов! Причём они часто встречаются, так что запомнить их расположение легче лёгкого.

Результатом я остался доволен. Расположение спецсимволов быстро запомнилось, а набор через AltGr оказался вполне сносным, даже для кода с бесконечными «{», «}». Я даже отказался от идеи заказать наклейки со спецсимволами на клавиши: настолько это просто.

Раскладки решено назвать «Ручей».

«Русская (инженерная, кириллица)»
«Русская (инженерная, кириллица)»
«Русская (инженерная, латиница)»
«Русская (инженерная, латиница)»

Разработка и создание установочных пакетов для Windows

Для создания используется программа «Microsoft Keyboard Layout Creator (MSKLC)», загружается «Русская» раскладка и вносятся изменения, после чего создаётся установочный пакет.

Просмотр раскладки в MSKLC с зажатым AltGr
Просмотр раскладки в MSKLC с зажатым AltGr

Далее готовый пакет просто устанавливается в систему. Для Русского языка выбираются нужные раскладки, а Английский язык удаляется. После настраиваются клавиши переключения и приоритет.

Всё просто, но ложка дёгтя присутствует. В Windows могут появляться штатные раскладки. Проблема общая, мы просто с ней не сталкивались. Например, у Американцев появляется Британская раскладка. Решение проблемы - перейти в "Настройки языка" - "Административные параметры" и применить раскладки для "Экран приветствия и учётных записей". А также в настройках реестра для каталога "Компьютер\HKEY_USERS.DEFAULT\Keyboard Layout\Preload" выключить наследование и указать для всех права только на чтение.

Также знак «₽» отсутствует в раскладке для Windows т.к. является символом юникода, а в Windows раскладка базируется на CP-1251.

Разработка и создание установочных пакетов для Linux

И тут самая большая загвоздка (кто бы мог подумать) - нет возможности определить свои раскладки в каталоге «/etc». А если и есть, то Gnome напрочь отказывается их от туда считывать. Т.е. можно поменять только системные файлы в каталоге «/usr/share/X11/xkb». И они конечно затруться при очередном системном обновлении. Как-то не в духе «базар».

Но всё же, вот как можно добавить свою раскладку в Linux:

  1. Описать раскладку в файле «/usr/share/X11/xkb/symbols/ru». Файл имеет достаточно простой синтаксис и множество примеров. Главное знать, что есть «VoidSymbol» и «NoSymbol». Первый означает, что ввод будет игнорироваться, а второй - что ввод определяется раскладкой, от которой мы наследуемся.

  2. Зарегистрировать раскладку в файлах «base.xml» и «evdev.xml» каталога «/usr/share/X11/xkb/rules/» (это для современных приложений).

  3. Зарегистрировать раскладку в файлах «base.lst» и «evdev.lst» каталога «/usr/share/X11/xkb/rules/» (это для совместимости).

В сущности после перезагрузки раскладки будут доступны в настройках ввода. Также необходимо указать, что AltGr является переключателем на третий уровень.

Для применения раскладок в консоли необходимо изменить файл «/etc/default/keyboard»:

XKBMODEL="pc104"
XKBLAYOUT="ru,ru"
XKBVARIANT="ruchey_latin,ruchey_cyrillic"
XKBOPTIONS="grp:caps_toggle,lv3:ralt_switch,grp_led:scroll"
BACKSPACE="guess"

И выполнить команду: dpkg-reconfigure -phigh console-setup или update-initramfs -u

Для применения раскладок в initramfs необходимо изменить файл «/etc/initramfs-tools/initramfs.conf»:

KEYMAP=y

И выполнить команду: update-initramfs -u

Повторюсь, что самая большая проблема в том, что при очередном системном обновлении xkb* все настройки будут перезаписаны, и есть только один путь — это добавить свою раскладку в исходный код проекта «freedesktop.org», репозиторий «xkeyboard-config».

Поэтому для набора раскладок «Ручей» разработан инсталлятор, который можно просто запускать после обновлений системы.

Как итог

С ограничениями, но задача выполнима. Раскладка получилась, сделан установочный пакет для Windows и скрипт-инсталлятор для Linux.

Хочется отметить, что на момент написания статьи я во всю пользуюсь этой раскладкой как в Windows, так и в Linux, пишу код на C#, JS, Bash, работаю по RDP.

Огромная просьба читателей присоединиться и протестировать раскладку. Проще простого установить два пакета в Windows и как только надоело удалить их. Если раскладка понравилась и есть возможность, то попробуйте реализовать для Mac OS. Исходный код свободный и распространяется без лицензии (The Unlicense).

Недостатки, фантомные нажатия, дискомфорт, описывайте в комментариях или в issue репозитория. Позже я постараюсь сделать pull request в основной репозиторий Freedesktop.

Репозиторий на GitHub, где ведётся разработка раскладки: Ruchey