Содержание
• Краткий экскурс
• Краткий перечень возможностей
• Подробнее об основных возможностях
⁃ Многослойные привязки
⁃ Режим композиции
⁃ Альтернативный ввод
⁃ Вариации глифов
⁃ TELEX/VNI-подобный ввод
⁃ Поиск
⁃ Внутренние раскладки клавиатуры
⁃ Модификации
• Главная панель
• Окно настройек
• Контекстное меню трея
• Менее значимые/вспомогательные возможности
• Установка и репозиторий
• Ограничения и нюансы
Программа даёт доступ к внушительному перечню символов Юникода прямо с клавиатуры. Основной фокус — увеличение охвата латиницы и кириллицы без надобности в отдельных языковых раскладках, помимо английской и русской. Но этим инструмент не ограничивается.
Написана на AutoHotkey v2

Краткий экскурс
Идея «DSL KeyPad» родилась из собственной потребности в «нестандартных» символах. Сначала я пользовалась «Типографской раскладкой» Ильи Бирмана (и пользуюсь по сей день в паре со своим инструментом), но этого мне оказалось мало — она не давала мне всего необходимого.
Работа над книгой стала отправным толчком: мне хотелось использовать в ней буквы «Ў», «Ӯ», «Ӣ», «О̄» и пр.: Сўкэнори, «Записи времён То̄бо̄» (Tōbō nendai-ki), Фӯдзин. Я искала и пробовала другие решения — например, WinCompose, — но по итогу это привело меня к мысли «всё не совсем то». Тогда я уже занималась написанием своего скрипта, ещё совсем простого, и продолжила его развивать.
Первая версия была до банальности примитивной, ~20 биндов формата обычных привязок:
<^<!m:: Send("{U+0304}") ; Combining macron
<^<!b:: Send("{U+0306}") ; Combining breve
…
<^>!>+1:: Send("{U+2003}") ; Em Space
<^>!>+2:: Send("{U+2002}") ; En Space
…
<^<!e:: Send("{U+045E}") ; (Ў)
…
Со временем мою голову начали посещать всё новые идеи и желание хотя бы попробовать их реализовать. Желание сделать что-то сложнее, разнообразнее, и что могло бы охватить все мои потенциальные символьные хотелки. Как итог — процесс, конечно, сильно затянулся, да получился какой-то монструозный ООП’оид, но результатом я довольна (есть что улучшать, и я буду это улучшать по мере возможности).
Думаю тут же следует упомянуть, что я не программист. Максимум кодер. В начале разработки так вообще была утёнком тем ещё и бегала частенько к нейронке (с которой контакт заладился плохо — не умел гпт с автохоткеем нормально помочь… и хорошо — лишний пинок самой думать над кодом).
Краткий перечень возможностей
Как описано в заголовке — поддержка более 4 700 символов Юникода, включая: пунктуацию, математические символы, символы валют, специальные символы, алхимические и т.д.
«Многослойный» набор привязок, в основном — раздельных для английского и русского языков ([англ.]
RAlt + A
→ Ă,RAlt + Z
→ Ż; [рус.]RAlt + Ф
→ Ѳ,RAlt + Я
→ Ѧ). Включает поддержку пользовательских привязок в JSON‐формате.Режим композиции — активируется двойным нажатием
RAlt
и позволяет получать одни символы из последовательности других («рецепта») (AE → Æ; OE → Œ; A◌̆◌́ → Ắ; ІѪ → Ѭ; ДЧ → Ԭ; ΣΤ → Ϛ, αͺ → ᾳ). Включает поддержку пользовательских рецептов в INI/JSON/XCompose форматах.Альтернативные режимы ввода для форм письменности, отличных от латиницы и кириллицы (греческая письменность, руническая, глаголица, финикийская, этрусская, тюркская, пермская и пр. виды письменности; включает и Международный фонетический алфавит).
Вариации глифов — режимы, позволяющие вводить альтернативные варианты символов (A → ᴬ ? ? ? ? ? ? ? ? ᴀ ? ? ? ? ?). Интерфейс схож с предыдущим пнуктом, но сама фича работает чуть-чуть иначе (см. в подробном описании).
Переключение режима ввода между символами Юникода [
Ă Ǣ
], HTML-энтити/мнемоники [Ă Ǣ
] и LaTeX [\u{A} \={\AE}
] (если LaTeX команды нет — введёт символ Юникода) (RAlt + RShift + F1
).Поиск символов по «тегам». У большинства из символов локальной библиотеки есть два и более тегов, по сути, представляющих из себя варианты названий, которые можно вводить как полностью, так и частично, чтобы получить результат (
прописная буква Еры глаголицы
илигла еры
→ ⰟⰊ).Внутренние раскладки клавиатуры, позволяющие использовать отличное от QWERTY/ЙЦУКЕН расположение привязок. Включает поддержку пользовательских раскладок в JSON‐формате.
Вспомогательные TELEX/VNI-подобные режимы ввода для вьетнамского языка (с щепоткой джарайского) и для пиньиня.
Мини-режимы для ввода надстрочных/подстрочных символов цифрового ряда (
LWin LAlt + ↑/↓
), при этомCapsLock
зеркалит вводимые символы (при активном надстрочном режиме — активацияCapsLock
заставит вводиться подстрочные, и наоборот).Мини-режим для ввода римских цифр (отдельных символов Юникода) (
LWin LAlt RShift + ↑
): ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ…Возможность добавлять символы в избранное. Избранный символ будет выделяться в списке символом ★, а его рецепт (если он есть) будет всегда отображаться в подсказке режима композиции.
Поддержка модификаций. Возможно добавление, например, собственного «Альтернативного» или TELEX/VNI-подобного режима к уже существующим.
И другие, менее значимые возможности…
Подробнее об основных возможностях
Многослойные привязки, они же «Быстрые ключи»
Самое страшное. Их много, невероятно много, и опытный пианист, безусловно, справится с ними. Если верить .HotKeysCount()
’у, то их более восьмисот. На каждой клавише может быть до 10–11-ти возможных комбинаций (если не считать комбинации с активным CapsLock за отдельные), но в среднем их около восьми (латинская I в этом чемпион: Ĭ Ï Ī Ĩ Î Ǐ Į İ Í Ì Ȉ).

