Ghbdtn
Ghbdtn - keyboard layout switcher for Windows (Delphi)
- Active · last change 11-3-2026
- ★ 17 on GitHub
README
Ghbdtn
Автоматическое исправление раскладки клавиатуры для Windows

Ghbdtn – аналог Punto Switcher и Caramba Switcher, написанный на Delphi. Программа работает в фоне, следит за набором текста и исправляет слова, набранные в неверной раскладке (русская / английская): ghbdtn превращается в привет, а руддщ – в hello.
Страница проекта · Скачать · Что нового
Содержание
- Возможности
- Горячие жесты
- Внешний вид
- Настройки
- Ограничения
- Как это работает
- Структура проекта
- Сборка и тесты
- Лицензия
Возможности
Автопереключение
- Слово читается дважды: как набрано и как текст другой раскладки. Правдоподобие чтения оценивается по вероятности сочетаний букв и по спискам частых слов русского и английского; слово переключается, когда другое чтение заметно правдоподобнее. Режимы эвристики: осторожный, сбалансированный, агрессивный.
- Решение принимается при вводе пробела, Enter, Tab, знака препинания, плюса или минуса. Запятая, точка,
;,:,',[,], обратный апостроф и их формы с Shift на английской раскладке – русские буквы (б,ю,ж,Ж,э,х,ъ,ёи заглавные), поэтому слово не обрывается на них: решение принимается позже, когда видно, что это слово, а не знак препинания. Двоеточие на цифровом ряду (Shift+6 в русской раскладке) по-прежнему заканчивает слово. - Необязательный режим «Переключать раскладку, не дожидаясь конца слова» (по умолчанию выключен) переключает слово, не дожидаясь пробела: после заданного числа букв (по умолчанию четыре, в настройках от 3 до 8), если набранное начало не является началом ни одного слова из списка своего языка, а в другой раскладке начинает слово из списка и читается заметно правдоподобнее. Набранное заменяется и раскладка меняется, остаток слова набирается уже в нужной раскладке. Двойной Left Shift до конца слова возвращает набранное и отключает режим для этого слова. Начало, в котором есть цифры, знаки или буквы на клавишах
;:',.[], и слово из списка запрета режим не трогает; такое слово исправляется на пробеле, как обычно. - Короткое слово перед исправляемым словом переводится вместе с ним:
D yfxfktстановитсяВ начале. Это относится к однобуквенным и двухбуквенным русским служебным словам, которые сами по себе в начале фразы не исправляются. - Исправляется только неверная часть слова:
dev-c,jhrfстановитсяdev-сборка. Подчёркивание и знак равенства входят в слово. - Две заглавные в начале слова (
ТОлько,HEllo) исправляются на одну (Только,Hello); аббревиатуры и имена вродеTFormостаются. Отмена жестом или Ctrl+Z запоминает слово как исключение; функция отключается в настройках. - Слово, набранное с включённым Caps Lock (
пРИВЕТ), становитсяПривет, а Caps Lock выключается; слова целиком в верхнем регистре остаются. Отключается в настройках. - Пробел перед
,.!?убирается, когда следующее слово заканчивается пробелом или Enter (слово , потомстановитсяслово, потом), а второй подряд пробел после текста не вводится. Двоеточие и точка с запятой не трогаются, чтобы не ломать смайлики,...и.env. Правку отменяют двойной Left Shift или Ctrl+Z. Отключается в настройках. - Те же правила закрывают
,,(становится,), пробел внутри скобки (( словоислово )) и пропущенный пробел после запятой между русскими словами (да,нетстановитсяда, нет). - Опечатки в буквах: слово из пяти и более букв, которого нет в словаре, исправляется перестановкой соседних букв или удалением двойной, если вариант единственный и есть в словаре (
првиет–привет). Включено по умолчанию. - В разделе «Спорные исправления» (по умолчанию выключены): заглавная буква после
.!?(кроме сокращений вродесм.),-между словами – в тире–,"текст"– в «ёлочки», повтор слова подряд удаляется (кромеочень очень,что чтои подобных). Каждую правку отменяет двойной Left Shift или Ctrl+Z, отменённое слово запоминается. - Когда фокус входит в поле пароля или e-mail при русской раскладке, раскладка переключается на английскую (определяется через автоматизацию интерфейса; отключается в настройках).
- Одна буква перед двоеточием не переключается (
C:). Знаки вокруг английского слова (hello,,'quoted',[x]) не мешают ему остаться английским, а буквы русского слова на тех же клавишах (,sk– «был»,cdj.– «свою») переводятся вместе с ним. Набор из одиночных букв через точки, запятые и угловые скобки (x.y.z,a,b,c,e<f) за слово не принимается. - Учитывается контекст: если среди пяти последних слов окна два или больше принадлежат одной раскладке, спорное слово склоняется в ту же сторону; явное преимущество другой раскладки сильнее контекста.
- Исправление стирает старое слово и вставляет новое одним пакетом клавиш.
Ручная конвертация
- Выделение, набранное слово или слово у каретки переводится в другую раскладку двойным нажатием Left Shift. Слово у каретки включает буквы, набранные знаками (
,sk– «был»,nfr;t– «также»), и не захватывает знак после английского слова (hello,). - Одно слово переводится всегда. В длинном тексте каждое слово оценивается отдельно: слова на своей раскладке остаются, остальные, в том числе те, от которых автоисправление отказалось, переводятся.
- Автоисправление и ручную конвертацию можно отменить тем же жестом.
Обучение
- Программа запоминает, как обошлись со словом, отдельно для каждого приложения. Запись для всех приложений действует там, где нет своей.
- Явная отмена автоисправления (Ctrl+Z или повторный двойной Left Shift) и стирание исправленного слова целиком сразу запрещают переключать его снова. Неполное стирание длинного слова учитывается слабее. Случайный отказ постепенно забывается, если исправление оставлено и набор продолжается.
- Слово, переключённое вручную, в следующий раз переключается сразу.
- Запоминается основа слова, поэтому соседние формы (
машина,машины) обучаются вместе. - В окне настроек, в разделе «Дополнительно», записи можно добавить вручную, удалить по одной или сбросить все.
Защита
- В полях ввода пароля программа ничего не делает: ни в обычном поле Windows, ни там, где признак пароля виден только через автоматизацию интерфейса (браузер, Electron).
- Не трогаются слова с цифрами, адреса, пути, слова со смешением алфавитов и короткие аббревиатуры в верхнем регистре.
Правила для приложений
- В полноэкранных приложениях программа не вмешивается; менеджеры паролей всегда исключены.
- Список исключений (по умолчанию
cmd.exe,powershell.exe,wt.exe,putty.exe; поддерживаются маски*и?). - Отдельные настройки автопереключения, звуков и режима эвристики для каждого приложения.
- В меню трея, в пункте «Текущее приложение», программу можно временно отключить для приложения, выключить для него автопереключение или добавить его в исключения.
- Клавиша Pause и пункт «Пауза» приостанавливают автоматические исправления (переключение раскладки, регистр) до повторного нажатия; жесты и команды вручную продолжают работать. Пункт «Пауза на время» делает паузу на 30 минут, на 1 час или до перезапуска; остаток времени виден в меню и в подсказке значка. На паузе в правом нижнем углу значка в трее горит красная точка.
Индикация и звук
- Значок в трее с текущим языком (русская раскладка – оранжевый значок, английская – синий) и подсказка у каретки или курсора мыши при смене раскладки в тех же цветах. При заметном решении подсказка показывает причину: «обучение», «словарь» или «не трогать».
- Два коротких сигнала при смене раскладки (выше при переходе на русский, ниже при переходе на английский) и клик при наборе на русской раскладке.
Прочее
- Автозапуск вместе с Windows (по желанию).
- После исправления раскладка переключается запросом и окну переднего плана, и верхнему окну элемента с фокусом.
- Журнал
diagnostics.logс уровнями «выкл.», «ошибки», «информация», «подробно» и ротацией файлов. В Release-сборке подробный уровень ограничен ошибками.
Горячие жесты
| Жест | Действие |
|---|---|
| Двойной Left Shift при наборе слова | Перенабирает слово в другой раскладке |
| Двойной Left Shift сразу после автоисправления | Отменяет исправление; повторный жест возвращает его |
| Двойной Left Shift при выделении | Конвертирует выделенный текст: одно слово переводится всегда, в длинном тексте каждое слово переводится, если набранное не читается заметно лучше другого варианта, поэтому слова на своей раскладке остаются |
| Двойной Left Shift без выделения и набора | Конвертирует слово у каретки |
| Двойной Left Shift сразу после конвертации выделения или слова у каретки | Возвращает прежний текст (до 4096 символов, в том числе многострочный; если текст перед кареткой изменился, возврат не выполняется); следующий жест снова конвертирует, любое нажатие клавиши отменяет возврат |
| Двойной Left Ctrl | Конвертирует выделение; без выделения – всё, набранное с последнего перемещения каретки; если и этого нет – слово у каретки. Результат возвращается двойным Left Shift |
| Одинарный Right Ctrl | Переключает раскладку между русской и английской; по умолчанию выключено, включается в настройках |
| Двойной Right Shift | Меняет регистр выделения, слова у каретки или набираемого слова; повторный жест возвращает прежний регистр, раскладка не меняется |
| Pause | Приостанавливает и возобновляет слежение |
| Меню трея, «Выделение или слово», транслит | «В транслит» и «Из транслита» для выделения или слова у каретки; регистр и переносы строк сохраняются, возврат двойным Left Shift |
| Меню трея, «Выделение или слово», регистр | Верхний, нижний регистр, первая заглавная, инверсия для выделения или слова у каретки |
Выделение можно сделать Shift+стрелками, Home, End, протягиванием мыши, двойным щелчком или Shift+щелчком. Оно копируется через буфер обмена и вставляется обратно, прежнее содержимое буфера восстанавливается сразу после вставки. Выделение длиннее 4096 символов не конвертируется, а причина отказа показывается у каретки. Раскладку после конвертации можно переключать автоматически (настройка «Менять раскладку после конвертации выделения»).
Внешний вид
Значок в трее для светлой и тёмной темы:

