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

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

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

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

Кому не интересен сам процесс создания, но есть желание попробовать:
- для Windows 7 и выше: win-ruchey-1.1.0.zip
- для Debian / Ubuntu: xkb-ruchey_1.1.0_all.deb

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

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

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

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

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

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

В разработке, лёгких для восприятия раскладок есть ограничения. Первое - это число клавиш, а второе - уже нанесённые символы на клавиши. Существуют раскладки, позволяющие заметно ускорить печать слепым методом, использовать больше символов, но к сожалению производители выпускают клавиатуры только с 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 (для 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, Bash, работаю по RDP.

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

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

Репозиторий на GitHub, где ведётся разработка раскладки: https://github.com/A-Projects/Ruchey

Комментарии (20)


  1. amarao
    25.01.2022 12:31

    Долго читал пост пока не обнаружил, что это Windows. :/


    1. akostrikov
      25.01.2022 13:34
      +5

      Всё нормально, надо читать ещё дальше до "Разработка и создание установочных пакетов для Linux".


      1. amarao
        25.01.2022 13:41

        А, увидел. Что-то вы мимо системной конфигурации полезли. Посмотрите на пакет keyboard-configuration. Там же есть ценный файл /usr/share/doc/keyboard-configuration/README.Debian

        Дистрибутив у вас не указан, предполагаю ubuntu/debian. Возможно, у арчово-федоровых по другому.


        1. 6ap Автор
          25.01.2022 16:19

          Файл ценный. Из него я и взял где менять раскладку для консоли: "/etc/default/keyboard". Вообще для меня было открытие, что за раскладки в консоли отвечает пакет из иксов.

          Каюсь, в статье я не очень подробно разобрал механизмы формирования раскладок в Linux, но постарался указать на конкретные точки, где надо смотреть.

          Проверены дистрибутивы базирующиеся на Debian, но это стандарт и должно работать везде. В конечном счёте, инсталятор это лишь костыль. Я попробую сформировать pull request в основной репозиторий freedesktop.org. Если не откажут, то раскладка автоматически будет доступна в любом Linux.

          Для Debian есть ещё один файл "/usr/share/console-setup/KeyboardNames.pl", о котором я умолчал. Он отвечает за отображение раскладок в конфигураторе "dpkg-reconfigure keyboard-configuration" и тут уже патчи слать в debian.org

          Есть еще несколько команд:

          Список моделей клавиатур:      localectl list-x11-keymap-modles
          Список языковых раскладок:     localectl list-x11-keymap-layouts
          Список вариантов раскладок:    localectl list-x11-keymap-variants ru
          Список переключений раскладок: localectl list-x11-keymap-options
          Обновление раскладок без перезапуска X11: dpkg-reconfigure xkb-data
          Выбор раскладки для консоли Debian: dpkg-reconfigure keyboard-configuration


          1. amarao
            25.01.2022 17:55
            +1

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

            Это весьма разумная система и не надо её пытаться взламывать "снизу", если можно использовать по назначению.


  1. ri1wing
    25.01.2022 13:34

    Лично я просто повесил переключение раскладки на правый ctrl.

    Один раз нажать переключение раскладки мне кажется удобнее, чем зажимать alt gr для каждого спец.символа.


  1. Earthsea
    25.01.2022 14:03

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


    1. Angeld
      25.01.2022 14:31
      +1

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

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


    1. 6ap Автор
      25.01.2022 16:32

      Самое большое ограничение - это число клавиш. Вынос цифр в третий уровень и размещение на первом самых встречающихся спецсимволов был просто фантастикой. Нажатия «Shift» нужны были только для редко встречающихся спецсимволов. Даже для буквы «Ё» нашлось место (как в машинопись). Но автоматически набор цифр превращался в АД.

      Я бегло пересмотрел интернет, в поисках производителя кастомных раскладок с дополнительным рядом клавиш, чтобы на него вынести цифры, но ничего не нашёл.


  1. fk0
    25.01.2022 16:01

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

    Никогда не задумывался и не замечал. Даже специально проверил. Был неприятно удивлён. Всю жизнь пользуюсь ЯВЕРТЫ-раскладкой, но там оказывается такая же проблема!

    С одной стороны это говорит о том, раз никогда не замечал, что такая возможность и не особенно нужна.

    С другой стороны, очевидно, это объясняет отсутствие языков программирования основанных на семантике русского языка. Действительно, с программным кодом в раскладке без скобок и ряда прочих символов работать неудобно.


    1. 6ap Автор
      25.01.2022 16:46

      С другой стороны, очевидно, это объясняет отсутствие языков программирования основанных на семантике русского языка. Действительно, с программным кодом в раскладке без скобок и ряда прочих символов работать неудобно.

      Эта раскладка, которую удалось сделать, решает данную проблему. Я набираю код в основном на C# / C++ и не испытываю проблем, но ради интереса набрал код на абстрактном языке.

      #импорт com.habr.сеть;
      
      Строка $сетевойШлюз = "192.168.0.254";
      
      проверкаСети() {
          если($сетевойШлюз.первыеСимволы("192.") ) {        
              Подключение $подключение;
              $подключение.добавитьАдрес($сетевойШлюз);
              Целое $результат = $подключение.выполнить();
              
              если($результат != 0) {
                  отладка << "ошибка подключения";
              }
          }
      }
      
      проверкаСети();

      Набрал, что шутя! А ведь обычно IDE ещё помогает.


  1. KarmicDude
    26.01.2022 00:03
    +1

    Есть несколько раскладок, которые удобней дефолтного йцукен. Основные это Диктор и Зубачев. В свое время владел и той и той. Но Диктор показался удобнее. Достиг на нем достаточно хорошего перформанса в 800 зн/мин полноценным 10-пальцевым слепым методом набора. Есть огромное множество разных раскладок кириллицы от сообщества, модификаций существующих и разработок под свои типы клавиатур. За годы скоростной печати в качестве хобби пришел к определенным выводам по удобству раскладок. На базе раскладки Диктор реализовал свою раскладку, которая больше подходит для набора "динамикой" и улучшил набор для левой руки. Ознакомиться можно https://github.com/karmicdude/alter

    По ощущениям при наборе максимально близка к английскому двораку из-за высокого процента чередования и баланса рук и пальцев в наборе.

    Ознакомиться с достаточно детальными и весьма научными расчетами по раскладкам, в которых присутствуют вышеупомянутые Диктор и Зубачев можно в этом посту хорошо известного в кругах развивающих скорость печати Дяди Паши.

    Но владея 7 или 8 разными раскладками (хобби было такое, не судите :)), могу сказать, что не нужно это все. При небольшом желании дефолтные йцукен и qwerty более чем достаточны для вполне уверенного набора на средней скорости около 400 зн/мин, чего просто за глаза для любой работы, если ты не стенографист. В общем мог бы про это большой пост накатать, да вряд ли кому такие дебри нужны. Но перед сменой раскладок, особенно на кастомные, которых нет в системах из коробки, очень бы советовал 10 раз подумать, потому что это того на самом деле не стоит.

    А с возможностью реализации достаточного функцианала, в чем то способного в юзерспейсе заменить возможности программируемой QMK клавиатуры со слоями, модификаторами и пр., может помочь kmonad. Сам не тестировал, но выглядит вкусно.


    1. 6ap Автор
      26.01.2022 00:34

      800 знаков это что-то недостижимое! В обычном ритме, тоже слепым методом, я набираю около 200 зн/мин.

      Вообще раскладка Ручей не про скорость набора. Она решает проблему отсутствия спецсимволов в русской раскладе, при этом достаточно ювелирно. Необходимо запомнить расположение всего 8 символов, пару скобок и клавишу AltGr.

      Я попробовал разные раскладки (Вашу увидел впервые, любопытно), несколько сделал сам и понял, что проблема "отката" весьма существенная. Через несколько недель невозможно нормально набирать текст на других компьютерах. Поэтому тут этот вопрос тоже учтён. На данный момент я не ощущаю трудности набрать текст на другом ПК, хотя на работе и хобби много разнообразных ОС.

       


      1. KarmicDude
        26.01.2022 00:49
        +1

        если вас не смущает возможность таскать с собой компактную клавиатуру, то можете присмотреться к разным вариантам типа Jorne, Corne. Более полноценные в плане размера - Moonlander. Очень многие именно так и делают. Например Moonlander легко складывается в чехол. Сами раскладки и слои можете вшить прошивкой. Если не знакомы с возмонжостями QMK по части модификаторов, слоев и пр. - рекомендую ознакомиться. Там очень много крутых фишек, помимо возможности создания огромного количества слоев, которые могут активироваться с разной логикой и разными модификаторами. Возможно именно это вам и понравится и подойдет лучше, чем делать кастомные раскладки и лишаться возможности использования их на других системах без установки. Все будет внутри клавиатуры, при подключении к любой системе ничего в самой системе менять не придется. Достаточно наличия дефолтный йцукен и qwerty.

        Проблема же "отката" очень быстро проходит, если начать очень часто переключаться между раскладками, это даже можно натренировать. Сначала это кажется сложным и невозможным, но потом даже в рамках одного языка можно на лету менять разные раскладки, сохраняя достаточную безошибочность. Нейронные связи укрепляются от большого количества повторений. По началу придется хендлить все головой, задумываясь что нажимаешь, с каждым разом время на вспоминание, как в текущей раскладке что-то расположено уходит все меньше, дальше это переходит в полностью автоматический навык и эти слои и раскладки меняются в голове без твоего участия и задумываться о том, что в твоей модификации переставлены знаки и символы не приходится. Можно буквально менять через слово раскладки и ошибаться не будешь. В свое время я проводил такой эксперимент и уверено менял раскладки в рамках одного предложения, сохраняя скорость около 300 зн/мин. Но за ненадобностью отказался до совершенствования этого навыка. Я знаю человека, который переключает разные раскладки в пределах одного языка, просто по окнам. Типа в чатах набирает на йцукен, в соседнем окне на дикторе. И делает это практически с одинаковой высокой скоростью, хорошей безошибочностью. Просто он так делал часто и у него этот навык хорошо развился.


  1. d-rus
    26.01.2022 00:35

    Привет. Где взять для вин11?


    1. 6ap Автор
      26.01.2022 00:43

      Вот прямо под Win 11 я не тестировал (только Win 10, Win 7, Win 2012R2). Но, насколько мне известно, в этой части ничего особо не менялось со времён Win 7. На выходных проверю, заодно потанцую с VirtualBox и Win 11.

      Сам репозиторий на GitHub, там же и релизы https://github.com/A-Projects/Ruchey/releases


    1. d-rus
      26.01.2022 22:42

      И для KUBUNTU нужно, хелп


      1. 6ap Автор
        27.01.2022 16:06

        В релиз добавлен xkb-ruchey_1.1.0_all.deb пакет. Проверен на Debian, Kubuntu, Neon. Механизм доработан и после системных обновлений раскладки не слетят.

        После установки пакета выполнить перезагрузку. В "Параметрах системы" указать клавишу для 3-го уровня и добавить раскладки.

        Если раскладки необходимы в консоли, то изменить файл "/etc/default/keyboard", как указано в статье, и выполнить dpkg-reconfigure -phigh console-setup.


  1. palyaros02
    27.01.2022 16:06

    В русской раскладке для винды давным давно есть ₽. Правый Alt + 8.


    1. 6ap Автор
      27.01.2022 16:14

      Я так понимаю, что формирование раскладок разработчиками Windows не выполняется с помощью программы MSKLC. Если сформировать раскладку на основе «Русской» с помощью программы MSKLC (это официальная и похоже единственная программа для таких задач) и добавить туда знак ₽ или U+20BD, то начинают происходить странные вещи, например перестаёт работает Backspace.