В случае необходимости их можно отключить/включить через RAlt + F1
. Состояние сохраняется в файле настроек.
Инструмент создавался под полноразмерную клавиатуру — со стрелками, нампадом и т.д. Это может вызывать неудобства у пользователей других вариантов клавиатур, однако это можно сгладить через пользовательские привязки.
Некоторые комбинации были унаследованы от «Типографской раскладки»:
RAlt + Точка (/)
— вводит многоточие [ … ],RAlt + 1 | 7
— вводят перевёрнутые восклицательный и вопросительный знак [ ¡ ¿ ],RAlt + 5
— вводит промилле [ ‰ ],RAlt LAlt + 8
— вводит символ бесконечности [ ∞ ] (оригинальную комбинацию занял символ умножения [ × ], а потому для бесконечности в неё был добавлен левый Альт),RAlt *(LShift) + Дефисо-минус
— вводят длинное и короткое тире [ — – ],RAlt + Равно
— не равно [ ≠ ],RAlt + Пробел
— неразрывный пробел [ ].
Комбинации для вставки кавычек унаследованы ввиде Б (<)
и Ю (>)
как и в «Типографской раскладке», но имеют несколько отличное поведение:
RAlt + Б (<) | Ю (>)
— вводят [ « » ], если активен русский язык, или [ “ ” ], если активен английский,RAlt LAlt + Б (<) | Ю (>)
— тоже, что и предыдущее, но языки поменялись местами,RAlt LShift + Б (<) | Ю (>)
— вводят [ „ “ ], если активен русский язык, или [ ‘ ’ ], если активен английский,RAlt RShift + Ё (`)
— дополнительная комбинация под [ ’ ] для использования в качестве апострофа.
Примеры уже собственных привязок:
RAlt + Клавиши стрелок
— [ ←↑↓→ ],RAlt + Пары клавиш стрелок (влево-вверх, вправо-вверх, влево-вниз и т.д.)
— [ ↖↗↙↘↔↕ ],RAlt LShift + Клавиши стрелок
— [ ⮌⮍⮏⮎ ],RAlt RShift + Клавиши стрелок влево/вправо
— [ ↺↻ ],RAlt RShift + Пробел
— круглая шпация [ ],RAlt LShift + Пробел
— полукруглая шпация [ ],RAlt LAlt + Пробел
— тонкая шпация [ ],RAlt + 9 | 0
— [ ⟨ ⟩ ],RAlt + [ | ]
— [ ⁅ ⁆ ],RAlt LAlt LShift RShift + [ | ]
— [ 《 》 ],RShift *(CapsLock) + 1
— [ ‽ ⸘ ].
Комбинации, которые не будут отображены в интерфейсе:
-
Shift + 2, 3, 4, 6, 7
отзеркалены для языков наRShift
, т.е. при английскомLShift + 2
введёт [ @ ] (как обычно), аRShift + 2
— [ " ], на русском — наоборот.2 (@"), 3 (#№), 4 ($;), 6 (^:), 7 (&?).
RShift *(LShift) + Х, Ъ
введут скобки [] и {} соответственно.
Ещё есть «Вторичные» и «Третичные ключи», активируемые через RAlt LAlt + F1
и RAlt LAlt + F2
. Это дополнительные привязки для символов, которые не влезли в основной пул, но им очень хотелось. Они пришли на замену са́мой первой, отбракованной «механике» инструмента — «Группам активации»: необходимо было нажать комбинацию для активации одной из «групп», а затем ввести символьный ключ желаемого знака.
Отключаются эти ключи повторным нажатием их комбинации, а состояние сохраняется в файле настроек.
Карты привязок
Здесь будут показаны лишь некоторые из них, так как их очень много — картинок ~28.
Все комбинации можно посмотреть в «Панели», открываемой через контекстное меню иконки в трее или через комбинацию LWin + LAlt + Home
.
Думаю ещё и над вариантом добавить окно с клавиатуроподобным интерфейсом для более дружелюбного отображения привязок.
Правый Alt


Правый Alt + Левый Shift


Правый + Левый Alt’ы


Левые Ctrl + Alt

Пользовательские привязки
Для создания привязок необходимо разместить <ФАЙЛ>.JSON
в «DSLKeyPad\User\profile-<ПРОФИЛЬ>\CustomBindings\
» со схожей структурой:
{
"info": {
// Имя пресета
"name": "Esoteric Binds"
},
// Перечень привязок, как для одиночных клавиш
// так и для привязок с модификаторами
"binds": {
"2:LangFlat": ["digit_2::superscript×20", "digit_1::superscript×10"],
"A": ["alchemical_brimstone", "alchemical_brimstone_philosophers"],
"<^>!A": "alchemical_brimstone_black",
"<^>!B": ["astrological_proserpina"],
">+A:Caps": ["astrological_neptune", "astrological_uranus"],
"<^>!И": ["astrological_chiron"],
"<^>!Y": [
"@ඞʂ?",
"@Сижу за решёткой в темнице сырой.\nВскормленный в неволе орёл молодой,\nМой грустный товарищ, махая крылом,\nКровавую пищу клюёт под окном,\n\nКлюёт, и бросает, и смотрит в окно,\nКак будто со мною задумал одно.\nЗовёт меня взглядом и криком своим\nИ вымолвить хочет: «Давай, улетим!\n\nМы вольные птицы; пора, брат, пора!\nТуда, где за тучей белеет гора,\nТуда, где синеют морские края,\nТуда, где гуляем лишь ветер… да я!…»"
]
}
}
Примечание: кодировка файла должна быть UTF-8.
Пользовательские привязки поддерживают следующие форматы:
// «Плоская» привязка (для всех языков)
// Не рекомендуется использовать к буквенным клавишам.
<"МОДИФИКАТОР?КЛЮЧ">: <"ЗНАЧЕНИЕ">
// Привязка для клавиши конкретного языка
<"МОДИФИКАТОР?КЛЮЧ">: [<"ЗНАЧЕНИЕ">]
// То же самое, но разные значения для активного и неактивного CpasLock
<"МОДИФИКАТОР?КЛЮЧ">: [<"ЗНАЧЕНИЕ">, <"ЗНАЧЕНИЕ">]
// «Плоский» вариант
<"МОДИФИКАТОР?КЛЮЧ:Caps">: [<"ЗНАЧЕНИЕ">, <"ЗНАЧЕНИЕ">]
// Привязка, где первый вариант будет относиться к английской раскладке,
// а второй к русской
// Не рекомендуется использовать к буквенным клавишам.
<"МОДИФИКАТОР?КЛЮЧ:LangFlat">: [<"ЗНАЧЕНИЕ">, <"ЗНАЧЕНИЕ">]
И следующие типы значений:
// Обычный текст
"@<ТЕКСТ>"
// Ссылка на запись в библиотеке
"<ИМЯ ЗАПИСИ>::<ВАРИАНТ>×<КОЛИЧЕСТВО>"
Подробнее о формате ссылки на запись см. ниже.
Модификаторы: <
и >
указывают «левый» или «правый», ^
, !
, +
— Ctrl
, Alt
, Shift
. Для RAlt
нужно использовать конструкцию <^>!
.
После создания пресета его можно будет выбрать в окне настроек либо после перезапуска программы, либо после нажатия кнопки ? рядом с выпадающим списком в окне настроек.
Режим композиции
Вдохновлён клавишей Compose из Linux и WinCompose. Преобразует последовательность одних символов во что-то другое.
Активируется двойным нажатием RAlt
. Ввод пользователя будет отображаться во всплывающей подсказке вместе с предложениями совпадений и списком рецептов избранных символов.

Введение «композиции» дало больше простора для ввода. Клавиатура не резиновая и не может уместить бесконечное число привязок. Композиция же принимает любой ввод, в том числе и от «Быстрых ключей», что даёт большу́ю вариативность в рецептах и доступ к бо́льшему количеству символов напрямую с клавиатуры.
Режим композиции срабатывает на первое точное совпадение рецепта. Это и плюс и немного минус — такое поведение не позволит ввести, например, Ǣ
из-за автоматического срабатывания AE
→ Æ
. Для решения этой проблемы я ввела режим удержания (клавиша Pause
), при котором композиция ждёт нажатия Enter
или снятия с удержания.
Помимо режима удержания можно использовать «оператор» гравис [ ` ]. Он не отменяет автоматическое срабатывание, но сохраняет его результат в переменной активной композиции вместо отправки в окно приложения. Это позволяет продолжить последовательности, если есть рецепты, начинающиеся с полученного результата. Ǣ
= A`E → Æ → Æ<МАКРОН>.
Общий перечень клавиш:
Enter
— подтвердить ввод.Escape
— отменить режим композиции.Backspace
— стереть последний символ.Insert
— вставка содержимого буфера обмена.Pause
— переключение удержания.
Операторы
Гравис [ ` ] — описан выше.
(ЧИСЛО) — при начале ввода с такого оператора результат рецепта будет продублирован указанное число раз, «(5) TH» → «ÞÞÞÞÞ».
(~) — при начале ввода с такого оператора можно вводить целые слова, внутри которых будут обработаны рецепты, «(~) T<ЗАПЯТАЯ СНИЗУ>ara Roma<ЦИРКУМФЛЕКС>neasca<КРАТКА>» → «Țara Românească».
(ЧИСЛО~) — объединение предыдущих операторов.
## — позволяет предотвратить обработку нежелательных последовательностей, «(~) tho<АКУТ>rr» → «þórr», «(~) t##ho<АКУТ>rr» → «thórr».
Ввод кодовых точек Юникода и Альт-кодов
Режим композиции можно использовать для вставки символов по их кодам. Ввод начинается с U+/Ю+ или A+/А+, а после — значение. Можно указывать множество значений, разделяя их пробелом.
На альт-коды влияет язык активной раскладки: числа 128–255 и 0128–0255 используют страницы 850/Windows−1252 для английской раскладки, 866/Windows−1251 для русской, 737/Windows−1253 для греческой, Windows−1258 для вьетнмаской.
Альт-коды можно вводить в шестнадцатеричном формате: A+0B9
= A+0185
→ № (Windows−1251). Для этого ввод должен содержать букву из диапазона A–F. Верхняя граница — A+FF (A+255).


Пользовательские рецепты
Как «вручную», так и через окно интерфейса можно создавать свои рецепты для композиции. Результат может быть сколько угодно объёмным многострочным текстом, но не рекомендую вставлять туда через чур большой текст.