Подсказка у каретки при смене раскладки:

Причина решения в подсказке:

Настройки
Окно настроек
Пункт Настройки... меню трея открывает окно с переключателями. На первом экране: автопереключение и его уверенность, автозапуск, раннее переключение и английская раскладка в полях пароля, исправление заглавных, Caps Lock, лишних пробелов и опечаток, спорные исправления, жесты, звук и подсказка у каретки. Внизу слева показана версия программы. Редкие параметры скрыты под пунктом Дополнительно: звук ввода в русской раскладке, смена раскладки после конвертации выделения, полноэкранные приложения, вид подсказки, списки обучения, исключения и правила приложений, журнал диагностики и config.json. Кнопки ОК и Применить сохраняют изменения, Отмена закрывает окно без сохранения. Сочетания клавиш в окне не настраиваются.

Меню трея
Клик правой кнопкой по значку открывает короткое меню: автопереключение, пауза (в том числе на время), команды регистра и транслита для выделения или слова, действия для текущего приложения, настройки и выход.
Файл config.json
Параметры хранятся в config.json рядом с Ghbdtn.exe и сохраняются атомарно с резервной копией config.json.bak. Повреждённый файл переименовывается в config.corrupt-<дата>.json, настройки восстанавливаются из копии или сбрасываются по умолчанию.
{
"SchemaVersion": 4,
"SoundOnRussianInput": true,
"SoundOnSwitch": true,
"DoubleLeftShiftEnabled": true,
"SwitchLayoutAfterSelection": false,
"AutoSwitchEnabled": true,
"AutoStart": false,
"HeuristicMode": "balanced",
"DiagnosticsLevel": "off",
"CaretHintOffsetX": 14,
"CaretHintOffsetY": 18,
"CaretHintMode": "timed",
"CaretHintFlash": true,
"CaretHintAnimate": true,
"Exclusions": ["cmd.exe", "powershell.exe", "wt.exe", "putty.exe"],
"ApplicationRules": {
"notepad.exe": { "AutoSwitchEnabled": false, "HeuristicMode": "cautious" }
},
"NeverSwitchLearning": {},
"PreferSwitchLearning": {}
}| Параметр | Значения и смысл |
|---|---|
HeuristicMode |
cautious, balanced, aggressive |
CaretHintMode |
timed (на время), follow (следует за кареткой), off |
DiagnosticsLevel |
off, error, info, verbose |
ApplicationRules |
Ключ – имя exe или маска. В правиле можно задать AutoSwitchEnabled, SoundOnRussianInput, SoundOnSwitch, HeuristicMode; необъявленные поля берутся из общих настроек |
NeverSwitchLearning |
Сколько раз слово просили не переключать во всех приложениях |
PreferSwitchLearning |
Сколько раз слово переключили вручную, тоже для всех приложений |
ApplicationLearning |
Такие же счётчики отдельно для каждого exe; ключ * действует во всех приложениях, у которых нет своей записи |
Общие записи NeverSwitchLearning и PreferSwitchLearning в приложениях сами не действуют. Порог, после которого решение меняется, равен 3. Старый список NeverSwitchWords читается как уже набранный порог.
Ограничения
- При очень быстром наборе (около девяти клавиш в секунду и быстрее) примерно в одном случае из ста рядом с заменой слова может потеряться или сдвинуться буква, пробел или скобка. Проверено в Блокноте, Edge и VS Code.
- Короткое слово (до трёх клавиш) после английского слова может не переключиться: контекст фразы перевешивает, если слово начинается со знака вроде
,(hello ,skвместоhello был). - Одно- и двухбуквенное русское служебное слово в начале фразы (
yt,d) само не переключается, а после русских слов переключается. - Если слово переключено на русский до пробела, клавиша знака в его конце набирается как русская буква. Программа заменяет её знаком (
бна,,юна.,жна;,Жна:,ъна],эна',Эна",ёна`, а заглавныеБЮХЪЁна<>{}~), только если слово без неё читается лучше. Строчнаяхи?так не разбираются:хв конце слова остаётся буквой, а?даёт,. - Поля паролей и приложения из списка исключений не обрабатываются.
Как это работает
Хук клавиатуры копит набираемое слово в буфере и не задерживает нажатия. На границе слова анализатор оценивает его, а замену выполняет отдельный рабочий поток:

