Будучи программистом, я много печатаю как код программ, так и технические тексты. Мне постоянно приходиться переключаться между раскладками, часть текста набирать на английском языке, а часть на русском. И в принципе это нормально, если бы не спецсимволы.
По какому-то странному стечению обстоятельств в русской раскладке отсутствуют даже такие символы, как больше/меньше или фигурные скобки (хорошо, что хоть плюс с минусом не забыли). И приходиться переключаться для их набора.
Решено было избавиться от этой проблемы. Собственно разработать саму раскладку (по сути две) и сформировать установочные пакеты для операционных систем.
Я постараюсь описать с помощью каких средств создаются раскладки, свои размышления по их разработке и с какими проблемами приходиться сталкиваться. Статья имеет практический уклон, а не научный. Здесь не будет статистики по подсчёту часто встречающихся символов, словосочетаний и чередованию рук.
Разработка раскладки
Начальные требования к раскладкам:
удобство набора технических текстов и кодов программ;
полный набор спецсимволов;
одинаковое расположение спецсимволов для раскладок;
переключаться должны именно раскладки, а не языки ввода.
В разработке, лёгких для восприятия, раскладок есть ограничения. Первое - это число клавиш, а второе - уже нанесённые символы на клавиши. Существуют раскладки, позволяющие заметно ускорить печать слепым методом, использовать больше символов, но к сожалению производители выпускают клавиатуры только с 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)», загружается «Русская» раскладка и вносятся изменения, после чего создаётся установочный пакет.
Далее готовый пакет просто устанавливается в систему. Для Русского языка выбираются нужные раскладки, а Английский язык удаляется. После настраиваются клавиши переключения и приоритет.
Всё просто, но ложка дёгтя присутствует. В Windows могут появляться штатные раскладки. Проблема общая, мы просто с ней не сталкивались. Например, у Американцев появляется Британская раскладка. Решение проблемы - перейти в "Настройки языка" - "Административные параметры" и применить раскладки для "Экран приветствия и учётных записей". А также в настройках реестра для каталога "Компьютер\HKEY_USERS.DEFAULT\Keyboard Layout\Preload" выключить наследование и указать для всех права только на чтение.
Также знак «₽» отсутствует в раскладке для Windows т.к. является символом юникода, а в Windows раскладка базируется на CP-1251.
Разработка и создание установочных пакетов для Linux
И тут самая большая загвоздка (кто бы мог подумать) - нет возможности определить свои раскладки в каталоге «/etc». А если и есть, то Gnome напрочь отказывается их от туда считывать. Т.е. можно поменять только системные файлы в каталоге «/usr/share/X11/xkb». И они конечно затруться при очередном системном обновлении. Как-то не в духе «базар».
Но всё же, вот как можно добавить свою раскладку в Linux:
Описать раскладку в файле «/usr/share/X11/xkb/symbols/ru». Файл имеет достаточно простой синтаксис и множество примеров. Главное знать, что есть «VoidSymbol» и «NoSymbol». Первый означает, что ввод будет игнорироваться, а второй - что ввод определяется раскладкой, от которой мы наследуемся.
Зарегистрировать раскладку в файлах «base.xml» и «evdev.xml» каталога «/usr/share/X11/xkb/rules/» (это для современных приложений).
Зарегистрировать раскладку в файлах «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