При первом запуске создаётся несколько рецептов для демонстрации — шаблон HTML, иероглиф «義», тег <kbd> и эмодзи «?».
Основной файл представлен в JSON‐формате, «DSLKeyPad\User\profile-<ПРОФИЛЬ>\CustomRecipes.json
». Можно добавлять и дополнительные файлы рецептов в INI (UTF-16 LE) или JSON (UTF-8) форматах, размещая в директории «DSLKeyPad\User\profile-<ПРОФИЛЬ>\CustomRecipes\
». Рецепты оттуда будут автоматически загружены при старте программы или при нажатии кнопки обновления в окне «Мои рецепты».
Поддерживается подгрузка последовательностей из файлов формата XCompose. Их небходимо помещать в директорию «DSLKeyPad\User\profile-<ПРОФИЛЬ>\XCompose\
». Файл должен заканчиваться расширением «.XCompose
»
Примечание: поддерживаются только простые последовательности XCompose, как, например, «<Multi_key> <g> <r> <i> <n> : "?"
» или «<Multi_key> <U1100> <U1100> : "ᄁ" U1101 # HANGUL CHOSEONG SSANGKIYEOK
». При первом запуске в демонстрационных целях по указанному пути создаётся файл «demo.XCompose» с последовательностью «<Multi_key> <0> <0> : "∞"
».
Пример дополнительного файла рецептов
В формате INI:
[alchemical_sulfuric_acid]
name=ru:Алх. Серная кислота|en:Alc. Sulfuric Acid
recipe=alc sulf acid
result=??
[chemical_sulfuric_acid]
name=ru:Серная кислота|en:Sulfuric Acid
recipe=chem sulf acid|H2SO4
result=H₂SO₄
[emoji_castle]
name=ru:Сиро|en:Shiro
recipe=cls|змк
result=?
; [custom_entry_name] — Имя записи, может содержать только «a–Z» и «_» символы
; name — Отображаемое имя в окне пользовательских рецептов. Может быть простой
; строкой, так и быть с указанием локализации для поддерживаемых языков
; recipe — Сам рецепт, может быть простой строкой или содежать несколько рецептов,
; разделяемых «|». Можно использовать ссылки на другие записи как ${имя_записи}
; result — Результат рецепта. Также может содержать ${ссылки}
; то же самое с примером ссылок:
[alchemical_sulfuric_acid]
name=ru:Алх. Серная кислота|en:Alc. Sulfuric Acid
recipe=alc sulf acid
result=${alchemical_acid_vinegar}${alchemical_vitriol_1}
[chemical_sulfuric_acid]
name=ru:Серная кислота|en:Sulfuric Acid
recipe=chem sulf acid|H2SO4
result=H${digit_2::subscript}SO${digit_4::subscript}
В формате JSON:
[
"alchemical_sulfuric_acid",
{
"name": "ru:Алх. Серная кислота|en:Alc. Sulfuric Acid",
"recipe": "alc sulf acid",
// Представление результата в виде массива
// для удобства вставки и редактирования
// многострочного значения, например:
// [
// "Первая строка\n",
// "Вторая строка\n"
// "Третья строка"
// ]
"result": ["??"]
},
"chemical_sulfuric_acid",
{
"name": "ru:Серная кислота|en:Sulfuric Acid",
"recipe": "chem sulf acid|H2SO4",
"result": ["H₂SO₄"]
},
"emoji_castle",
{
"name": "ru:Сиро|en:Shiro",
"recipe": "cls|змк",
"result": ["?"]
},
// С ссылками
"alchemical_sulfuric_acid",
{
"name": "ru:Алх. Серная кислота|en:Alc. Sulfuric Acid",
"recipe": "alc sulf acid",
"result": ["${alchemical_acid_vinegar}${alchemical_vitriol_1}"]
},
"chemical_sulfuric_acid",
{
"name": "ru:Серная кислота|en:Sulfuric Acid",
"recipe": "chem sulf acid|H2SO4",
"result": ["H${digit_2::subscript}SO${digit_4::subscript}"]
}
]
Формат ссылки на записи
${<ИМЯ ЗАПИСИ>::<ВАРИАНТ>×<КОЛИЧЕСТВО>} — ссылка, обращающаяся к записи библиотеки, если та существует. Через «::» можно задать вариацию (${digit_1} → «1» | ${digit_1::superscript} → «¹»). В конце ссылки через символ «×» можно указать количество повторений вывода записи (${digit_1::superscript×10} → «¹¹¹¹¹¹¹¹¹¹»).
Одной ссылкой можно обратиться сразу к нескольким записям, помещая названия или их часть в \/
конструкцию, например: ${lat_c_let_\b,o,l,d/::bold}
→ ????, ${\hel,lat/_c_let_a_alpha}
→ ΑⱭ, ${\nabla,delta,integral,square_root/}
→ ∇∆∫√.
Ссылки можно использовать и между пользовательскими рецептами для создания зависящих друг от друга рецептов, например:
[white_heart]
name=Белое сердце
recipe=бср|whr
result=?
[white_heart_triple]
name=Три белых сердца
recipe=3бср|3whr
result=${white_heart×3} ; вставляет результат первого рецепта трижды
Для <Вариантов> существуют альтернативные формы записи для удобства/сокращения:
Bold — полужирный, п, b
Italic — курсив, ку, it
ItalicBold — курсив полужирный, куп, itb
Modifier — верхний индекс, ви, sup
Superscript — верхний индекс, ви, sup
Subscript — нижний индекс, ни, sub
Fraktur — фрактур, ф, f
FrakturBold — полужирный фрактур, пф, fb
Script — рукописный, р, s
ScriptBold — полужирный рукописный, пр, sb
DoubleStruck — ds
SansSerif — без засечек, бз, ss
SansSerifItalic — курсив без засечек, кубз, ssit
SansSerifItalicBold — курсив полужирный без засечек, купбз, ssitb
SansSerifBold — полужирный без засечек, пбз, ssb
Monospace — моноширинный, м, m
Fullwidth — полноширинный, пш, fw
SmallCapital — капитель, к, sc
SmallCapitalModifier — капитель-модификатор, км, scm
Small — маленькая, мал, sm
Combining — комбинируемый, ко, c
Uncombined — некомбинируемый, неко, uc
Для дополнительных файлов рецептов есть возможность добавлять несколько параметров для всех содержащихся в них рецептов (указываются вручную в начале файла):
[options]
; последовательность, устанавливаемая в начало всех рецептов в файле
prefix=<ПЕРФИКС>
; отключает добавление пробела после префикса
no_whitespace=1
; … рецепты
[
"options": {
"prefix": <"ПЕРФИКС">,
"no_whitespace": 1
},
// … рецепты
]
Если в файле есть двойные (и более) рецепты (например «лёд|ice»), для них можно задать и подобного вида префиксы (одинарные рецепты всегда берут первый из префиксов):
[options]
prefix=эмодзи|emoji
[recipe_name]
name=Лёд
; потребует ввода «эмодзи лёд» или «emoji ice»
recipe=лёд|ice
result=?
PS. Не рекомендую использовать больше 1 500 пользовательских рецептов (что очень легко получить с XCompose-файлами). Сейчас такое может ощутимо замедлить инициализацию программы, но возможно у меня получится это оптимизировать.

Альтернативный ввод

