Привет, Хабр!
Отсылка к прошлому посту
Этот пост является, отчасти, переосмыслением прошлой статьи, со своими дополнениями и улучшениями.
Дело в том, что в прошлой статье я допустил одну критичную ошибку, которая сказалась на всём повествовании – я хотел рассказать о проекте дополняющем клавиатурную раскладку, а сам, невольно, сместил всё внимание на буквенную часть, которую зачем-то стал навязывать к использованию, как основу всего проекта. С неё всё началось, с ней связаны многие детальные части проекта, но обязательной она не является. Потому она была справедливо вынесена из проекта, и теперь мы можем полноценно поговорить о прочих аспектах, без оглядки на буквенную часть.
Прочие изменения то тут, то там, вносят свои коррективы и дополнения, и, хочется верить, помогут описать проект должным образом.
Спасибо всем комментаторам. Я учёл все замечания и предложения к вынесенной буквенной части, и ещё попробую посмотреть, как можно её улучшить. Не знаю, получится ли правильно всё реализовать, но так или иначе, это уже не имеет никакого отношения к текущему посту.
Без предысторий. О чём этот проект?
Проект является дополнением к любой клавиатурной раскладке, которое значительно расширяет и унифицирует символьный ввод, добавляет полную нативную поддержку всех языков кириллической и латинской письменностей с их особенностями, дополняет взаимодействие с клавиатурой некоторым функционалом, и всё это с первостепенной оглядкой на эргономику и общее удобство использования.
Основная идея – использование одной раскладки для всей письменности и символьного набора, без каких-либо ограничений.
Возможно вы также слышали (а может даже и используете) о типографской раскладке Ильи Бирмана. Она добавляет многим клавишам два дополнительных слоя, с модификаторами AltGr
и Alt-Shift
, под которыми расположен расширенный набор символов, в числе которых символы "корректного ввода", кавычки всех видов, некоторые специфичные языковые символы, а также прочие потенциально востребованные символы и немного диакритики. Общее количество уникальных символов около 75. За 15 лет данная раскладка приобрела немалую известность, в основном среди медиакомпаний, что служит определённым показателем востребованности.
В самом базовом представлении, данный проект следует тем же положениям – дополнительные символы на дополнительных слоях под модификаторами, для упрощения набора. Но самое интересное в деталях, ведь так? О них и поговорим ниже, благо, есть о чём.
Символьные слои
Модификаторы
Первым делом стоит определиться с модификаторами доступа к символьным слоям.
Не хотелось прибегать ни к идее отдельного переключения слоёв, ни к двойным зажимаемым модификаторам, ни к специфичному модификатору AltGr
, из-за его неоднозначного использования. Все эти варианты не представляются достаточно удобными для повседневного использования.
Из оставшихся стандартных модификаторов оставался лишь обычный Alt
, но его, конечно, недостаточно. Потому были опробованы различные "нестандартные" модификаторы, один из которых оказался настолько удобным в использовании, что в итоге стал основным (под ним расположен самый востребованный, он же базовый, набор символов). Этот модификатор – "длинные" или "долгие" нажатия. Вам может прийти аналогия со вводом на современных мобильных клавиатурах, но ощущаются они весьма по-разному. Также не стоит слишком акцентироваться на слове "долгие", ведь на деле эти нажатия занимают от 0.15с (базовая конфигурация) до 0.1с (оптимальное значение, после привыкания к модификатору), и могут быть в любой момент переопределены на более комфортное значение.
После длительного использования данного модификатора, могу уверить, что ввод символов с длинным нажатием едва ли отличается по ощущениям от базового ввода буквенных символов. Shift
никак не влияет на ввод символов с данным модификатором, что позволяет набирать их одним и тем же образом в потоке буквенных символов равно как нижнего, так и верхнего регистров.
Третьим модификатором, для сверх-дополнительных символов, выступает комбинация двух озвученных. Обращаясь к прошлому абзацу – эта комбинация ощущается как одинарный модификатор, и не эквивалентна двойным зажимаемым модификаторам.
Основной символьный слой
Основной символьный слой, расположенный под длинными нажатиями, содержит, в основном, базовый набор символов, знакомый всем по существующим раскладкам.

