Skip to content
Назад в блог

EzSwitch — утилита для быстрого переключения раскладки на macOS

5 мин. чтения
EzSwitch — утилита для быстрого переключения раскладки на macOS

Для тех, кто постоянно работает с текстом на нескольких языках (например, пишет код на английском и документацию на русском), раскладка клавиатуры часто становится источником раздражения. Промахи мимо нужного языка, набранный абракадаброй текст (ghbdtn вместо привет) — всё это сбивает рабочий темп.

Чтобы решить эту проблему раз и навсегда, я разработал EzSwitch — легкую утилиту для macOS, написанную на Swift и SwiftUI, которая размещается в системном меню-баре и автоматизирует работу с клавиатурными раскладками.

В этой статье я расскажу о возможностях утилиты и о том, как реализованы ее ключевые функции под капотом macOS.

Ключевые фичи EzSwitch

Приложение решает две основные задачи: быстрое переключение раскладок физической клавишей и мгновенное исправление уже набранного не в том режиме текста.

1. Переключение по клавише Command (или Option)

Интерфейс EzSwitch в меню-баре
Интерфейс EzSwitch в меню-баре

Вместо стандартных неудобных комбинаций Cmd+Space или Ctrl+Space, EzSwitch позволяет переключать язык одиночным тапом по модификаторам:

  • Одиночный тап по левому Command ➔ принудительно включает левую раскладку (например, английский).
  • Одиночный тап по правому Command ➔ включает правую раскладку (например, русский). Это работает мгновенно и безошибочно, так как вам не нужно помнить, какой язык активен сейчас. Достаточно нажать левую или правую кнопку.

2. Конвертация набранного текста по двойному Shift

Если вы забыли переключить язык и набрали слово «абракадаброй», выделите его и дважды нажмите клавишу Shift (или Option). Текст мгновенно трансформируется в правильную раскладку.

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

Как это устроено под капотом macOS

Разработка подобного системного софта под macOS требует глубокого взаимодействия с низкоуровневыми API операционной системы.

Перехват клавиатурных событий (Event Taps)

Для отслеживания нажатий клавиш (двойной Shift, одиночный Command) в KeyboardManager.swift используется механизм CGEventTap. Приложение регистрирует слушатель событий клавиатуры на уровне системы:

let eventTap = CGEvent.tapCreate(
    tap: .cgSessionEventTap,
    place: .headInsertEventTap,
    options: .defaultTap,
    eventsOfInterest: [.keyDown, .keyUp, .flagsChanged],
    callback: myEventTapCallback,
    userInfo: nil
)

Это требует предоставления приложению системного разрешения Input Monitoring (Мониторинг ввода).

Автоматическая генерация мапперов через UCKeyTranslate

Чтобы текст корректно конвертировался между любыми парами языков, приложению нужна таблица соответствия клавиш. Вместо написания таких файлов вручную, EzSwitch использует Carbon API под названием UCKeyTranslate. Приложение считывает активные раскладки в системе, симулирует виртуальные нажатия клавиш для каждой физической кнопки во всех модификациях (с Shift и без) и на лету генерирует точную карту символов. Это гарантирует, что конвертер будет корректно работать с абсолютно любыми установленными у пользователя раскладками ввода.

Сгенерированная карта раскладки клавиатуры
Сгенерированная в рантайме карта раскладки клавиатуры через Carbon UCKeyTranslate API

Замена текста

Для исправления текста приложение использует симуляцию клавиатурных сочетаний через доступность (Accessibility API):

  1. Симулирует нажатие Shift + Option + Left (или Ctrl + Shift + Left в IDE) для выделения последнего набранного слова.
  2. Копирует выделенный текст в буфер обмена (Cmd+C).
  3. Трансформирует символы буфера по сгенерированной карте символов.
  4. Вставляет исправленный текст обратно (Cmd+V).

Заключение

EzSwitch получился лёгким, быстрым и не требовательным к ресурсам инструментом, который экономит массу времени при ежедневной работе на Mac. Проект полностью открытый — переходите в репозиторий EzSwitch на GitHub, чтобы изучить исходный код, собрать его в Xcode или внести свои доработки.

Разрабатываете инструмент или утилиту и нужна помощь с архитектурой или технической стороной? Можем обсудить это на технической консультации. Или посмотрите что ещё я строю и разрабатываю.