Комбинация: LWin + LAlt + S
(селектор)
По сути — просто наборы активируемых привязок для целого перечня форм письменности/алфавитов, в основном отличных от латиницы и кириллицы.
Примечание: наборы привязок используют клавиши латиницы и кириллицы, т.е. смена раскладки влияет на них. Несовместим с TELEX/VNI-подобными режимами ввода.
Некоторые формы письменности активируются парами — одна письменность работает на латинской раскладке, другая на кириллической. В остальном режимы одиночны, работают сразу на нескольких языковых раскладках, но предназначены именно для латинской (в особенности режимы с вводом слогов).
-
Эллинское письмо (оно же — греческое) — позволяет вводить как символы современного греческого алфавита, так и древнегреческие знаки с добавлением прочих различных символов, относящихся к нему, например:
αάὰὰἀᾳᾱᾰἅἄἃἂἇἆ ΐ ϐϕϱϖϰϲϵ
· ; ⸒ ⸏ ⸐ ⸑ ⸎ ⸔ ⸕ ⸓ ⸖ ʹ ͵ ₯От стандартной греческой раскладки отличается типичным для английского расположением небуквенных символов и наличием коппы и дигаммы (
Ϟ
Ϝ
) на местеQ
W
(;
ς
на греческой раскладке). Здесь знакς
вводится комбинациейLAlt Σ (S)
.Положение привязок не изменяется при смене латинской/кириллической раскладки — для Эллинского письма введена собственная раскладка, однако изменить её нельзя (ну, льзя, просто не посчитала нужным добавить пункт выбора в GUI настроек).
Германские руны — позволяет вводить руны Старшего Футарка, Англосаксонского Футорка, Младшего Футарка, Средневековые руны, «Золотые числа» 17–19 Рунического альманаха (ᛮᛯᛰ), Руны с Ларца Фрэнкса и ещё три руны Толкина за компанию. Ну и значки пунктуации (᛫᛬᛭).
Глаголица — основывается на кириллической раскладке и позволяет вводить как простые буквы глаголицы, так и комбинируемые и соответствующую диакритику. Включается в пару с «Германскими рунами».
И прочие, уже указанные на скриншоте формы письменности и алфавитов: Древнетюркское письмо, Древнепермское письмо (кириллическая раскладка, в паре с Древнетюркским), Секейское письмо, Готское письмо, Этрусское письмо (древнеиталийское, включает символы не только этрусского алфавита), Финикийское письмо, Южноаравийское письмо, Североаравийское письмо, Карийское письмо, Ликийское письмо, Лидийское письмо, Сидетское письмо (на данный момент введён режим и записи библиотеки символов, но официально Сидетская письменность будет введена в Юникод с релизом Unicode 17.0 минимум 9-го сентября, потому пока будут квадратики вместо букв и шрифты найти не получиться), Кипрское слоговое письмо, Тифинаг, Угаритское письмо, Древнеперсидское письмо, Международный фонетический алфавит, Дезеретский алфавит, Алфавит Шоу и режим для ввода математических символов.
Полный охват для каждого режима не гарантирую, но при обнаружении новых или упущенных мной символов — режим будет дополнен.
Вариации глифов

Комбинация: LWin + LAlt + A
(селектор)
Имеет такой же селектор, как у «Альтернативного ввода», но вместо набора привязок указывает программе, какой вариант символа нужно использовать. У записей библиотеки есть атрибут, в котором прописаны варианты — полужирный, курсивный, капитель и т.д. Такие символы не представлены отдельными записями, являясь лишь свойством. Это делает «Вариации глифов» легко совместимыми с фичами, полагающимися на создание привязок.
Если в записи символа отсутствует указанный вариант — будет послан «обычный» символ.
В главной панели под предпросмотром символа будут отображаться первые восемь из доступных вариантов, а справа от предпросмотра активируется кнопка, открывающая GUI для просмотра всех вариантов (которое так же можно открыть через меню трея → Вариации глифов → Панель вариации глифов):

TELEX/VNI-подобный ввод
Режимы, основанные на вьетнамских TELEX и VNI раскладках для облегчения ввода, собственно, вьетнамского (с добавлением букв джарайского алфавита) и пиньиня. Несовместимы с режимами Альтернативного ввода.
Комбинации: RAlt + F2
(Вьетнамский), RAlt + RShift + F2
(Пиньинь) / LWin + LAlt + D
(селектор)

Для ввода букв с диакритикой необходимо вводить последовательность символов, например: AWS
→ Ắ (A → Ă → Ắ), A5
→ Ẫ, DD
→ Đ, BB
→ Ƀ, UONGW
→ ƯƠNG, UONG5
→ ƯỠNG. Для отмены слипания последовательности можно использовать \
, A\W
→ AW вместо Ă или повторно ввести последний символ (AW → ĂW → AW). Последнюю введённую диакритику можно отменить вводом Z (ǕZ → ÜZ → U).
Можно менять диакритику уже введённого символа, если не перемещать каретку: ẰS
→ Ắ, ẮA
→ Ấ, ẤJ
→ Ậ, ẬR
→ Ẩ…

Перечень символов режимов
-
Tiếng Việt: Á À Ả Ã Ạ Â Ấ Ầ Ẩ Ẫ Ậ Ă Ắ Ằ Ẳ Ẵ Ặ É È Ẻ Ẽ Ẹ Ê Ế Ề Ể Ễ Ệ Í Ì Ỉ Ĩ Ị Ó Ò Ỏ Õ Ọ Ô Ố Ồ Ổ Ỗ Ộ Ơ Ớ Ờ Ở Ỡ Ợ Ú Ù Ủ Ũ Ụ Ư Ứ Ừ Ử Ữ Ự Đ
Jơrai: Ĕ Ě Ĭ Ŏ Ǒ Ö Ŭ Ü Ƀ Č Ñ
Hànyǔ Pīnyīn: Ā Á À Ǎ Ē É È Ě Ī Í Ì Ǐ Ō Ó Ò Ǒ Ū Ú Ù Ǔ Ü Ǖ Ǘ Ǜ Ǚ
Нюансы
Работает, не так хорошо, как настоящая вьетнамская языковая раскладка — не учитывает контекст поля ввода и перемещение каретки в нём. Для получения контекста необходимо (если не ошибаюсь) лезть в процесс активного окна, и я решила не рисковать — те же античиты в играх такое не оценят, особенно со стороны автохоткея. Было бы не очень, слови пользователь моей программы бан за такое (или я же сама).
Если по какой-то причине «локальный» контекст (видимый во всплывающей подсказке) не совпадает с контекстом поля ввода — его можно сбросить нажатием RCtrl
. Так же локальный контекст сбрасывают Enter
, Esc
, Home
, Page Up/Down
, Del
, клавиши стрелок, ввод пробельных символов.
Ещё один нюанс — не во всех приложениях оно будет работать как задумано из-за отсутствия механизмов IME. Например, в VS Code попытка ввести Ắ приведёт к разными результатам: ĂẮ, AẮ, Ắ, AĂẮ.
В общем, есть что дорабатывать. Если автохоткей позволит (безопасно) использовать средства IME или нечто подобное — эти режимы ждёт видимое улучшение. Я, конечно, спрашивала нейросети про это, но ни одного маломальски рабочего решения они не предложили.
Поиск