Символы сгруппированы по категориям (пунктуация, базовая математика, валюты, скобки с зеркальным положением вокруг домашнего ряда).
Наиболее востребованные категории (пунктуация и базовая математика) расположены на домашних позициях пальцев, для максимально удобного доступа к ним.
Некоторые графически близкие символы расположены на вертикально смежных позициях.
В правом верхнем углу расположен самый востребованный диакритический комбинируемый символ – аку́т, в первую очередь, как маркер основного ударения.
В цифровом ряду, на месте бывших символьных клавиш -_
и =+
, расположены две новые клавиши-команды – уменьшение и увеличение выделенного числа или символа на 1 (для нецифровых символов – соседний юникод символ, игнорируя комбинируемые). Данные клавиши определены на базовом слое (без каких-либо модификаторов) и не имеют варианта с модификатором длинного нажатия, для возможности повторения команды через удержание, потому отображены на данном слое в базовом виде. Данные клавиши могут быть переопределены отдельным пользователем в конфигурации реализации.
Обычные цифровые клавиши также не имеют варианта с длинным модификатором, и пока зарезервированы под дальнейшие потенциальные дополнения, а на данном слое отображаются в базовом виде.
Альтернативный слой
Основу слоя, расположенного под Alt
, составили альтернативные отображения символов с прошлого слоя или их логические вариации на тех же позициях – минус вместо дефиса, длинное тире на месте среднего, символ цента вместо символа доллара, гравис (как побочное ударение) вместо акута, двойные кавычки-«ёлочки» на месте одинарных угловых, …
Данный слой был дополнен базовыми навигационно-управляющими командами (стрелки, вперёд/назад, отменить/повторить), для минимизации отрыва рук от домашних позиций.

В цифровом ряду расположились все минимально востребованные символы надстрочной комбинируемой диакритики.
Расположение данного набора символов в цифровом ряду позволяет использовать их только тогда, когда они нужны, и только те, которые нужны, никоим образом не сказываясь на прочих аспектах набора и не "занимая полезное место". Ведь в зависимости от языка, у пользователей может возникнуть необходимость всего в 1-3 диакритических символах (у каждого своих), а значит, "ненавязчивое" расположение актуально как для пользователей вовсе не использующих диакритику, так и для использующих её на 4-12%, в зависимости от потребностей.
Диакритический ряд не является реализацией упомянутой ранее мультиязычности, хотя и вносит в неё свой вклад. О полноценной мультиязычности мы поговорим отдельно.
Дополнительный слой
Данный слой содержит наименее востребованные, но всё ещё представляющие интерес символы.
Следование категориям и позициям прошлых слоёв по возможности соблюдено, хотя на данном слое и не так заметно.

