Перехватчик событий клавиатуры на уровне ядра (evdev) для быстрого преобразования текста между английской и русской раскладками через двойное нажатие Shift.
Быстрая установка:
git clone https://github.com/kabobik/lswitch.git && cd lswitch && bash scripts/install.sh- ✅ Конвертация текста по двойному Shift — нажми Shift дважды быстро, и текст конвертируется
- ✅ Перехват на уровне ядра — через
/dev/input/, работает во всех приложениях - ✅ Конвертация слова или выделения — последнее напечатанное слово ИЛИ выделенный текст
- ✅ EN ⟷ RU — английский ↔ русский
- ✅ Автоопределение раскладки — по n-граммам и словарю
- ✅ Самообучающийся словарь — учится на истории ошибок пользователя
- ✅ GUI иконка в трее — статус и управление через PyQt5
- ✅ systemd демон — автозапуск при входе в систему
| Компонент | Назначение | Критичность |
|---|---|---|
| Python 3.10+ | Основной интерпретатор | Критично |
| pip3 | Установка Python пакетов | Критично |
| evdev | Чтение событий клавиатуры из /dev/input/ |
Критично |
| python-xlib | Определение раскладки, X11 | Критично |
| pyudev | Мониторинг hot-plug устройств | Критично |
| PyQt5 | Иконка в системном трее | Рекомендуется |
| systemd | Управление демоном | Рекомендуется |
Display Server: X11 (основной), Wayland через XWayland
git clone https://github.com/kabobik/lswitch.git
cd lswitch
bash scripts/install.shСкрипт автоматически:
- Проверит Python 3.10+ и все зависимости
- Установит недостающие пакеты через apt
- Скопирует приложение в
~/.local/share/lswitch/ - Создаст команду
lswitchв~/.local/bin/ - Установит systemd unit, udev правила, иконку, ярлык в меню
- Предложит включить автозапуск
input применяются только после logout.
Скачайте .deb из Releases или соберите сами:
bash scripts/build-deb.sh
sudo dpkg -i build/lswitch_2.0.0_all.deb
sudo apt install -f # если нужны зависимости# Если ставили через install.sh:
bash scripts/install.sh --remove
# Если ставили через .deb:
sudo apt remove lswitchПосле запуска иконка LSwitch появляется в системном трее. Правая кнопка мыши — меню управления:
- Переключить авто-конвертацию
- Переключить самообучающийся словарь
- Статус systemd сервиса / старт / стоп / рестарт
- Debug Monitor (если
"debug": trueв конфиге)
systemctl --user enable --now lswitch # автозапуск + старт
systemctl --user disable lswitch # отключить автозапуск
systemctl --user start lswitch # запустить
systemctl --user stop lswitch # остановить
systemctl --user restart lswitch # перезапустить
systemctl --user status lswitch # статус
journalctl --user-unit=lswitch -f # следить за логамиlswitch # запуск с GUI
lswitch --headless # без GUI (headless daemon)
lswitch --debug # с отладочными сообщениями
lswitch --trace # с трассировкой всех событий
lswitch --replace # остановить предыдущий экземпляр и запустить новыйЗащита от двойного запуска: LSwitch использует PID lock — если экземпляр уже работает, второй не запустится. Для замены используйте
--replace.
- Перехват: Демон слушает все события клавиатуры через
/dev/input/(evdev) - Детектор двойного Shift: При двух нажатиях Shift с интервалом <
double_click_timeoutсек — срабатывание - Получение текста: Извлекает последнее слово из внутреннего буфера событий ИЛИ выделение (X11 PRIMARY)
- Конвертация: Посимвольное преобразование EN ↔ RU через таблицу маппинга
- Вставка: Удаляет оригинал (Backspace × N) и «перепечатывает» конвертированный текст через виртуальную клавиатуру
- Переключение раскладки: Посылает
layout_switch_keyеслиswitch_layout_after_convert: true
| Введи (не та раскладка) | Двойной Shift | Результат |
|---|---|---|
ghbdtn |
→ | привет (+ переключает на RU) |
привет |
→ | ghbdtn (+ переключает на EN) |
ghbdtn vbh (выделено) |
→ | привет мир |
Hello world (выделено) |
→ | Руддщ цщкдв |
Конфиг: ~/.config/lswitch/config.json (создаётся автоматически при первом запуске).
{
"double_click_timeout": 0.3,
"switch_layout_after_convert": true,
"layout_switch_key": "Alt_L+Shift_L",
"debug": false,
"auto_switch": false,
"auto_switch_threshold": 40,
"user_dict_enabled": true,
"user_dict_min_weight": 2,
"app_policies": {
"Code": "retype",
"Firefox": "selection"
}
}Параметры:
double_click_timeout— максимальный интервал между двумя Shift (сек)switch_layout_after_convert— переключать раскладку после конвертацииlayout_switch_key— комбинация переключения раскладки (Alt_L+Shift_L,Ctrl_L+Shift_L)debug— отладочные сообщения + пункт Debug Monitor в трееauto_switch— автоматически определять и конвертировать раскладкуauto_switch_threshold— порог уверенности авто-детектора (%)user_dict_enabled— самообучающийся словарьapp_policies— режим конвертации по имени окна:"retype"или"selection"
После изменения конфига:
make restart
# или SIGHUP для перезагрузки без рестарта:
systemctl --user kill -s HUP lswitchlswitch/
├── app.py # Точка входа и главный цикл
├── cli.py # Аргументы командной строки
├── config.py # Загрузка и сохранение конфига
│
├── core/ # Ядро: состояния, события, конвертация
│ ├── state_manager.py # FSM состояний (IDLE/TYPING/CONVERTING...)
│ ├── event_manager.py # Маршрутизация evdev событий
│ ├── event_bus.py # Внутренняя шина событий
│ ├── conversion_engine.py # Движок конвертации текста
│ └── text_converter.py # Посимвольная конвертация EN ↔ RU
│
├── input/ # Работа с устройствами ввода
│ ├── device_manager.py # Сканирование и hot-plug /dev/input/
│ ├── virtual_keyboard.py # Виртуальная клавиатура (uinput)
│ └── key_mapper.py # Маппинг keycode → символ
│
├── intelligence/ # Умные функции
│ ├── auto_detector.py # Авто-определение раскладки
│ ├── ngram_analyzer.py # N-грамм анализ
│ ├── dictionary_service.py # Словарный сервис
│ └── user_dictionary.py # Пользовательский словарь
│
├── platform/ # Платформо-зависимый код
│ ├── clipboard.py # Работа с буфером обмена
│ └── selection_adapter.py # X11 PRIMARY selection
│
└── ui/ # Графический интерфейс
├── tray_icon.py # Иконка в системном трее
├── context_menu.py # Меню трея
├── debug_monitor.py # Окно отладки (real-time буфер и состояние)
└── config_dialog.py # Диалог настроек
pytest tests/ -v # все тесты
pytest tests/ --cov=lswitch # с покрытием кода
pytest tests/test_conversion_engine.py -v # конкретный модуль📊 Статус: 30 тестовых модулей
sudo usermod -a -G input $USER
# Затем перелогинитьсяЗапустите с --headless:
lswitch --headlessИли в конфиге выставьте "debug": false и убедитесь что DISPLAY доступен для systemd unit.
make status # статус сервиса
make logs # логи в реальном времени
lswitch --debug # запуск с отладкой вручнуюgit clone https://github.com/kabobik/lswitch.git
cd lswitch
# Установить в editable режиме (для разработки)
pip install -e ".[gui,dev]"
# Запустить тесты
pytest tests/ -v
# Запустить с трассировкой событий
lswitch --traceMIT License — см. LICENSE
Anton — 2024-2026
- Вдохновлено Punto Switcher от Яндекса
- Использует python-evdev для перехвата клавиатуры
- PyQt5 для GUI
⭐ Понравилось? Поставьте звезду на GitHub!