Комбинация: LWin + LAlt + F
Как уже упоминалось — у каждого символа есть набор «тегов», и они могут быть весьма длинными. Например, «строчная буква омега с псили, периспомени и ипогеграммени эллиницы
» даст символ «ᾦ».
Вводить полный тег не обязательно — «омег пс пе ип
» даст тот же «ᾦ». Однако чем короче запрос, тем менее точный будет результат. Через запятую можно вводить множество запросов:
«
дез ди, !дез ди, lamb, !lamb
» → «??Λλ
»«
ref, obe, psms, msps
» → «※÷±∓
»
Вместо тега можно ввести имя записи, например «hel_c_let_l_lambda
» → «Λ
».
Можно использовать регулярные выражения, например:
«
fut.*?\s+\S+al
» (ищем тег с любыми символами и пробелами между fut и al) → «ᚺ» (руна Хагалаз), полный тег: «germanic rune elder futhark Hagalaz
».«
az$
» (ищем тег с az в конце) → «ᛞ» (руна Манназ), полный тег: «germanic rune elder futhark Mannaz
».«
^фра
» (ищем тег с фра в начале) → «₣» (Франк).
Поддерживается и указание вариации глифа, добавляя ::<ВАРИАНТ> в конец запроса:
«
лигатура ae, лигатура ae::капитель, !латин h::фрактур
» → «Æᴁ?
»
Помимо поиска символов, окно ввода запроса поддерживает вызов некоторых методов/функций:
\
или/Reload
— перезапускает программу./Exit
— закрывает программу./ChrLib.Print
— создаёт и открывает файл «printed_pairs.html
» с перечислением записей локальной библиотеки формата «символ — имя записи»./MyRecipes.Update
— ре-инициализирует пользовательские рецепты./Update.Get
или/Update.Repair
— получить обновление или восстановить текущую версию.%globalInstances.crafter.Start("Compose")%
— аналогично RAlt×2 активирует режим композиции…/KbdBinder.Init
— ре-инициализирует раскладки и привязки.
Внутренние раскладки клавиатуры
Возможно они могли бы показаться лишними, но они необходимы — привязки прибиваются гвоздями к скан-кодам клавиш (что я посчитала более надёжным, чем к «абстракции» в виде буквы/названия клавиши). Из-за этого переключение системной раскладки не изменит положение привязок программы. Однако в настройках можно выбрать соответствующие внутренние раскладки и тогда привязки будут на корректных местах для отличных от QWERTY/ЙЦУКЕН раскладок.
Для латиницы доступны следующие раскладки: QWERTY, Colemak, Dvorak. Для кириллицы: ЙЦУКЕН, ЙІУКЕН (1907), Диктор. Раскладки могут отличаться от своего оригинала.
Диктор:
Для ввода «Ъ» необходимо зажать левый Альт и нажать на «Ь». При этом «Быстрые ключи», назначенные на «Ъ» переходят к «Ь» с добавлением левого Альта в комбинацию (было
RAlt *(LShift) + Ъ
→ ҮҰ, сталоRAlt + LAlt *(LShift) + Ь
→ ҮҰ).Цифровой ряд от ЙЦУКЕН.
ИІУКЕН:
*Добавлена скорее ради забавы.
Ввод «-_— –» и «=+≠≈±» перенесён на клавиши «Ъ» и «\» по ЙЦУКЕН.
Цифровой ряд от ЙЦУКЕН, за исключением «-» и «=».
Если в программе нет подходящей раскладки — её можно создать самому через <ФАЙЛ>.JSON
разметку в «DSLKeyPad\User\profile-<ПРОФИЛЬ>\CustomLayouts\
» со следующей структурой:
{
"info": {
// название
"name": "AZERTY",
// latin если для английского, cyrillic если для русского языка
"type": "latin"
},
// Перечень клавиш
"keys": {
// Поддерживает как прямое указание скан-кода
"A": "SC010",
"Z": "SC011",
// …
// так и имя клавиши на QWERTY/ЙЦУКЕН раскладке
"E": "E",
"Q": "A"
}
}
{
"info": {
"name": "КВЕРТИ",
"type": "cyrillic"
},
"keys": {
"К": "Й",
"В": "Ц",
// …
"А": "Ф",
"С": "Ы",
"Ф": "А"
}
}
Более полный пример варианта AZERTY раскладки, включающий собственные привязки, активируемые при выборе этой раскладки:
{
"info": {
"name": "AZERTY",
"type": "latin"
},
"keys": {
"A": "SC010",
"Z": "SC011",
"E": "E",
"R": "R",
"T": "T",
"Y": "Y",
"U": "U",
"I": "I",
"O": "O",
"P": "P",
"CircumflexAccent": "LeftBracket",
"Dollar": "RightBracket",
"Q": "A",
"S": "S",
"D": "D",
"F": "F",
"G": "G",
"H": "H",
"J": "J",
"K": "K",
"L": "L",
"M": "Semicolon",
"SmallUWithGrave": "Apostrophe",
"Asterisk": "Backslash",
"W": "Z",
"X": "X",
"C": "C",
"V": "V",
"B": "B",
"N": "N",
"Comma": "M",
"Semicolon": "Comma",
"Colon": "Dot",
"Exclamation": "Slash",
"Equals": "SC00D"
},
"binds": {
// Список привязок к клавишам
"Flat": {
// Префикс [lazy] указывает, что привязка будет включена
// только при активном «Ремаппинге»
"[lazy]1": ["[digit_1,lat_s_lig_et]"], // 1&
"[lazy]2": ["[digit_2,lat_s_let_e__acute]"], // 2é
"[lazy]3": ["[digit_3,quote]"], // 3"
"[lazy]4": ["[digit_4,apostrophe]"], // 4'
"[lazy]5": ["[digit_5,left_parenthesis]"], // 5(
"[lazy]6": ["[digit_6,hyphen_minus]"], // 6-
"[lazy]7": ["[digit_7,lat_s_let_e__grave]"], // 7è
"[lazy]8": ["[digit_8,underscore]"], // 8_
"[lazy]9": ["[digit_9,lat_s_let_c__cedilla]"], // 9ç
"[lazy]0": ["[digit_0,lat_s_let_a__acute]"], // 0á
"[lazy]HyphenMinus": ["[degree,right_parenthesis]"], // °)
"[lazy]Tilde": ["digit_2::subscript"], // ₂
"[lazy]CircumflexAccent": ["[diaeresis,circumflex]"], // ◌̈◌̂
"[lazy]Dollar": ["[wallet_franc,wallet_dollar]"], // ₣$
"[lazy]SmallUWithGrave": ["[percent,lat_s_let_u__grave]"], // %ù
"[lazy]Asterisk": ["[hel_s_let_m_mu,asterisk]"], // μ*
"[lazy]Comma": ["[question,comma]"], // ?,
"[lazy]Semicolon": ["[dot,semicolon]"], // .;
"[lazy]Colon": ["[solidus,colon]"], // /:
"[lazy]Exclamation": ["[section,exclamation]"] // §!
},
// Список привязок с модификаторами
"Moded": {
"1": {
"<+": ["[lat_s_lig_et,digit_1]"]
},
"2": {
"<^>!": ["tilde"], // ~
"<+": ["[lat_s_let_e__acute,digit_2]"]
},
"3": {
"<^>!": ["number_sign"], // #
"<+": ["[quote,digit_3]"]
},
"4": {
"<^>!": ["left_brace"], // {
"<+": ["[apostrophe,digit_4]"]
},
"5": {
"<^>!": ["left_bracket"], // [
"<+": ["[left_parenthesis,digit_5]"]
},
"6": {
"<^>!": ["vertical_line"], // |
"<+": ["[hyphen_minus,digit_6]"]
},
"7": {
"<^>!": ["grave"], // ◌̀
"<+": ["[lat_s_let_e__grave,digit_7]"]
},
"8": {
"<^>!": ["reverse_solidus"], // \
"<+": ["[underscore,digit_8]"]
},
"9": {
"<^>!": ["circumflex_accent"], // ^
"<+": ["[lat_s_let_c__cedilla,digit_9]"]
},
"0": {
"<^>!": ["commercial_at"], // @
"<+": ["[lat_s_let_a__acute,digit_0]"]
},
"HyphenMinus": {
"<^>!": ["right_bracket"], // ]
"<+": ["[right_parenthesis,hyphen_minus]"]
},
"E": { "<^>!": ["wallet_eur"] }, // €
"Dollar": { "<^>!": ["wallet_sign"] }, // ¤
"Equals": { "<^>!": ["right_brace"], "+": "plus" } // }
}
}
}
Модификации
В директории «DSLKeyPad\Mods\
» можно размещать сторонние AHK-файлы в качестве «модов» к программе. С помощью модификаций можно значительно кастомизировать программу, например, добавив хоть сотню новых режимов «Альтернативного ввода» или вообще ввести новую, самостоятельную фичу.
Для создания мода необходимо создать папку со следующей базовой структурой:
Mods/
└── <ИМЯ МОДА>/
├── index.ahk
├── options.ini
└── preview.(ico|jpg|png) (необязательный файл)
Файл index.ahk
будет содержать логику мода и к нему можно подключать другие AHK-файлы через #Include
(ничем не отличается от независимого AHK-скрипта).
Файл options.ini
(UTF−16 LE):
[options]
title=<НАЗВАНИЕ>
version=<ВЕРСИЯ>
type=<ТИП ЗАГРУЗКИ>
author=<АВТОР> ; (опционально добавление @<ССЫЛКА>)
url=<ССЫЛКА НА СТРАНИЦУ МОДА>
description=<ОПИСАНИЕ>
; Локализованные варианты
[ru-RU] ; (или другой код языка)
title=…
author=…
description=…
Тип загрузки может быть pre_init
(для загрузки до основной инициализации) или post_init
(для загрузки после неё).
Моды автоматически подхватываются. После добавления нового мода следует подождать 5 секунд перед перезапуском программы.
Переключать моды можно через GUI: Меню трея → Модификации.
PS. если необходимо получить путь до папки вашего мода — он автоматически сохраняются в mods[«<ИМЯ МОДА>»]
.
PSS. моды — не изолированные друг от скрипты, т.е. возможен конфликт в именах переменных, классов.