Замена отправляется через SendInput: сначала одним пакетом события Backspace, затем текст в Unicode по одному символу с короткими паузами, чтобы приложение успело прочитать каждый. Хук клавиатуры при этом остаётся включённым: клавиши, нажатые во время замены, встают в очередь и воспроизводятся после неё по порядку. После переключения раскладки программа ждёт, пока окно её применит.

Структура проекта
Ghbdtn.dpr, Ghbdtn.dproj проект RAD Studio (Win64)
build.bat сборка через MSBuild (Debug / Release)
build-release.ps1 сборка Release: версия из тега vX.Y.Z, проверка обновлений
src\ исходники
tests\ модульные тесты (DUnitX)
docs\images\ иллюстрации для README
bin\ результат сборки, в репозиторий не попадаетМодули в src\:
| Модуль | Назначение |
|---|---|
Ghbdtn.App |
Скрытая главная форма, меню трея, таймер слежения за раскладкой |
Ghbdtn.Hook |
Низкоуровневые хуки клавиатуры и мыши, жесты Shift, правила приложений |
Ghbdtn.KeyState |
Чистая логика состояния Left Shift и вспомогательные проверки |
Ghbdtn.Buffer |
Буфер набираемого слова |
Ghbdtn.Layout |
Раскладки WinAPI, таблицы соответствия RU/EN, конвертация символов |
Ghbdtn.LetterModel |
Таблицы сочетаний букв русского и английского, стоимость слова |
Ghbdtn.WordFreq |
Списки частых слов обоих языков со стоимостью |
Ghbdtn.Reading |
Чтение слова как текста одного языка: стоимость, знаки на краях |
Ghbdtn.Heuristics |
Короткие русские служебные слова, расширения файлов, гласные |
Ghbdtn.Phrase |
Язык нескольких последних слов и перекос оценки |
Ghbdtn.Analyzer |
Решение о переключении, защищённые слова, анализ выделения |
Ghbdtn.Learning |
Учёт отказов, подтверждений и ручных переключений |
Ghbdtn.InputQueue, Ghbdtn.InputWorker |
Очередь и рабочий поток замены текста, в том числе через буфер обмена |
Ghbdtn.Fixer |
Отправка помеченного ввода через SendInput |
Ghbdtn.Password |
Определение полей ввода пароля |
Ghbdtn.Settings, Ghbdtn.SettingsForm |
Параметры, config.json, окно настроек |
Ghbdtn.TrayIcon, Ghbdtn.CaretHint, Ghbdtn.Sound |
Значок в трее, подсказка у каретки, звуки |
Ghbdtn.AutoStart, Ghbdtn.SingleInstance, Ghbdtn.Diagnostics |
Автозапуск, единственный экземпляр, журнал |
Сборка и тесты
Требуется RAD Studio 13 Florence (путь к rsvars.bat задан в build.bat). Платформа – только Win64.
.\build.bat :: Debug
.\build.bat Release Win64 :: Release
.\build-release.ps1 vX.Y.Z :: Release с версией из тега и проверкой обновлений
.\tests\build-tests.bat :: сборка и запуск тестовГотовый файл – bin\Ghbdtn.exe.
Лицензия
Mozilla Public License 2.0, см. файл LICENSE.

