Мой велосипед: как я с помощью ИИ-агентов создал альтернативу Punto Switcher и Caramba Switcher для Mac
Пишешь сообщение, поднимаешь глаза — и вместо «привет» видишь «ghbdtn». Для человека, который постоянно переключается между русским и английским (а это практически все айтишники), это маленькая, но очень регулярная потеря внимания и очень много лишних движений руками) Решение было придумано еще 20 лет назад: легендарный Punto Switcher, которым я активно и пользовался до последнего времени на комьютерах под Windows и Маках. Однако после покупки нового макбука с процессором M4 (ранее был с процессором Intel) я сделал неприятное открытие, что для процессоров Apple Silicone актуальной версии Punto Switcher просто нет! Да, старая версия еще работает с помощью Rosette, но уже в следующей версии MacOS поддержка приложений для Intel будет прекращена. Да, есть более современный (правда платный) аналог Caramba Switcher для Mac, но я подумал и решил ... изобрести велосипед!
Зачем я решил сделать свой велосипед
У Punto Switcher и Caramba Switcher есть понятная ценность: они избавляют от постоянного контроля раскладки. Но вместе с готовым решением принимаешь и решения его авторов — какие функции включать, как настраивать исключения и по какой модели распространять программу.
В случае Punto (помимо устаревшей архитектуры для MacOS) мне хотелось более узкой задачи. В официальной справке, помимо переключения раскладки, описаны встроенный поиск Яндекса и поиск по двойному клику. А в FAQ для Mac прямо указана автоматическая передача анонимной технической информации: типа ОС, версии и идентификатора программы. Для моей утилиты требование было простым: исправлять раскладку локально, без поиска, телеметрии и фоновых сетевых запросов.
У Caramba другая развилка. На момент подготовки статьи официальный сайт предлагает Pro для macOS за 499 рублей в год после трёх пробных дней; также заявлено, что Classic остаётся бесплатной. При этом расширенная настройка программ-исключений и редактируемый список слов-исключений перечислены среди отличий Pro от Classic. Подписка — нормальная модель для поддерживаемого продукта, но для себя я хотел бесплатный инструмент с доступными настройками и возможностью менять его код.
Есть и общая проблема автоматических переключателей: название технологии, аббревиатура или профессиональный сленг могут оказаться неожиданностью для алгоритма. Сама Caramba предупреждает, что не знает всех аббревиатур и не работает абсолютно во всех программах. У разработчика к обычному тексту добавляются команды, имена переменных и смесь двух языков. Поэтому мне было важно самому определять, где автоматика помогает, а где должна остановиться.
Нельзя также не отметить что оба рассматриваемых приложения имеют закрытый исходный код. Безусловно, их разработчики заслуживают полного доверия, но...
Так сложились требования к Twiga Switcher: русский и английский, автоматический и ручной режимы, отмена исправления, настройки для отдельных приложений, свои словари и открытый код, чтобы пользователь мог сам убедиться в отсутствии скрытых функций или передачи набираемого на клавиатуре текста куда-либо. Из этих вполне бытовых пожеланий и вырос мой велосипед.
Из JS и TS — в нативное приложение на Swift
Мой основной опыт профессиональной разработки — JavaScript и TypeScript. Однако здесь приложение, например, на Electron, не подходит. Задача тесно связана с macOS: получать события клавиатуры, определять активное поле, менять источник ввода и аккуратно исправлять уже набранный текст. Я выбрал нативный для MacOS язык Swift, в написании программ на котором не имел никакого опыта, и с помощью ИИ-агентов Codex написал приложение с нуля, используя методологию TDD.
В итоге само приложение написано полностью на Swift, интерфейс использует SwiftUI и AppKit. В репозитории отдельно выделены логика переключения, работа со словарями и интеграция с системой; для них есть тесты. Это удобное разделение: распознать слово и безопасно заменить его в чужом окне — две разные задачи.
Для меня ценность ИИ-агентов здесь — возможность работать за пределами привычного стека. Опыт разработчика помогает сформулировать нужное поведение и заметить странный результат, а агенты помогают воплотить это в коде на другом языке. При этом критерий качества остаётся очень земным: что произойдёт, когда человек быстро печатает, меняет окно, ставит многоточие или отменяет ошибочную замену.
Отдельно отмечу, что ИИ участвовал только в в разработке приложения. Во время работы Twiga Switcher использует локальные словари и правила: набираемый текст не нужно отправлять нейросети или в облако.
Что получилось и как это работает
Twiga Switcher живёт в строке меню macOS. Отдельного главного окна и значка в Dock нет: основные действия доступны через значок клавиатуры.
В автоматическом режиме приложение исправляет слова в обе стороны: «ghbdtn» превращается в «привет», а «руддщ» — в «hello». Уверенно распознанное слово может начать исправляться ещё во время набора: например, «ghbd» превращается в «прив», а окончание вы уже допечатываете по-русски. Если начало неоднозначно, приложение ждёт пробела или другого разделителя. При исправлении учитываются фразы, пробелы и пунктуация.
Если хочется полного контроля (я знаю достаточно людей, которых автопереключение раскладок раздражает), в меню есть режим «Только горячие клавиши». Тогда исправление происходит по вашей команде, без предложений сохранить правило. Выбранный режим запоминается после перезапуска. Отдельным пунктом можно временно поставить переключение на паузу.
Для ручного исправления по умолчанию используется Control + Shift + Space. Оно работает с текущим словом, в том числе сразу после пробела, и переключает язык для продолжения набора. Control + Shift + Z отменяет последнее исправление: сделать это можно в течение 10 секунд, пока вы не продолжили ввод и не переместили курсор. Оба сочетания можно переназначить.
В редакторе помогать, в терминале не вмешиваться
В настройках можно отдельно задать поведение для каждого приложения. Например, оставить исправления в текстовом редакторе и выключить их в Terminal или программе удалённого доступа. На скриншоте именно так и настроены Terminal и Microsoft Remote Desktop; для Pages выбран режим совместимости.
Обычный режим проверяет, что активно редактируемое поле. Режим совместимости помогает с приложениями, которые иначе сообщают сведения о своих элементах интерфейса. Есть и вариант «Без проверки поля», но он допускает обработку даже парольных полей, поэтому начинать стоит с обычного режима. Универсальной совместимости со всеми окнами я не обещаю: результат зависит и от того, что конкретное приложение сообщает macOS.
В одном окне — автозапуск, состояние доступов и настройки для отдельных приложений.
Здесь же можно включить запуск при входе в систему, выбрать русский или английский интерфейс, настроить сочетания клавиш и звук переключения.
Словарь под свою работу
В основе распознавания — русский и английский частотные словари. Их дополняет отключаемый словарь компьютерных терминов: названия инструментов, профессиональные выражения и IT-сленг. В версии 0.2.0 он содержит 766 английских и 545 русских записей, включая привычные в рабочих обсуждениях «заапрувь», «юзаешь» и «дефолтную».
Можно подключить собственный словарь в формате .layoutdict — например, с медицинскими терминами, юридической лексикой или названиями из вашего проекта. В него добавляются правильно написанные слова и выражения, а приложение само определяет их соответствие другой раскладке. Импорт и включение словарей применяются без перезапуска; в README есть инструкция и готовый пример.
Словари можно дополнять под свою профессию и привычную лексику.
«Всегда» и «Никогда» вместо спора с автоматикой
Для отдельной пары слов есть более точный инструмент — правила. В автоматическом режиме после ручного исправления можно выбрать «Всегда» или «Никогда». В первом случае Twiga Switcher будет автоматически исправлять эту пару, во втором — перестанет её менять.
Сохранённые решения видны в отдельном окне: исходное слово, результат и действие. Любое правило можно удалить, а при необходимости — очистить весь список. Сама по себе автоматическая замена не создаёт постоянного правила: решение остаётся за пользователем.
Все сохранённые правила доступны для просмотра и удаления.
Приватность и ограничения
Twiga Switcher обрабатывает текст на Mac, не ведёт историю нажатий клавиш и не отправляет информацию в сеть. Фрагмент для исправления и отмены временно хранится в памяти. На диск сохраняются настройки, импортированные словари и те пары слов, для которых пользователь явно выбрал «Всегда» или «Никогда».
Исходный код открыт под GNU GPLv3. Для утилиты, которая получает доступ к вводу, мне важно дать возможность посмотреть, как она устроена, собрать её самостоятельно и предложить исправления.
У моего велосипеда тоже есть границы: сейчас это переключатель русской и английской раскладок. Он не переводит текст, не заменяет проверку орфографии и не преобразует автоматически то, что вы вставили из буфера обмена. Ошибки распознавания возможны — поэтому предусмотрены отмена, ручной режим и правила.
Где скачать и как попробовать
Twiga Switcher на GitHub — исходный код, описание функций, скриншоты и подробная инструкция.
Скачать Twiga Switcher 0.2.0 для Apple Silicon — DMG. Нужны Mac с M1 или новее и macOS 14+. Готовой сборки для Intel в этом релизе нет. Описание версии и файл контрольной суммы доступны на странице релиза.
Откройте DMG, перенесите приложение в «Программы» и запустите его. Для работы понадобятся разрешения «Универсальный доступ» и «Мониторинг ввода», а также включённые русская и английская раскладки. Сборка пока не подписана Developer ID и не нотарифицирована Apple: особенности первого запуска описаны в README. Готовые сборки я публикую только в официальном репозитории.
Свой переключатель раскладки оказался хорошим поводом выйти за пределы JS и TS и довести приложение на Swift до готовой сборки. С помощью ИИ-агентов такой переход стал для меня возможным, а результатом можно пользоваться и делиться.
Для дальнейшего развития проекта и принятия решения о его полноценном продуктовом релизе, нотарификации в Apple, размещении в App Store и т.д. мне очень важна обратная связь от реальных пользователей: нужно ли вообще такое приложение, решает ли но проблемы пользователей, достаточно ли пользователям его функций и какие функции стоит добавить. Ну и конечно жду предложений по улучшению работы приложения и исправлению багов!
Все предложения и пожелания можно оставить в комментариях к статье или в Issues на GitHub.
Ну и небольшой блиц опрос: А вы предпочитаете автоматическое переключение раскладки клавиатуры или исправление по горячей клавише? Ответы оставляйте в комментариях.