Навигационно-управляющие клавиши представлены в Alt
варианте, и не имеют AltLong
варианта, для сохранения возможности повторения команды через удержание.
Цифровой ряд содержит 10 подстрочных комбинируемых диакритических символов (все минимально востребованные). Описание, которое было дано надстрочной диакритике, является общим и для над- и для подстрочной диакритики.
Оставшиеся два места в цифровом ряду были отданы дополнительным символам.
Итог раздела
Суммарно на трёх слоях расположились 83 вспомогательных символа + 24 символа комбинируемой диакритики + 8 навигационно-управляющих команд + 2 вспомогательные команды.
Данные символы и команды объединены в логические группы.
Группы и отдельные вариации символов наследуют своё положение между слоями.
Позиционирование выполнено с ориентацией на удобство набора наиболее востребованных символов, с дополнительным вертикально-смежным или зеркальным позиционированием логически связанных символов в отдельных случаях.
Мультиязычность
Мультиязычность реализована посредством введения дополнительного языкового блока. Его основная идея состоит в том, что он выступает в роли открывающего доступ к набору на любом языке письменности, без привязки раскладки к конкретному языку, без каскадных ограничений набора и никак не сказывается на удобстве набора для тех пользователей, которые им не пользуются, хотя и у последних когда-никогда может возникнуть редкая потребность в нём.
В рамках этого блока нас интересует всего одно различие между языками одной письменности – набор символов (как закреплённый алфавитом, так и используемый на практике). Конечно, отдельные языковые особенности также учтены, но они будут рассмотрены отдельно для каждого случая.
Итак, как же могут различаться символы между языками? Тут существует две категории:
графически уникальные символы/лигатуры;
символы с добавочной диакритикой, или им эквивалентные.
Наличие символов первой категории является обязательным условием для базовой возможности набора на конкретном языке, и именно добавление подобных символов – основная причина создания множества отдельных языковых буквенных раскладок. Которые теперь нам не понадобятся.
Символы второй категории могут быть введены и через комбинируемую диакритику через двойное нажатие, однако было бы некорректно оставлять такие символы исключительно на комбинируемый ввод, потому стоит позаботиться и об упрощённом вводе – через одинарное нажатие.
Стоит дополнительно отметить, что символы второй категории могут быть закреплены официальным алфавитом и восприниматься носителями как уникальные (как й или ё в русском, к примеру), а могут быть общеизвестно комбинируемыми. Чем богаче на диакритику язык, тем скорее подобные буквы будут восприниматься именно в комбинируемом варианте.
Наборы символов
Конечно, специфичных языковых символов куда больше, чем мы можем разместить на клавиатуре, и уж тем более, если мы хотим сделать это удобным образом. Потому нам стоит разделить все специфичные языковые символы на наборы, которые позволят использовать их с максимальным охватом и удобством. Наборы составлены отдельно для кириллицы и латиницы, а текущий набор символов в языковом блоке будет зависеть от текущей активной раскладки, предлагая ко вводу только актуальные символы. Переключение между наборами одной письменности, при необходимости, может осуществляться "на лету", хотя это и редкий случай, ведь достаточно единожды выбрать тот набор (для каждой письменности), который потенциально может пригодиться.
Располагается наш языковой блок в "ненавязчивом" цифровом ряду под модификатором Shift
(ShiftLong
для вариантов в верхнем регистре), что даёт нам 12 позиций в каждом наборе.
Из графически уникальных символов, открывающих доступ к набору текста на популярнейших языках латинской письменности, был составлен базовый набор, присутствующий в едином виде в большинстве латинских наборов. Это сделано для расширения охвата каждого отдельного набора символов.
Базовый набор – ł đ ı ß ø æ œ
.
Оставшиеся же позиции будут содержать разные символы из набора в набор, в зависимости от языка/группы, для которой они предназначены.
Изменяемая часть наборов состоит из упомянутых ранее символов упрощённого ввода.
В некоторых локально востребованных наборах могут встречаться и уникальные графические символы, которые было нецелесообразно выносить в базовый набор. Подобные наборы символов можно категоризировать как "позволяющие", так как без их использования ввод текста на конкретном языке не является полноценным. К таким наборам относятся некоторые языки Африки, а также исландский, казахская латиница, азербайджанский и мальтийский.
Все остальные наборы не имеют подобного ограничения, и категоризируются как "упрощающие", т.е. содержащие в изменяемой части исключительно символы упрощённого ввода.
Давайте для примера взглянем на основной набор языкового блока для латиницы:ñ å ä ö ü ł đ ı ß ø æ œ
Здесь к базовому набору были добавлены 5 символов упрощённого ввода, и в таком виде набор открывает полноценный доступ к следующим языкам: испанский, немецкий, французский, вьетнамский, шведский, датский, финский и норвежский.
Отдельно стоит заметить, что базовый набор дополнительно предоставляет минимальную возможность ввода также и для турецкого, польского и словенского языков (дополнительно имеющих собственные упрощающие наборы).
Здесь также не перечислено множество языков, доступных ко вводу (как на базовой письменности, так и через диакритику) без использования языкового слоя – их поддержка подразумевается сама собой.
Таким образом, всего с одной вариацией языкового блока открывается полноценный доступ к 76.78% языков интернета (по используемости) и базовый к дополнительным 4.42% языков, из общих 82.16% языков латинской письменности. Суммарно же, все языковые наборы охватывают все языки письменности.
Здесь и далее используется статистика использования языков в интернете с сервиса w3techs.com за 01.12.2021.
Для языков, чья письменность отличается от латинской и кириллической, предусмотрены варианты романизации. Из 9.86% подобных языков для 9.84% поддерживаются все версии романизаций, большая часть которых недоступна на базовой раскладке письменности. Для оставшихся – предусмотрены только некоторые варианты романизации.
Отдельные уточнения и учёт языковых особенностей
для турецкого и общего тюркского наборов предусмотрено небольшое опциональное перепозиционирование символов
iI
иıİ
, для более логичного ввода –iİ
(в буквенной части) иıI
(языковой блок). Переключаемая опция;при выборе румынского языкового набора предусмотрена опциональная замена диакритической седили на кому, для исправления распространённого ошибочного использования первой. Переключаемая опция;
в наборах "исландский/древнеанглийский" и "мосси" символ
đĐ
заменён на варианты начертания, использующиеся в данных языках –ðÐ
иɖƉ
, соответственно;в зависимости от потребностей пользователя (переключаемая настройка), символы упрощённого набора могут подаваться на ввод как в комбинированном виде, так и в виде цельного юникод-символа;
одинаковые динамические символы, встречающиеся в разных наборах, расположены на одних и тех же позициях, где это было возможно;
в наборы, в которых количество динамических символов ограничилось 4, была добавлена
ñ
, даже не относясь к основному языку набора, в качестве символа с максимальным расширением охвата, без зависимости от прочих символов;так как разные языки требуют разное количество дополнительных символов, не все наборы содержат упоминавшийся базовый набор символов:
в 6 наборах, в которых количество динамических символов потребовало 6 позиций, дополнительное место было пожертвовано от
ł
;8 наборов, для языков с большим количеством дополнительных символов, в разной степени изменяют базовый набор символов;
наборы для польского, венгерского и литовского предусмотрены как и в полном виде с видоизменённым базовым набором, так и в виде частично-упрощающих наборов, с полным базовым набором и комбинируемым вводом символов с единым диакритическим символом (акут для польского и венгерского, огонэк для литовского + ż);
наборы для чешского и словацкого даже при отказе от базового набора символов, всё равно являются частично-упрощающими (без řďťň для чешского, без акутных форм для словацкого);
перечисленные выше подпункты могут быть исправлены и оптимизированы дополнительными пользовательскими назначениями.
Все варианты латинских наборов (36)
Main |
|
Turkish |
|
Polish (partial + base) |
|
Polish (full − base) |
|
Czech (partial − base) |
|
Romanian |
|
Hungarian (partial + base) |
|
Hungarian (full − base) |
|
Slovene, Croatian (Gaj's latin), Romany |
|
Slovak (full − base) |
|
Turkic languages (full − base) |
|
Lithuanian (partial + base) |
|
Lithuanian (full − base) |
|
Latvian (full − base) |
|
Estonian (base − ł) |
|
Albanian, Northern Sotho |
|
Old English, Icelandic |
|
Urdu (Roman script) (base − ł) |
|
Uzbek |
|
Southern-Berber, Kanuri |
|
Twi, Yoruba (Benin), … |
|
Northern Sami (base − ł) |
|
Esperanto (base − ł) |
|
Kurdish (Hawar alphabet) |
|
Turkmen (base − łđœ) |
|
Irish, Sundanese, Luba-Katanga |
|
Luxembourgish, Uyghur |
|
Maltese |
|
Haitian, Javanese, Kikuyu |
|
Hausa |
|
Maori, Samoan, Niuean |
|
Volta–Niger languages |
|
Western Frisian (base − ł) |
|
Venda |
|
Fula |
|
Mossi |
|
Перейдём к кириллическим наборам.
Здесь положение несколько иное, так как, за редким исключением, добавочная диакритика крайне некорректно отображается с кириллическим набором символов на подавляющем большинстве шрифтов, что вынуждает нас относиться ко всем символам данной письменности как к уникальным, хотя, справедливости ради, большая часть из них и так принадлежит к уникальной категории.
Ввиду этого факта, все наборы являются "позволяющими", и у них нет базового набора – все символы являются изменяемыми из набора в набор. Однако это положительно сказалось на количестве наборов – их всего 6, один из которых принадлежит единственному языку.
Символы кириллических наборов, по озвученной ранее причине, передаются на ввод исключительно в едином, предкомбинированном виде (за исключением з́ и с́, вовсе не имеющих цельного представления).
Основной, по потенциальной востребованности, кириллический набор:ґ є і ї ӏ ў ѣ ѵ ѳ ӂ ӕ ӧ
Данный набор символов открывает доступ к полноценному набору текста на украинском, белорусском, молдавском, русинском, осетинском, языке коми, диалекте руска рома, ряде кавказских языков, дореволюционном русском.
Все варианты кириллических наборов (6)
Основной |
|
Сербский, боснийский, македонский, черногорский, интерславик |
|
Казахский, монгольский, узбекский, киргизский, таджикский |
|
Башкирский, чувашский, татарский |
|
Абхазский |
|
Якутский, эвенский, |
|
Из 7.98% кириллических языков интернета 7.68% доступны к полноценному вводу на основном наборе, а оставшиеся 0.3% – посредством 5 прочих наборов.
Вы можете ознакомиться со всеми наборами в соответствующей вкладке.

Текущие активные наборы символов также отображены.

GUI для подсказки использует вашу стандартную раскладку, какой бы она ни была.

С полным распределением, алфавитами, наборами, процентами, поддержкой, категориями и письменностями можно ознакомиться в файле languages.xlsx
Итог раздела
Языковой блок, расположенный под Shift
и динамически изменяющийся, в зависимости от активной раскладки, содержит в себе 31+5 наборов специфичных языковых символов, которые открывают доступ к набору текста на любом языке кириллической и латинской письменностей. Из 90.14% кириллических и латинских языков интернета:
полностью поддерживаемые языки на любом наборе, включающем "базовый" – 77.65% (89.17% без упрощённого ввода);
полностью поддерживаемые языки на основных наборах – 6.82%;
полностью поддерживаемые языки на дополнительных наборах – 5.67%;
5.30% – на упрощающих, 0.37% – на позволяющих.
Романизированные версии языков прочих письменностей: все версии – 9.84%, некоторые – 0.02%.
Дополнительный функционал / реализация
С POC-реализацией для Windows можно ознакомиться и опробовать на гитхабе.
Большая часть настроек, включая длительность срабатывания "длинных" нажатий и выбор языковых наборов, доступна в меню скрипта в трее.
Буквенные раскладки
Данный проект не является отдельной раскладкой и не требует никаких изменений в этой части. Использование происходит поверх вашей раскладки, какой бы она ни была.
Так как символьные слои в полной мере покрывают все символьные потребности пользователей, их присутствие в буквенной части может быть излишним, в связи с чем большинство популярных раскладок дополнительно были приведены в адаптированный вид и опционально предлагаются к установке и использованию вместе с данным проектом.
Адаптация заключается в очистке раскладки от небуквенных символов и размещении буквенных символов в буквенной части клавиатуры, в случае, если в оригинальном виде они расположены за её пределами. Никаких прочих изменений – это те же буквенные раскладки, как они представлены в оригинальном виде.
Также приведение раскладок в адаптированный вид продолжает идею модульности – каждый блок слоя клавиатуры отвечает за собственный функционал: буквы в буквенной части на базовых нажатиях, символы на символьных слоях, цифровые символы в цифровом ряду, языковые символы в языковом блоке, диакритика в собственных слоях в цифровом ряду. В существующих же раскладках всё это переплетено между собой, и малейшее изменение влечёт за собой ряд каскадных переназначений, что мы можем наблюдать сегодня в бесчисленных вариантах раскладок, разнящихся зачастую всего парой символов, однако уже так представляющих собой отдельную раскладку.
Но так или иначе, проект не зависит от вашей раскладки и использование адаптированной версии является исключительно опциональным.
Опциональные/переключаемые функциональности
Парные скобки/кавычки – aвтоматически закрывает скобки и кавычки <>
, «»
, ""
, “”
, ()
, []
и {}
, устанавливая позицию каретки между ними.
Aвтоматическое закрытие одинарных кавычек не предусмотрено, так как данный символ часто используется в значении апострофа, где парная кавычка будет нежелательной.
Комбинированный упрощённый ввод символов языкового блока – базово на ввод отправляются "цельные" символы, даже если они эквивалентны комбинированным. С данной опцией, они будут отправляться в виде буква+диакритика, где это возможно.
Переназначения управляющих клавиш – дополнительное перепозиционирование клавиш Backspace
, Enter
, CapsLock
и Esc
, для их более комфортного использования. Подобное расположение является более эргономичным и позволяет минимизировать движения, отрывающие пальцы от домашних позиций. Предлагаемое назначение:
Enter
выполняет функциюBackspace
; с зажатымShift
–Delete
;Backspace
выполняет функции управления медиа (нажатие – воспроизведение/пауза; сShift
– увеличить громкость; сAlt
– уменьшить громкость; сShiftLong
– следующий медиа-элемент; сAltLong
– предыдущий медиа-элемент);Tilde
выполняет функциюEsc
;CapsLock
выполняет функциюEnter
;Функция
CapsLock
может быть назначена наEsc
отдельной настройкой.
Сдвиг цифрового ряда для начала с нуля (01…9 вместо 1…90).
Пользовательские назначения – для клавиш уменьшения/увеличения числа в цифровом ряду, а также для "опустевших" клавиш адаптированных латинских раскладок предусмотрены дополнительные назначения, которые прописываются пользователем в config.ini
файле скрипта.
Там же могут быть назначены дополнительные клавиши для переключения между окнами процессов сочетанием LWin-<назначенная_клавиша>.
Автоматическое отключение скрипта в отдельных приложениях – отлов длинных нажатий может быть нежелательным в некоторых приложениях, сказываясь на их работе. Такие приложения вносятся в файл config.ini
в секцию BlackList
, после чего действие скрипта в данных приложениях будет автоматически приостанавливаться.
Дополнительные горячие клавиши реализации
Изменение регистра |
|
Неразрывный пробел (переключаемая функциональность) |
|
Заменить выделенный текст, текстом из буфера обмена, с сохранением заменяемого текста в буфер |
|
Навигация "стрелками" |
|
Перемещение окон |
|
Свернуть/[восстановить] все окна |
|
Пауза/возобновление скрипта |
|
Перезапуск скрипта |
|
GUI
Скрипт имеет минимальный подсказывающий GUI, в котором отображены все символьные слои, базовая раскладка, выбранные языковые наборы, некоторые переключаемые опции и переназначения.
Все скриншоты выше взяты из него.
Дополнительно присутствуют: вкладка скан.кодов (как подсказка для добавления назначений в config.ini
), список языковых наборов (с возможностью смены активного двойным нажатием) и список горячих клавиш.
Отображение GUI переключается кликом по иконке в трее или сочетанием Alt-F1
.
Пока GUI активен, переключение между вкладками может быть осуществлено клавишами F1-F7
.
Нажатие клавиши в буквенной части клавиатуры выделят данную клавишу на "слоевых" вкладках.
Пример отображения основного символьного слоя с включённым переназначением управляющих клавиш, дополнительными переназначениями в цифровом ряду и включённой опцией парных скобок:

Заключение
Данный проект дополняет клавиатурную раскладку предоставляя единый доступ к более чем 100 уникальным символам и 10 командам, языковому блоку, охватывающему все языки кириллической и латинской письменностей, с их особенностями, а также к различному вспомогательному функционалу и пользовательским назначениям.
Предлагаемая модульная система клавиатурных назначений позволяет и в дальнейшем вносить изменения и дополнения в любой блок, не затрагивая прочие.
А дополнять ещё есть чем, и есть куда.
Спасибо, что дочитали. Буду рад всем комментариям, предложениям, замечаниям.
Если вы носитель языка, отличного от основного языка письменности, буду отдельно рад отзывам и предложениям по поддержке конкретных языков.
upd: внесены некоторые изменения в существующие языковые наборы, добавлены новые, перерасположены по использованию; сформированы полноразмерные наборы без "базы", для языков с богатым набором дополнительных символов (для польского, венгерского и литовского и сохранены частичные наборы, и добавлены полноразмерные).