Более сложный пример мода
Мод-пример, добавляющий новый режим Альтернативного ввода.
Ссылка: GitHub
Структура:
Mods/
└── Old Mongolian Sample Mod/
├── Data/
│ ├── alternative_modes.json
│ ├── binds.json
│ ├── characters.json
│ └── ui_main_panel_lists.json
├── Locale/
│ └── base.(ini или json)
├── Resources/
│ └── old_mongolian.ico
├── index.ahk
├── options.ini
└── preview.ico
options.ini
[options]
title=Old Mongolian
version=0.0
type=pre_init
description=This is an example of mod
[ru-RU]
title=Старомонгольское письмо
description=Это пример мода
Locale\base.json
Любые *.(ini|json)
-файлы в Locale\
автоматически подтягиваются программой из директорий активных модов. ini
-файлы должны быть формата UTF−16 LE
, json
-файлы — UTF−8
.
{
"ru-RU": {
"mods": {
"old_mongolian": {
// Параметр «__self» — собственное имя ключа-объекта,
// получаемое при ссылке на него, а не на его
// дочерний ключ
// Если ввод дочерних элементов не планируются,
// тогда значение можно указать напрямую
// "ключ": "значение"
"__self": "Старомонгольское письмо"
}
},
// Определение названий для селектора Альтернативного ввода
"script_labels": {
// Ссылка на другой ключ локализации
// Может быть комбинацией ключей:
// {@:script_labels.old_turkic:short<dictionary.et>old_permic}
// = значение ключей «script_labels.old_turkic.short»,
// «dictionary.et» и «script_labels.old_permic»
// Путь до последней точки у ключа до «<» передаётся
// ключу после «>». Двоеточие — аналог точки для формирования
// пути, но не передаётся во второй ключ.
// Результат — «Древнетюркское и Древнепермское письмо»
// Или {@:key+key2+key3+…} — просто комбинация ключей
// Может содержать указание языка: {@en-US:key}
"old_mongolian": "{@:mods.old_mongolian}"
},
"generated": {
// Регистрация префиксов и фрагмента тега для
// генерации названий и тегов
"prefix": { "old_mongolian": "Старомонгольск$(ая|ий|ое)" },
"tag": { "old_mongolian": "старомонгольск$(ая|ий|ое)" }
},
"scripts": {
"old_mongolian": {
// Перечень имён записей символов с указанием
// параметра «letter_locale», который берётся для
// генерации названия, если у записи символа
// активен параметр <запись>["options"]["useLetterLocale"]
// Если присвоить значение напрямую или через «__self»,
// тогда название в интерфейсе будет равно этому значению
"n_let_a": { "letter_locale": "А" },
"n_let_e": { "letter_locale": "Э" },
"n_let_i": { "letter_locale": "И" },
"n_let_o": { "letter_locale": "О" },
"n_let_u": { "letter_locale": "У" },
"n_let_ue": { "letter_locale": "Уэ" }
}
}
},
"en-US": {
"mods": {
"old_mongolian": {
"__self": "Old Mongolian"
}
},
"script_labels": {
"old_mongolian": "{@:mods.old_mongolian}"
},
"generated": {
"prefix": { "old_mongolian": "Old Mongolian" },
"tag": { "old_mongolian": "old mongolian" }
},
"scripts": {
"old_mongolian": {
"n_let_a": { "letter_locale": "A" },
"n_let_e": { "letter_locale": "E" },
"n_let_i": { "letter_locale": "I" },
"n_let_o": { "letter_locale": "O" },
"n_let_u": { "letter_locale": "U" },
"n_let_ue": { "letter_locale": "Ue" }
}
}
}
}
Data\characters.json
Файл с данными о добавляемых символах.
[
// Указание названия записи,
// с помощью [] можно создать запись сразу для
// множество символов
// [] может быть сколько угодно, главное,
// чтобы во всех было одинаковое число элементов,
// например: lat_[c,s]_let_[a,e]__[acute,grave] =>
// lat_c_let_a__acute, lat_s_let_e__grave
"old_mongolian_n_let_[a,e,i,o,u]",
{
"unicode": ["1820", "1821", "1822", "1823", "1824"],
"options": {
// Указывает текст, отображаемый в GUI для привязки
// Символ «$» заменится на текст после «let_» и до следующей «_»
//old_mongolian_n_let_a => $ → A
"altLayoutKey": "$",
// Упомянутый выше параметр для указания использования
// названия символа из локализации для генерации
// полного названия
// (необязательный параметр, так как дальше мы регистрируем
// префикс «old_mongolian» и параметр станет по умолчанию
// активным)
"useLetterLocale": true
}
},
"old_mongolian_n_let_ue",
{
"unicode": "1826",
// Указание комбинации «Правый Альт + U»
"options": { "altLayoutKey": ">! U" }
}
]
Data\binds.json
Файл с данными о добавляемых привязках.
{
// Раздел, хранящий привязки для альтернативных режимов
"Script Specified": {
"Old Mongolian": {
// Обязательный параметр, если добавляется
// одиночный альтернативный режим
"ForceSingle": true,
// Привязки для клавиш без модификаторов
"Flat": {
"A": "old_mongolian_n_let_a",
"E": "old_mongolian_n_let_e",
"I": "old_mongolian_n_let_i",
"O": "old_mongolian_n_let_o",
"U": "old_mongolian_n_let_u"
},
// Привязки для клавиш с модификаторами
"Moded": {
"U": {
"<^>!": "old_mongolian_n_let_ue"
}
}
}
}
}
Data\alternative_modes.json
Файл с данными о добавляемом альтернативном режиме.
[
"Old Mongolian",
{
// Текст, отображаемый в селекторе под заголовком
"preview": ["ᠠᠯᠲᠠᠨ ᠵᠤᠯᠠ ᠭᠦᠵᠡᠭᠡᠯᠵᠡᠭᠡᠨᠡ"],
// Шрифт — может быть любой, если он есть в системе
"fonts": [""],
// Ключ локализации для заголовка
"locale": "old_mongolian",
// Указание названий привязок из “Script Specified” раздела
// До двух, если создаём режим для пары наборов привязок
// (латиница и кириллица)
"bindings": ["Old Mongolian"],
// Уникальный идентификатор для интерфейса селектора
"uiid": "OldMongolian",
// Указание набора иконок — до двух, если создаём
// режим для пары наборов привязок
"icons": [
// Простая строка (например, «gothic») запросит иконку
// из файла DSLKeyPad\Bin\DSLKeyPad_App_Icons.dll
// Для использования собственного файла необходимо
// добавить в начало пути “file::”
// Все параметры в объекте режима могут содержать «спящий»
// вызов функции/метода, заключённый в %%, который будет
// исполнен при регистрации режима
// В данном примере будет получен путь до файла вида
// <диск>:\<путь>\DSLKeyPad\Mods\Old Mongolian Sample Mod\Resources\old_mongolian.ico
"%Format('file::{}\\Resources\\old_mongolian.ico', OldMongolianMod.dir)%"
]
}
]
Data\ui_main_panel_lists.json
Файл с данными для отображения символов в GUI главной панели.
{
// Вкладка «Письменности»
"scripts": {
// Тип отвечает за правила добавления символов во вкладку
// Например, если тип равен «Alternative Layout»,
// а свойство записи ["options"]["altLayoutKey"]
// пусто — запись не будет добавлена во вкладку
"type": "Alternative Layout",
// Группа добавляемых символов (создаётся автоматически
// после регистрации префикса; может быть указана
// вручную добавлением параметра «groups»: []
// в каждую запись символа)
// Пустая строка создаёт разделитель
"group": ["", "Old Mongolian"],
// Указание текста для группы символов
// Может быть указанием ключа локалищации с @,
// ссылкой на переменную через %%
// или простой строкой
// Рекомендуется указать хотя бы пустым
"groupKey": { "Old Mongolian": "@mods.old_mongolian" }
}
}
index.ahk
Тут недоступна подсветка синтаксиса для ahk, так что прописан lua для хоть какой-то подсветки.
Class OldMongolianMod {
static dir := mods["Old Mongolian Sample Mod"]
static __New() {
; Загрузка данных
; о записях символов,
; о привязках,
; о режиме Альтернативного ввода и данных
; для отображения записей символов в GUI главной панели
local charactersData := JSON.LoadFile(this.dir "\Data\characters.json", "UTF-8")
local bindsData := JSON.LoadFile(this.dir "\Data\binds.json", "UTF-8")
local alternativeModeData := JSON.LoadFile(this.dir "\Data\alternative_modes.json", "UTF-8")
local uiMainGuiData := JSON.LoadFile(this.dir "\Data\ui_main_panel_lists.json", "UTF-8")
; Регистрация перфикса письменности «old_mongolian» для корректной генерации локализации
; Регистрация новых символов через событие «по завершении регистрации стандартной библиотеки символов»
; Опущенный второй аргумент — тип инициализации («Внутренняя библиотека» ("Internal", по умочланию)
; либо «Пользовательские рецепты» ("Custom"))
; True на третьем аргументе отключает показ прогресс-бара
Event.OnEvent("Character Library", "Default Ready", () => (
ChrLib.AddScript("old_mongolian"),
ChrReg(charactersData, , True)
))
; Регистрация новых привязок через событие инициализации хранилища привязок
; Регистрация нового режима Альтернативного ввода через событие инициализации хранилища режимов
Event.OnEvent("Binding Storage", "Initialized", () => BindReg(bindsData))
Event.OnEvent("Scripter Storage", "Initialized", () => ScripterStore("Alternative Modes", alternativeModeData))
; Добавление новых записей в GUI главной панели через событие создания экземпляра панели
; Событие возвращает экземпляр класса
Event.OnEvent("UI Instance [Panel]", "Created", SetPanelData)
return
; Функция добавления новых записей в GUI главной панели, вызываемая событием
SetPanelData(ClassInstance) {
; Получение сведений о колонках и добавление новых записей в GUI главной панели
ClassInstance.GetColumnsData(&columnsData)
ClassInstance.MergeListViewData(&uiMainGuiData, &columnsData)
return
}
}
}



