Автоисправление слов, набранных не в той раскладке (Ru ⇄ En) — открытый аналог Punto Switcher / Caramba Switcher. Два приложения в одном репозитории:
| Папка | Платформа | Стек | Сборка |
|---|---|---|---|
win/ |
Windows 10/11 | C# (.NET Framework 4.x, WinForms) | cd win && build.cmd |
macos/ |
macOS 13+ (Apple Silicon и Intel) | Swift 5.9, AppKit + CGEventTap + TIS | cd macos && ./build.sh [arm64|x86_64|universal] |
Логика детектора общая и зафиксирована в
docs/SPEC.md (v3): частоты/биграммы, ворота конвертации,
одиночные буквы по «словности», хвост-двойник, самообучение, откат.
Mac-порт синхронизирован со спекой и проходит общий selftest детектора.
Готовые сборки — в Releases по тегам:
OpenSwitcher-win.zip— Windows (anycpu, .NET Framework 4.x предустановлен);OpenSwitcher-macOS-AppleSilicon-M1-M6.app.zip— Mac на чипах M1…M-серии;OpenSwitcher-macOS-Intel-old-Macs.app.zip— старые Mac на Intel.
Не знаешь, какой у тебя процессор: меню → «Об этом Mac» — строка «Чип» (Apple Silicon) или «Процессор» (Intel).
- Windows:
OpenSwitcher.exe— иконка в трее. Настройки — левый клик. - macOS: нужны оба разрешения — «Мониторинг ввода» (чтение клавиш)
и «Универсальный доступ» (внесение исправлений); без второго приложение
читает клавиши, но не исправляет текст. В меню иконки есть
«Проверить разрешения». Подробнее в
macos/README.md.
Сборки подписываются сертификатом Developer ID Application и отправляются в Apple на нотаризацию (Gatekeeper). Локально:
cd macos
./build.sh arm64
codesign --force --deep --options runtime --timestamp \
--sign "Developer ID Application: <Имя> (TEAMID)" build/OpenSwitcher.app
cd build && ditto -c -k --keepParent OpenSwitcher.app OpenSwitcher.app.zip && cd ..
APPLE_ID=... APPLE_APP_SPECIFIC_PASSWORD=... TEAM_ID=... ./notarize.sh build/OpenSwitcher.appАвтоматически — в CI по тегу (секреты SIGN_IDENTITY, DEVELOPER_ID_P12,
P12_PASSWORD, APPLE_ID, APPLE_APP_SPECIFIC_PASSWORD, TEAM_ID).
Без нотаризации Gatekeeper попросит ПКМ → «Открыть» при первом запуске.
docs/SPEC.md поведенческая спецификация (норматив для обеих платформ)
win/ Windows-приложение (C#): src, tools, build.cmd
macos/ macOS-приложение (Swift): Package.swift, Sources, build.sh
- Автоисправление по концу слова — «ghbdtn,» + пробел → «привет,». Цель конвертации обязана быть словарным (или морфологически валидным) словом — правильный текст никогда не портится.
- Одиночные буквы-предлоги — «f» + пробел → «а» (по словности: «f» — не английское слово, «а» — русское; предлоги а/и/в/к/о/с/у/я и "a"/"i" неприкосновенны).
- Слова с б/ю/ж/э/х/ъ/ё — не рвутся при наборе в чужой раскладке; «ghbdtn,» хвост трактуется знаком («етб» — невозможность, как у Caramba).
- Break — откат последней замены (15 с, то же окно/поле ввода); Break при нечего-отменять — принудительный переворот последнего слова (повторный Break возвращает как было).
- Ctrl+Space — точное исправление последнего слова (каретка после слова, или слово слева от каретки).
- Shift+Break — перевод выделенного текста (буфер обмена восстанавливается; смешанное выделение — отказ).
- Тапы Shift — левый → русский, правый → английский; буквы, набранные в просвете применения раскладки, доставляются уже в новой.
- Как в Caramba — Option-тап — короткий голый тап Option принудительно переворачивает набранное/последнее слово «пинг-понгом» (без rejected-блокировок и самообучения); нет свежего слова — выделит слово слева и переключит его.
- Вставить без форматирования —
Cmd+Shift+V(как в Caramba): заменяет буфер обмена чистым текстом и вставляет; хоткей переназначается в настройках. - Оба Shift — зажать левый + правый Shift: вкл/выкл автопереключения (как в Caramba; по умолчанию выключено).
- Самообучение: заменённое слово, не отменённое за 15 с, запоминается
и конвертируется всегда; отменённое — никогда больше (файлы
accepted.txt/learned.txt, ≤1000 записей). - Исключения по процессам, пауза, плашка «было → стало» у каретки, тема (системная/светлая/тёмная), ручные хоткеи — всё в настройках.
- Настройки → «Режим разработчика» — включает журнал решений в файл
(
%APPDATA%\OpenSwitcher\log.txt, ротация 2 МБ). По умолчанию выключен: без него не записывается ни одно нажатие. - F8 — метка в журнале: снимок состояния (процесс, раскладка, буфер, откат, последняя конвертация) на момент глюка.
OpenSwitcher.exe --selftest файл— автотесты детектора (18 кейсов);--simtest слово— прогон строки через реальные раскладки.
cd win
build.cmdСоберёт win/OpenSwitcher.exe (в корень репозитория ставить не нужно) и
прогонит selftest детектора. Нужен только .NET Framework 4.x — ничего
устанавливать не надо. Подпись exe — win/tools/sign.ps1 (локальный
сертификат).
settings.ini,log.txt,accepted.txt,learned.txt—%APPDATA%\OpenSwitcher\.- Лок после ручного выбора языка по умолчанию включён (macOS; классика Punto/Caramba: ручной тап глушит автодетект до смены окна или паузы 3 с; в Windows-версии пока выключен); исключения — точные имена процессов («notepad.exe»), через запятую.
GPL-3.0 — anyone who builds on this code must release their version under the same license. Закрытые форки и платные сборки на основе этого кода запрещены. Коммерческое лицензирование вне GPL — по согласованию с автором (@nick8cyber).