Привет, Хабр! Этот пост является, отчасти, переосмыслением прошлой статьи, со своими дополнениями и улучшениями. Дело в том, что в прошлой статье я допустил одну критичную ошибку, которая сказалась на всём повествовании – я хотел рассказать о проекте дополняющем клавиатурную раскладку, а сам, невольно, сместил всё внимание на буквенную часть, которую зачем-то стал навязывать к использованию, как основу всего проекта. С неё всё началось, с ней связаны многие детальные части проекта, но обязательной она не является. Потому она была справедливо вынесена из проекта, и теперь мы можем полноценно поговорить о прочих аспектах, без оглядки на буквенную часть. Прочие изменения то тут, то там, вносят свои коррективы и дополнения, и, хочется верить, помогут описать проект должным образом. Спасибо всем комментаторам. Я учёл все замечания и предложения к вынесенной буквенной части, и ещё попробую посмотреть, как можно её улучшить. Не знаю, получится ли правильно всё реализовать, но так или иначе, это уже не имеет никакого отношения к текущему посту. Проект является дополнением к любой клавиатурной раскладке, которое значительно расширяет и унифицирует символьный ввод, добавляет полную нативную поддержку всех языков кириллической и латинской письменностей с их особенностями, дополняет взаимодействие с клавиатурой некоторым функционалом, и всё это с первостепенной оглядкой на эргономику и общее удобство использования. Основная идея – использование одной раскладки для всей письменности и символьного набора, без каких-либо ограничений. Возможно вы также слышали (а может даже и используете) о типографской раскладке Ильи Бирмана. Она добавляет многим клавишам два дополнительных слоя, с модификаторами 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 наборов, для языков с большим количеством дополнительных символов, в разной степени изменяют базовый набор символов; наборы для польского, венгерского и литовского предусмотрены как и в полном виде с видоизменённым базовым набором, так и в виде частично-упрощающих наборов, с полным базовым набором и комбинируемым вводом символов с единым диакритическим символом (акут для польского и венгерского, огонэк для литовского + ż); наборы для чешского и словацкого даже при отказе от базового набора символов, всё равно являются  частично-упрощающими (без řďťň для чешского, без акутных форм для  словацкого); перечисленные выше подпункты могут быть исправлены и оптимизированы дополнительными пользовательскими назначениями.  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 − ł) ū ṛ ṣ ṭ ẓ z̤đ ı ß ø æ œ 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 ɓ ɗ ƙ r̃ ƴ ł đ ı ß ø æ œ Maori, Samoan, Niuean ā ē ī ō ū ł đ ı ß ø æ œ Volta–Niger languages ṅ ṣ ẹ ọ ụ ị đ ı ß ø æ œ Western Frisian (base − ł) â ê é ô û ú đ ı ß ø æ œ Venda ṅ ḓ ḽ ṋ ṱ ł đ ı ß ø æ œ Fula ɓ ɗ ŋ ɲ ƴ ł đ ı ß ø æ œ Mossi ɓ ɩ ʋ ɛ ɔ ł ɖ ı ß ø æ œ  Перейдём к кириллическим наборам.Здесь положение несколько иное, так как, за редким исключением, добавочная диакритика крайне некорректно отображается с кириллическим набором символов на подавляющем большинстве шрифтов, что вынуждает нас относиться ко всем символам данной письменности как к уникальным, хотя, справедливости ради, большая часть из них и так принадлежит к уникальной категории.Ввиду этого факта, все наборы являются "позволяющими", и у них нет базового набора – все символы являются изменяемыми из набора в набор. Однако это положительно сказалось на количестве наборов – их всего 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, после чего действие скрипта в данных приложениях будет автоматически приостанавливаться. Изменение регистравыделенного текста(переключаемая функциональность) [Alt/Ctrl]-DoubleShift Неразрывный пробел (переключаемая функциональность) Shift-Space Заменить выделенный текст, текстом из буфера обмена, с сохранением заменяемого текста в буфер Ctrl-Shift-v Навигация "стрелками"  Перемещение окон  Свернуть/[восстановить] все окна LWin-Enter[Long] Пауза/возобновление скрипта Shift-Tilde Перезапуск скрипта Ctrl-Shift-Tilde  Скрипт имеет минимальный подсказывающий GUI, в котором отображены все символьные слои, базовая раскладка, выбранные языковые наборы, некоторые переключаемые опции и переназначения.Все скриншоты выше взяты из него.Дополнительно присутствуют: вкладка скан.кодов (как подсказка для добавления назначений в config.ini), список языковых наборов (с возможностью смены активного двойным нажатием) и список горячих клавиш.Отображение GUI переключается кликом по иконке в трее или сочетанием Alt-F1.Пока GUI активен, переключение между вкладками может быть осуществлено клавишами F1-F7.Нажатие клавиши в буквенной части клавиатуры выделят данную клавишу на "слоевых" вкладках. Пример отображения основного символьного слоя с включённым переназначением управляющих клавиш, дополнительными переназначениями в цифровом ряду и включённой опцией парных скобок: Данный проект дополняет клавиатурную раскладку предоставляя единый доступ к более чем 100 уникальным символам и 10 командам, языковому блоку, охватывающему все языки кириллической и латинской письменностей, с их особенностями, а также к различному вспомогательному функционалу и пользовательским назначениям. Предлагаемая модульная система клавиатурных назначений позволяет и в дальнейшем вносить изменения и дополнения в любой блок, не затрагивая прочие.А дополнять ещё есть чем, и есть куда. Спасибо, что дочитали. Буду рад всем комментариям, предложениям, замечаниям.Если вы носитель языка, отличного от основного языка письменности, буду отдельно рад отзывам и предложениям по поддержке конкретных языков. upd: внесены некоторые изменения в существующие языковые наборы, добавлены новые, перерасположены по использованию; сформированы полноразмерные наборы без "базы", для языков с богатым набором дополнительных символов (для польского, венгерского и литовского и сохранены частичные наборы, и добавлены полноразмерные).  Python developer