Главная панель

Комбинация: LWin + LAlt + Home
(или через контекстное меню иконки в трее).
Содержит списки записей символов, их рецепты и комбинации ввода. Также имеется вкладка «Помощь» с поясняющей информацией.
Окно настроек

Комбинация: RCtrl + F9
(или через контекстное меню иконки в трее).
Здесь можно:
-
Выбрать профиль — в нём хранятся:
Собственно, текущие настройки,
Пользовательские рецепты,
Пользовательские привязки,
Пользовательские раскладки,
Список избранного.
Выбрать язык интерфейса,
Выбрать раскладки для латиницы, кириллицы и опция ремаппинга (переназначения базовых клавиш),
Выбрать пользовательские привязки,
Выбрать ресурс Unicode — используется в Панели для открытия веб-страницу символа или дипапазона Unicode,
Обновить или восстановить текущую версию и отключить/включить автоматическую проверку обновлений,
-
Выбрать дополнительную комбинацию для ввода пары «İı». По умолчанию для их ввода необходимо зажать четыре модификатора, и потом уже нажать на I/i, но так как эти символы используются в турецком и гагаузском — была введена настройка для упрощения их ввода. Можно выбрать следующие варианты:
По умолчанию.
Раздельный (заглавная буква I заменяется на İ, а для ввода Iı нужно зажать
LShift
).Гибридный (для ввода İı нужно зажать
LShift
).
Выбрать тип вводимых LaTeX-команд (команды текстового или математического режимов),
Выбрать вид HTML-кодов (десятичный [? →
🜍
] или шестнадцатеричный [? →🜏
]),Отключить/включить LaTeX-строки автозамены (см. ниже).
Для Международного фонетического алфавита — настройка для выбора символов латиницы вместо греческих (если есть): βχ (греческий) → ꞵꭓ (латиница),
Добавление ярлыка в автозагрузку.
Со временем количество настроек будет пополняться.
Контекстное меню трея

Менее значимые/вспомогательные возможности
Легенда
Интерфейс с «лором» символов. На данный момент не самая значимая фича, т.к. я не обладаю достаточными познаниями для заполнения данных.

