Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

⌨️ LayoutFix

Punto Switcher для macOS — нативный и опенсорсный

Набрал ghbdtn, а хотел привет? Нажми хоткей — и текст исправится на месте. Без переключения раскладки, без порчи чужих полей, без интернета и телеметрии.

License: MIT Platform Swift Status


Что это

LayoutFix живёт в менюбаре и по горячей клавише исправляет текст, набранный не в той раскладке. Знакомая боль: печатаешь на автомате, поднимаешь глаза — а там ghbdtn nfr вместо привет как. На Windows это десятилетиями решал Punto Switcher. На macOS достойного бесплатного и открытого аналога не было — LayoutFix закрывает эту дыру.

  • 🔤 Сам понимает направление (RU↔EN) — не нужно вручную выбирать, куда конвертировать. Решает частотный детектор на словарях и биграммах.
  • ⌨️ Глобальный хоткей — по умолчанию ⌘⌥⇧Space (плюс опционально двойной ⇧ Shift).
  • 🎯 Работает почти везде — Notes, Mail, Safari, Chrome, поля ввода, веб-формы. Несколько стратегий захвата текста с приоритетом.
  • ↩️ Undo — повторное нажатие хоткея в течение ~3 секунд откатывает замену.
  • 🛡️ Не ломает то, что не надо — email, ссылки, пути, команды терминала и приложения-исключения не трогаются.
  • 🔒 Приватность по умолчанию — ноль сети, ноль телеметрии, логирование выключено. Всё локально.

Установка

⚠️ Пока приложение не подписано Apple Developer ID, поэтому при первом запуске macOS покажет предупреждение Gatekeeper. Это нормально для раннего опенсорса — код открыт, проверить можно. Нотаризованная сборка «скачал и запустил» появится, как только соберём 99ドル на Apple Developer ID (см. Поддержать проект).

Вариант 1. Скачать сборку

  1. Скачай LayoutFix.dmg из раздела Releases.
  2. Перетащи LayoutFix.app в Applications.
  3. Обойди предупреждение Gatekeeper (приложение пока не нотаризовано):
    • macOS 13–14: правый клик по приложению → «Открыть» → в диалоге ещё раз «Открыть».
    • macOS 15 (Sequoia) и новее: обычный запуск покажет блокировку без кнопки «Открыть всё равно» — зайди в Системные настройки → Конфиденциальность и безопасность, промотай вниз, там появится сообщение про LayoutFix и кнопка «Открыть всё равно».
  4. Выдай доступ в Системные настройки → Приватность и безопасность → Универсальный доступ — без него приложение не сможет читать и заменять текст.

Вариант 2. Собрать из исходников

Проект открыт целиком — можно собрать самому (см. раздел для разработчиков).


❤️ Поддержать проект

LayoutFix — бесплатный и открытый, я развиваю его в свободное время. Поддержка идёт напрямую в развитие: Apple Developer ID (99ドル/год) для нотаризованных сборок в один клик, новые языки раскладок, улучшение детектора.

Реквизиты (крипта USDT/BTC/TON и карты РФ) — в SUPPORT.md .

💡 Отдельная цель: 99ドル на Developer ID → нотаризованный .dmg, который открывается двойным кликом без предупреждений.


Как это работает

Ядро (LayoutFixCore) — чистая логика без AppKit, полностью покрытая тестами:

  1. Whitelist отсекает то, что трогать нельзя (email, URL, пути, команды).
  2. Детектор пробует сконвертировать текст во всех активных парах раскладок и оценивает результат по частотным словарям — конвертирует, только если уверен.
  3. Системный слой захватывает текст (Accessibility API → буфер обмена → последнее набранное слово) и аккуратно заменяет его на месте.

Подробнее — docs/architecture.md.


Дорожная карта

  • Нотаризованный .dmg (после сбора на Developer ID)
  • Новые пары раскладок: украинский, французский, немецкий
  • Popup с вариантами конвертации вместо «угадал / бипнул»
  • Генерация таблиц раскладок из системы (UCKeyTranslate) вместо ручных
  • Отдельные репозитории под Windows и Linux

Идеи и баги — в Issues. Как добавить язык — docs/adding-a-language.md, общий гайд — CONTRIBUTING.md.


🛠 Для разработчиков

Сборка, тесты и стабильный dev-сертификат

Структура

Sources/
 LayoutFixCore/ чистая логика (без AppKit): раскладки, детекция, конвертация
 LayoutFix/ приложение: менюбар, хоткеи, Accessibility, буфер обмена, настройки
Tests/
 LayoutFixCoreTests/ юнит-тесты + Fixtures/real_world_examples.json
Scripts/ build-release.sh, notarize.sh
docs/ architecture.md, adding-a-language.md

Тесты ядра (SwiftPM)

swift test --filter LayoutFixCoreTests

Требует полноценный Xcode (не только Command Line Tools) — SwiftPM использует ресурсные бандлы, которым нужен macOS Platform path.

Приложение (локальный запуск)

./rebuild.sh

Скрипт делает swift build, копирует бинарник и ресурсы в build/LayoutFix.app, подписывает и запускает приложение.

Совет по разработке. Разрешение Accessibility привязано к подписи. При обычной ad-hoc-подписи отпечаток меняется на каждой сборке и галочка «Универсального доступа» слетает. Чтобы этого не было, создайте одноразовый стабильный сертификат разработчика:

# Сгенерировать самоподписанный codesigning-сертификат "LayoutFix Dev"
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
 -keyout /tmp/lf_key.pem -out /tmp/lf_cert.pem \
 -subj "/CN=LayoutFix Dev" \
 -addext "keyUsage=critical,digitalSignature" \
 -addext "extendedKeyUsage=critical,codeSigning" \
 -addext "basicConstraints=critical,CA:false"
openssl pkcs12 -export -legacy -inkey /tmp/lf_key.pem -in /tmp/lf_cert.pem \
 -out /tmp/lf.p12 -name "LayoutFix Dev" -passout pass:layoutfix
security import /tmp/lf.p12 -k ~/Library/Keychains/login.keychain-db \
 -P layoutfix -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "" \
 ~/Library/Keychains/login.keychain-db

После этого rebuild.sh подпишет им автоматически, отпечаток перестанет меняться и разрешение выдаётся один раз. Если сертификата нет — скрипт откатится на ad-hoc.

Для работы в Xcode можно открыть Package.swift напрямую, либо сгенерировать проект из project.yml через XcodeGen.

Релизный .dmg

export DEVELOPER_ID_APP="Developer ID Application: Your Name (TEAMID)"
./Scripts/build-release.sh
./Scripts/notarize.sh build/LayoutFix.dmg

CI собирает и нотаризует .dmg на пуш тега v* — см. .github/workflows/release.yml.

Разрешения

App Sandbox выключен намеренно (в песочнице не работают глобальные хоткеи), поэтому дистрибуция — прямой подписанный .dmg, а не Mac App Store.


Лицензия

MIT. Делай что хочешь — только сохрани копирайт.

Понравился проект? Поставь ⭐ и поддержи — это помогает развитию.

About

Punto Switcher для macOS — нативный опенсорс. Исправляет текст в неправильной раскладке (ghbdtn → привет) по горячей клавише. Локально, без сети.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /