Обновить

Свой переключатель раскладки на Delphi, от низкоуровневого хука до скоринга n‑грамм

Время на прочтение19 мин
Охват и читатели13K
Всего голосов 21: ↑21 и ↓0+23
Комментарии12

Комментарии 12

Ничегосе, Punto на Delphi... Только что Motorola Razr+ купил из-за ностальгии и это возьму:)

А как тебе ретро мультиэмулятор на Делфи?

Скрытый текст

Пробовал все, ничего не устроило полностью, оставался на punto.
Собрал Вашу. Тестирую. Для меня сразу не хватает авто замены (много настроено на авто подстановку по сокращениям). Замена транслита, неправильный размер букв, надо по сочетанию клавиш + в настройках отключать. Клавиши не назначаются. Настройки не очевидны, местами не понятны.
Потенциал программы 5++ если доработать.

Все замечания скорее всего справедливы. Разрабатывал для себя - я то понимаю, то все означает...
Можно по конкретнее сформулировать в issue.

забил хотелки в codex вот что выдал

  • Переработать окно настроек.

    • Сделать боковое меню с разделами: общие настройки, переключение, горячие клавиши, автозамены, транслит, регистр, приложения, внешний вид и диагностика.

    • Выделять выбранный раздел и добавить понятные пояснения к настройкам.

    • Хранить форму в DFM, отделить логику настройки от элементов интерфейса.

  • Предусмотреть два режима исправления раскладки.

    • Переводить слово целиком после пробела, Enter или знака препинания.

    • Исправлять раскладку по мере набора при уверенном распознавании.

    • Дать пользователю явный выбор режима в разделе «Переключение».

  • Сделать распознавание незавершённых слов осторожнее.

    • Учитывать словарь, вероятную раскладку и начало слова.

    • Сохранять корректные английские слова и идентификаторы.

    • Не переводить одно слово повторно после автоматического исправления.

  • Исправить преобразование многострочного выделения.

    • Сохранять переносы строк, пустые строки и пунктуацию.

    • Поддерживать преобразование выделения и слова у курсора.

    • Сообщать пользователю о превышении допустимого размера выделения.

  • Добавить преобразование транслита.

    • Предусмотреть команды «В транслит» и «Из транслита».

    • Обрабатывать сочетания zh, ch, sh, shch, yu, ya и другие.

    • Сохранять регистр и структуру многострочного текста.

    • Разделить ручное преобразование и автоматическое исправление.

  • Расширить работу с регистром.

    • Добавить верхний, нижний и обратный регистр, а также заглавную первую букву.

    • Предусмотреть исправление случайного Caps Lock и двух заглавных букв в начале слова.

    • Сохранять короткие аббревиатуры.

    • Дать возможность отключать автоматическое исправление отдельно от ручных команд.

  • Добавить пользовательские автозамены.

    • Для каждого правила задавать исходный текст, замену, чувствительность к регистру и ограничения по приложениям.

    • Поддерживать многострочный текст замены.

    • Позволять выбирать срабатывание по пробелу, Enter и Tab.

    • Добавить включение, редактирование, удаление, импорт и экспорт правил.

  • Переработать назначение горячих клавиш.

    • Захватывать сочетание непосредственно при нажатии.

    • Различать левый и правый Shift, поддерживать двойное нажатие.

    • Проверять конфликты между командами и зарезервированные сочетания.

    • Предусмотреть отдельное отключение каждого назначения.

  • Предусмотреть горячие клавиши для основных действий.

    • Переключение раскладки текста.

    • Преобразование транслита и регистра.

    • Отмена последнего преобразования.

    • Включение автопереключения, пауза и смена раскладки клавиатуры.

  • Добавить контекстную обработку точки и буквы «ю».

    • Анализировать положение символа в конце предложения и внутри имени класса или метода.

    • Рассматривать исправление вида TFormюCreate → TForm.Create.

    • Сохранять настоящую букву «ю» в русских словах.

    • Сделать такую коррекцию отключаемой.

  • Предусмотреть профиль для редакторов кода.

    • Задать список IDE и редакторов.

    • Ограничить автоматическое исправление слов и идентификаторов.

    • Сохранить доступность ручных команд преобразования.

    • Отдельно учитывать пунктуацию в квалифицированных именах.

  • Расширить настройки отдельных приложений.

    • Поддерживать исключения и маски имён процессов.

    • Позволять задавать режим распознавания и автопереключения для приложения.

    • Ограничивать автозамены выбранными приложениями.

  • Защитить ввод при смене контекста.

    • Проверять активное окно и конкретное поле ввода перед заменой.

    • Сбрасывать контекст при перемещении курсора, клике мышью и навигации.

    • Отбрасывать устаревшие задания после смены контекста.

    • Сохранять порядок набранных символов и отложенных исправлений.

  • Улучшить получение текста у курсора.

    • Для стандартных Edit и Memo сначала использовать сообщения Windows с ограниченным временем ожидания.

    • Для других редакторов использовать UI Automation.

    • Предусмотреть обработку недоступного или медленно отвечающего редактора.

  • Обеспечить сохранность буфера обмена.

    • Сохранять поддерживаемые форматы перед копированием и вставкой.

    • Восстанавливать буфер только пока программа владеет его текущим содержимым.

    • Учитывать задержку обработки вставки целевым приложением.

    • При неподдерживаемом содержимом прекращать преобразование без потери данных.

  • Сделать отмену преобразования надёжной.

    • Запоминать исходный и преобразованный текст.

    • Поддерживать отмену многострочных замен.

    • Перед отменой проверять наличие ожидаемого текста у курсора.

  • Учитывать особенности клавиатуры и защищённых полей.

    • Применять Caps Lock к буквам, сохраняя правильную обработку пунктуации.

    • Корректно обрабатывать модификаторы и отпускание перехваченных клавиш.

    • Исключать преобразования в полях паролей.

  • Сделать редактирование настроек транзакционным.

    • Работать с черновиком до нажатия «Применить» или «ОК».

    • По «Отмена» сохранять прежние значения.

    • Проверять настройки перед сохранением и восстанавливать прежние значения при ошибке.

    • Предусмотреть сброс настроек выбранного раздела.

  • Обеспечить совместимость конфигурации.

    • Добавить новые параметры в версионируемую схему JSON.

    • Сохранять пользовательские настройки при переходе со старой версии.

    • Переносить прежние назначения клавиш с учётом их отключённого состояния.

  • Улучшить запуск и диагностику.

    • Предусмотреть запуск сразу с окном настроек через --settings.

    • Добавить понятные сообщения об отказе преобразования.

    • Обеспечить доступ к журналу диагностики из настроек.

  • Предусмотреть автоматические проверки.

    • Проверять раскладку, транслит, регистр, автозамены, горячие клавиши и миграцию настроек.

    • Проверять осторожное распознавание незавершённых слов и обработку пунктуации.

    • Проверять порядок исправлений и сохранение пользовательских настроек при отмене.

    • Добавить интеграционный тест многострочного преобразования, отмены и сохранения буфера обмена.

    • Проверять загрузку DFM и отображение разделов настроек.

Для автозамены по шаблонам проще держать специализированный инструмент вроде AutoHotkey или Espanso

Все неплохо, но вот Vcl.Forms это лишнее.

Первые версии были на чистом WinApi. Потом я подумал - "Ну кого я обманываю..."

долго пользовался Punto Switcher. после перехода на линукс, не нашел замену. агент поставил чтото, но очень глючное. мне нужно только ручное переключение последнего слова. а эта штука сьедает первые 1-2 символа через какое то время после запуска, пока не перезапустишь.
автопереключение никогда не использовал. еще удобно было выделить текст и горячей клавишей сменить раскладку. вот этих двух функций только и не зватает под линуксом

SimpleSwitcher. Я под виндой, но у него и линукс вариант есть.
Без автоматики

Каждый программист однажды доходит до точки, когда чужой переключатель раскладки ломает ввод пароля, и садится писать свой велосипед на три года))

Зато теперь у автора есть собственный переключатель с блэкджеком и биграммами

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации