Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works
Anything · Lazarus or Delphi
Random projectRandom project

Ghbdtn

Ghbdtn - keyboard layout switcher for Windows (Delphi)

View on GitHub

Member rating

No ratings yet.

Sign in to rate this project.

README

Ghbdtn

Автоматическое исправление раскладки клавиатуры для Windows

Ghbdtn

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, настройки восстанавливаются из копии или сбрасываются по умолчанию.

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 по одному символу с короткими паузами, чтобы приложение успело прочитать каждый. Хук клавиатуры при этом остаётся включённым: клавиши, нажатые во время замены, встают в очередь и воспроизводятся после неё по порядку. После переключения раскладки программа ждёт, пока окно её применит.

Пакет SendInput


Структура проекта

text
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.

bat
.\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.