Будучи программистом, я много печатаю как код программ, так и технические тексты. Мне постоянно приходится переключаться между раскладками, часть текста набирать на английском языке, а часть на русском. И в принципе это нормально, если бы не спецсимволы.
По какому-то странному стечению обстоятельств в русской раскладке отсутствуют даже такие символы, как больше/меньше или фигурные скобки (хорошо, что хоть плюс с минусом не забыли). И приходится переключаться для их набора.
Решено было избавиться от этой проблемы. Собственно разработать саму раскладку (по сути две) и сформировать установочные пакеты для операционных систем.
Я постараюсь описать с помощью каких средств создаются раскладки, свои размышления по их разработке и с какими проблемами приходится сталкиваться. Статья имеет практический уклон, а не научный. Здесь не будет статистики по подсчёту часто встречающихся символов, словосочетаний и чередованию рук.
Кому не интересен сам процесс создания, но есть желание попробовать:
- для Windows 7 и выше: win-ruchey-1.2.0.zip
- для Debian / Ubuntu: xkb-ruchey_1.2.0_all.deb
Разработка раскладки
Начальные требования к раскладкам:
удобство набора технических текстов и кодов программ;
полный набор спецсимволов;
одинаковое расположение спецсимволов для раскладок;
переключаться должны именно раскладки, а не языки ввода.
В разработке, лёгких для восприятия раскладок есть ограничения. Первое - это число клавиш на клавиатуре, а второе - уже нанесённые символы на клавиши. Существуют раскладки, позволяющие заметно ускорить печать слепым методом, использовать больше символов, но к сожалению производители выпускают клавиатуры только с QWERTY и ЙЦУКЕН раскладками (про «кастомные» поговорим отдельно).
Удобство набора также зависит от языка программирования, но всё же в первую очередь нужно обратить внимание на «C-подобные» языки и такие, как JSP, HTML, XML, JSON т.к. они имеют большое количество спецсимволов.
Отсюда еще требования:
раскладка не должна решать проблему скорости набора, т.е. все буквы остаются на своих местах. В конце концов, Дворак потратил 20 лет, а в результате мы видим QWERTY на клавиатурах;
спецсимволам также желательно находиться на своих местах, но при этом должен быть обеспечен удобный набор часто встречаемых спецсимволов в коде;
перенос спецсимволов должен компенсироваться их лёгким запоминанием;
не должен страдать опыт набора методом «слепой печати».
Разумеется, чтобы вместить все спецсимволы в Русской раскладке, необходимо использовать третий уровень. Первый уровень идёт без модификаторов, второй - с нажатым Shift, третий - с нажатым AltGr (он же правый Atl, он же левый Ctrl + левый Alt).
Самый простой вариант - это вынос цифр в третий уровень и размещение на первом самых встречающихся спецсимволов. Правда он приводит к тому, что набор большого диапазона цифр (например ip-адреса) превращается в ад, а большой палец очень часто находится в подвёрнутом состоянии.
Вот тут-то кажется и подошла бы «кастомная» клавиатура с дополнительным рядом под цифры, но, как оказалось, дополнительного ряда символов нет ни у кого: только фан и светодиоды, а выдумывать самому, да еще и контроллер изготавливать в планы не входит. Отмечу также, что и драйвер под Windows, и описание в Linux, и раскладку придётся делать всё равно.
Формальный, автоматизированный подход (подсчёт часто встречающихся символов, включение во внимание максимального чередования рук и т.д.) не привёл к вменяемому результату, а только к каше в голове и на клавиатуре. Для выполнения требования, чтобы спецсимволы находились в основном на своих местах нужно было вводить такое число ограничений, что решение всё равно в итоге выглядело неформальным.
Пришлось подходить неформально и подбирать «удобные» варианты. За основу решено взять Русскую раскладку, составленные требования и перебор возможных вариантов (по сути их не так много). А позже применить замечания от коллег по работе и по духу (в надежде, что они будут).
Подробный порядок изменения расположения символов
1) Буквы, цифры, точка, запятая, оставлены на своём месте.
2) В цифровом ряду на третий уровень вынесены «@» «#» «$» «%» «^» «&», к тому же эти символы обычно не парные и после их ввода идёт некая задержка. Знак «~» переехал на третий уровень цифры «8», удобство набора комбинации «~/» оказалось вполне сносным.
3) На втором уровне цифрового ряда одинарная кавычка заменила двойную, а двойная перенесена на клавишу с цифрой 5. Это позволило довольно сносно набирать строки в «С-подобных» языках.
4) Косая черта «/» была размещена на первом уровне, т.к. встречается в дробях, путях, закрывающихся тэгах. Обратная косая черта «\» вынесена на второй уровень, а прямая «|» - на третий.
5) Фигурные скобки оставлены на своих клавишах, но перенесены на третий уровень. Квадратные скобки перенесены на третий уровень клавиш «Ж» и «Э». Знаки больше-меньше или угловые скобки, оставлены на своих клавишах, но перенесены на третий уровень.
6) При наборе фигурных и квадратных скобок, а так же символов меньше и больше, во время «слепой печати», оказалось удобным переносить кисть так, чтобы маркером являлась не клавиша «О», а правый Alt (AltGr). Т.е. кисть смещается, как если бы была необходимость воспользоваться стрелками. По сути так и есть, ведь при наборе сначала печатается пара скобок, а потом их содержимое. Но чтобы перейти в место ввода содержимого нужно нажать «←».
7) На третий уровень цифр «9» и «0» добавлены символы « и », на клавишу «Ё» добавлен знак параграфа «§», а на цифру «1» знак рубля «₽» (в Windows символ недоступен т. к. для раскладки на основе «Русской» отсутствует поддержка юникода).
8) Обратный апостроф (косая кавычка) добавлен на третий уровень клавиши с символом точки, что, как и в случае со знаком больше/меньше, набирается достаточно легко.
В итоге, после доработок, при полном наборе спецсимволов, как для Русской раскладки, так и для Английской, необходимо запомнить расположение всего 6 символов! Т.е. на клавишах отсутствуют подсказки только для символов: «'», «"», «`», «~», «[»,«]». Причём они часто набираются, так что запомнить их расположение легче лёгкого. Опционально добавлены символы §, ₽, «, », которые при необходимости также легко запоминаются.
Результат оказался приемлемый. Расположение спецсимволов быстро запомнилось, а набор через 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
(для Debian / Ubuntu) или update-initramfs -u
(для остальных).
Для применения раскладок в initramfs необходимо изменить файл «/etc/initramfs-tools/initramfs.conf»:
KEYMAP=y
И выполнить команду: update-initramfs -u
Повторюсь, что самая большая проблема в том, что при очередном системном обновлении xkb* все настройки будут перезаписаны, и есть только один правильный путь — это добавить свою раскладку в исходный код проекта «freedesktop.org», репозиторий «xkeyboard-config».
Для набора раскладок «Ручей» разработан пакет с хуком, который автоматически патчит файлы xkb после установки обновлений Debian / Ubuntu.
Как итог
С ограничениями, но задача выполнима. Раскладка получилась, сделан установочный пакет для Windows и Linux (Debian / Ubuntu).
Хочется отметить, что на момент написания статьи я во всю пользуюсь этой раскладкой как в Windows, так и в Linux, пишу код на C#, JS, Java, Bash, работаю по RDP.
Огромная просьба читателей присоединиться и протестировать раскладку. Проще простого установить два пакета в Windows и как только надоело удалить их. Если раскладка понравилась и есть возможность, то попробуйте реализовать для Mac OS. Исходный код свободный и распространяется без лицензии (The Unlicense).
Недостатки, фантомные нажатия, дискомфорт, описывайте в комментариях или в issue репозитория. Позже я постараюсь сделать pull request в основной репозиторий Freedesktop.
Репозиторий на GitHub, где ведётся разработка раскладки: https://github.com/A-Projects/Ruchey
Корректировка
Выпущена версия 1.2, по сути это окончательная редакция с принятыми доработками от коллег;
Раскладка добавлена в основной репозиторий Freedesktop и вскоре появится во всех дистрибутивах «из коробки».