Конвертер температуры
Работает через строки автозамены, требуя вводить текст формата \tcalc{<ИЗ><В>}
. После срабатывания активируется ввод значения для конвертации, а нажатием любой клавиши, не являющейся цифрой, запятой, точкой или «'» подтверждается вывод конвертированного значения в поле ввода.
Доступны следующие шкалы: Цельсия (C), Фаренгейта (F), Кельвина (K), Делиля (D), Лейденская (L), Ньютона (N), Уэджвуда (W) (пересмотренная), Ранкина (RA), Реомюра (RE), Рёмера (RO), Дальтона (Da).
При указании дробной части можно выбрать формат вывода (значение дробной части можно опустить — «450,»):
<Целое>.<Дробное> → 999,727.59 ℃
<Целое>,<Дробное> → 999 727,59 ℃
<Целое>.,<Дробное> → 999.727,59 ℃
<Целое>..<Дробное> → 999 727.59 ℃
<Целое>'<Дробное> → 999’727.59 ℃
<Целое>''<Дробное> → 999’727,59 ℃
LaTeX → Символ
Строки автозамены формата $><LaTeX-команда>$
. Если в библиотеке зарегистрирована какая-либо LaTeX-команда, то закреплённый за ней символ можно ввести и таким способом, примеры: $>\AE$
→ Æ, $>\={\AE}$
→ Ǣ, $>\Omega$
→ Ω, $>\textpertenthousand$
→ ‱.
Строка ↔ URL-кодирование
Комбинации: (выделить текст) → RCtrl \
(кодировать), RLCtrls \
(декодировать).
Не своя логика, найдена на AHK-форуме.
Преобразует строку в URL-кодировку и обратно: Что-то
↔ %D0%A7%D1%82%D0%BE-%D1%82%D0%BE
, ???
↔ %F0%90%8C%B2%F0%90%8D%89%F0%90%8C%B8
.
Заключить в кавычки
Комбинация: (выделить текст) →LAlt + 2
Заключает выделенный текст в кавычки и автоматически заменяет внешние кавычки на внутренние, если они есть: Меч Танаквиль → Меч «Танаквиль» → «Меч „Танаквиль“», Sword Tanaquil → Sword “Tanaquil” → “Sword ‘Tanaquil’”.
Кавычки выбираются в зависимости от активного языка раскладки, работает и для греческого (как для раскладки, так и для Альтернативного режима «Эллинское письмо»): Ξίφος Τανακυλλίς → Ξίφος «Τανακυλλίς» → «Ξίφος “Τανακυλλίς”».
«Оттипографить»
Комбинация: (выделить текст) → RAlt + F8
Обрабатывает текст по заданным в DSLKeyPad\Data\grep_rule_sets.json
правилам, включающих:
Удаление двойных пробелов, пробелов в начале и конце строк, перед «правосторонними» знаками препинания и после «левосторонних» ([« слово »] → [«слово»]).
Замена двойных дефисо-минусов на длинное тире.
Замена трёх точек на многоточие.
Замена ["*"] на [«*»] и [""*""] на [«„*“»].
Замена «!/?…|?...|...?» на «!..»/«?..».
Вынос точки за пределы закрывающей кавычки (.» → ».).
Подстановка неразрывного пробела через каждые 3 символа числа (150000000 → 150 000 000).
-
Замена пробела не неразрывный в случаях:
После тире, когда с него начинается предложение (диалог).
До и после тире, если перед пробелом «до» стоит знак препинания (атрибуция).
До тире, если «до» и «после» нет знаков препинания (подлежащее и сказуемое, пр.).
Между числом и символом валюты.
После одиночных букв, союзов, некоторых сокращений и перед «б|бы|ж|же|ли|ль».
В конце абзаца между двумя словами, если посленее из них короче 13-ти символов.
Замена пробела на тонкую шпацию в инициалах.
-
Удаление пробела в случаях:
Между числом и символом процента, промиле и базисным пунктом (% ‰ ‱).
-
Замена дефисо-минуса в случаях:
На минус перед числом.
На короткое тире между чисел (включая римские) (диапазон).
Включая короткое тире — на многоточие в диапазонах, начинающихся с отрицательного числа (−70–100 ℃ → −70…100 ℃).
Есть и слегка расширенний вариант на RAlt F9
, созданный чисто для себя, но:
Замена пробела в начале диалога на полукруглую шпацию
Добавление круглой шпации в начало абзаца для симуляции абзацного отступа.
Примечание: все эти замены работают только при активной русской раскладке. Наборы замен разделяются по языкам, и так как я не знаю об английском типографике вообще ничего — не создавала наборы под неё.
Открыть веб-страницу выделенного символа
Комбинация: (выделить текст) → LWin + LAlt + PgUp
Просто открывает страницу выделенного символа на Unicode-ресурсе, выбранном в настройках.
Установка и репозиторий
Репозиторий проекта на GitHub: DSL-KeyPad
Установка:
Во-первых, необходимо установить сам AuotHotkey 2.*, скачав с соответствующего сайта или через терминал:
winget install AutoHotkey.AutoHotkey
Затем:
Выбрать самую последнюю версию DSL KeyPad из релизов репозитория или скачать с SourceForge.
Распаковать содержимое архива куда угодно — это и будет директорией установки.
Запустить DSLKeyPad.exe или DSLKeyPad.ahk файл.
-
При необходимости в настройках можно установить автозагрузку при старте системы.
*При перемещении папки необходимо будет снова установить автозагрузку, т.к. путь не обновляется автоматически.
Нужен шрифт Noto Serif, но при его отсутствии программа сама предложит установку.
Ограничения и нюансы
Инструмент всё ещё находится в стадии разработки, но уже может быть полноценно использован.
⚠️ Антиничиты в играх могут триггериться от использования автохоткея, так как немало людей создают на автохоткее разного рода макросы. Перед заходом в любую многопользовательскую игру лучше закрывать все процессы автохоткея.
Потребляет ~140–180 МБ ОЗУ (без учёта модов и пользовательских рецептов). По возможности буду пытаться оптимизировать использование памяти.
Автохоткей перехватывает клавиши, т.е. это может приводить к блокировке стандартных привязок приложений. Чтобы избежать этого, можно использовать комбинацию
RAlt + F1
для приостановки «Быстрых ключей» (оставляя ряд функций доступными), либоRCtrl + F10
для приостановки всех привязок, кроме самойRCtrl + F10
.Программа плохо совместима с быстрой печатью. Если вам необходима высокая скорость ввода символов — это не тот инструмент, лучше использовать раскладки для отдельных языков.
-
Программа ограничена работой на английских и русских раскладках. При обнаружении другого языка клавиатуры (например, японский) — все привязки автоматически приостановятся, так как будут мешать этому языку (в примере с японским — невозможность использовать катакану при зажатии
LShift
). При возврате на английский/русский — автоматически восстановятся.Помимо «English (США)» и «Русский (Россия)» программа будет работать и на следующих языковых раскладках: Русский — Беларусь, Молдова, Украина, Казахстан, Кыргызстан; Английский — Канада, Великобритания, Ирландия, Австралия, Сингапур, ОАЭ, Новая Зеландия, Белиз, Филлипины, Ямайка, Карибские острова, Южная Африка, Зимбабве, Тринидад и Тобаго. Привязки для английского языка будут работать и на вьетнамской языковой раскладке, и даже относительно совместимы с родным TELEX’ом:
RAlt + A, S
даётẮ
, как при обычном вводеA, W, S
(но не во всех приложениях).Программа будет работать на греческой раскладке, однако при переключении на неё активируется Альтернативный режим «Эллинское письмо» (если ни один из других режимов не активирован). Базовые привязаки рассчитаны лишь на две языковые раскладки и ввод греческого как третьего не планируется — как минимум это потребует изменения привязок клавиш
Q
,W
,;
для всех трёх языков (на стандартной греческой раскладке эти клавиши дают;
,ς
,΄
, а при режиме —Ϟ
,Ϝ
,;
), что чревато потерей их функциональности (см. 1-й пункт) (W для перемещения в играх, например) и нуждой пользователя отключать привязки полностью черезRCtrl F10
, если эти клавиши нужны. Альтернативный режим, конечно, приводит к тому же, но только для греческой раскладки. И всё же предпочтительнее использовать режим греческого поверх английского. Не все привязки могут работать на той или иной мембранной клавиатуре. Полноценно проверить работоспособность привязок на механической клавиатуре не удалось (по причине её полурабочего состояния), но она помогла понять, что некоторые привязки не работают из-за основной, мембранной, клавиатуры, а не косяка в коде.
Следует быть аккуратнее с комбинациями, включающими
Ctrl
и правыйShift
— такая комбинация иногда может сменить выравнивание поля ввода на справо налево (с левымShift
— на слево направо). Избегать такого поведения мне помогало отжатие сначалаCtrl
, а замем всего остального. Как такое поведение в принципе заблокировать, не заблокировав базовыеL/RCtrl L/RShift
— пока не знаю.Некоторые приложения могут вести себя неожиданно. Например, MS Word при виде того, что активна английская раскладка, но вводятся вьетнамские буквы может взять и внезапно превратить весь текст в греческий. Решила эту проблему отключением уже не помню какого параметра в ворде, связанного с, собственно, греческим.
Не во всех приложениях комбинации будут работать или работать стабильно. Например, в Adobe Illustrator что-то вводит символ, что-то нет, а что-то вводит, но он не появляется, пока не нажмёшь на клавишу стрелки.
Из планов на будущее
Продолжать улучшать программу, её логику и возможно вводить какие-то новые фичи.
Сделать страницу с документацией, включающей и гайд для создания модификаций.
Расширить возможности модификаций.
Расширение «Легенд», но своими силами вряд ли получится — это требует лингвистических познаний, коими я не обладаю в достаточной мере.
Расширение библиотеки символов (пропущенными или по мере их ввода в Юникод). Возможно и расширение режимов альтернативного ввода.
Есть мысли перевести интерфейс на веб-рельсы при помощи соответствующей либы и DLL’ки, но это пока имеет низкий приоритет, пусть и результат будет явно симпотичнее, чем с деревянностью местного GUI.
PS. Благодарю дочитавших. Надеюсь, что мой инструмент кого-то заинтересует и окажется полезным.
Комментарии (6)
AlexGorky
30.07.2025 22:54Автору - респект.
Я для подобного использовал AutoHotKey (на одном рабочем месте, бесплатная) или HotKeyboard (на другом рабочем месте, платная), которые последовательность одних букв заменяли на другие.
Например:
--1 -> адрес домашней почты, --2 -> адрес рабочей почты, ...
ддд -> текущая дата, ддчч -> текущая дата со временем и т.п.
Главное, чтобы мнемонически легко было запомнить.
Kogolbok
30.07.2025 22:54Нашёл когда-то в линуксе третий и пятый уровни клавиатуры. И клавишу Compose. Но жаль, что приходится помнить все эти кульбиты. И все эти раскладки, фактически, ненастраиваемые. Нужно что-то настраиваемое, наглядное, но не назойливое. Ваша программа заинтересовала, но видны нет попробовать, жаль. Проект у Вас интересный, но всё равно, запоминание чачоточных па для пальцев. И я даже не представляю как должно бы вводить дополнительные, особенно сложные, символы без боли и "кассы символов" на экране.
ryzhpolsos
Весьма интересный проект, будет интересно понаблюдать за его развитием.
Это, к сожалению, не фиксится полностью - некоторые альтернативно мыслящие разработчики предпочитают собственные методы получения ввода с клавиатуры, из-за которых AHK оказывается не у дел. Как идея - можно попробовать вместо стандартного AHK'шного Send шаманить напрямую с сообщениями, отправляемыми окнам - в этом случае должно быть побольше возможностей.
Почему бы не использовать какой-нибудь API для того, чтобы гарантированно иметь все символы? Только, умоляю, сделайте кэширование - зависимость от интернета у подобной программы её никак не красит.
В каких приложениях? Ни разу не сталкивался. Фикситься может всё тем же шаманством с сообщениями, но, вероятно, от AHK в таком случае придётся отказаться в пользу, например, C# (зато программа ресурсов жрать поменьше будет)
DemerNkardaz Автор
Я решила пойти по пути, которому вредит подобная автоматизация — генерация данных о символе на основе его «сырой записи». Мне не захотелось брать названия из Юникода (к тому же, там бывают и ошибки, хотя сама я столкнулась с единичными случаями) — сделала свои, а с предлагаемым методом придётся от этого (и не только этого) отказаться и использовать только готовые данные (банально в угоду скорости инициализации). Можно даже сказать, что вся текущая реализация библиотеки символов несовместима с подобным. При вводе нового символа, особенно если это какая-то отдельная письменность, приходится вручную вписывать уже и внутренние данные «как, что, зачем и почему этот символ».
Да, по итогу имеем много ручной работы, но я вполне осознанно пошла именно таким путём, ибо хотела реализовать «собственное видение» даже если трудозатраты на это окажутся неэффективны.
Как некоторый компромисс — возможность ввода кодовых точек через «Композицию», что де-факто даёт все символы Юникода, но не так удобно (кодовую точку ведь ещё надо знать…).
Хотя я могла не совсем верно понять вопрос.
Видимо я совершила косяк… она как раз и должна быть независимой от интернета (за исключением обновлений и чейнджлога). Кучу всего проверяла перепроверяла, а про возможные баги без интернета видимо забыла… Я и правда весьма давно тестировала работает ли программа без сети.
У меня — в ворде, в поисковой строке браузера, иногда в полях ввода на сайтах.
Благодарю за комментарий, пойду глядеть, что там не так с интернет-зависимостью программки.
DemerNkardaz Автор
Кажется про интернет я точно неправильно поняла. По крайней мере у меня без интернета работает (но «у меня работает», конечно, не аргумент). Хотя, я нашла, что следует изменить — я не скрыла сообщение об ошибке во время «фоновой» проверки наличия обновлений, и ещё одну ошибку нашла-починила.