Русский · English
WaySwitch чинит слово, набранное не в той раскладке (ghbdtn вместо
«привет»), сразу же, на пробеле — без горячих клавиш и без переключения
раскладки вручную. На X11 такие утилиты давно есть; на Wayland компоситор
намеренно не даёт программе ни слушать чужую клавиатуру, ни подделывать
ввод через окна — общего с X11 API здесь нет. WaySwitch обходит это,
работая на уровень ниже графического стека: читает события клавиатуры
напрямую из /dev/input (evdev) и печатает через виртуальную клавиатуру
ядра (uinput), так что композитору всё равно, GNOME это, Wayland или что
угодно ещё с теми же интерфейсами ядра. Демон никогда не захватывает
клавиатуру устройства — если он зависнет, клавиатура продолжит работать
как обычно.
- Набрали
ghbdtn(латиницей вместо русской раскладки) — на пробеле само становитсяпривет, раскладка переключается вместе со словом. - Начали адрес не в той раскладке —
реезыЖ..— WaySwitch узнаёт схему URL и чинит её сразу, не дожидаясь пробела. - Слово исправилось не то, которое нужно, или вручную нужно поправить то, что автоисправление пропустило, — двойной Shift чинит последнее слово, тройной (третий тап следом за двойным) — всю набранную фразу.
- Автоисправление сработало ошибочно — тот же двойной Shift в течение нескольких секунд после него откатывает слово обратно и запоминает его как исключение: второй раз WaySwitch его не тронет.
Раздел — пошаговая инструкция для тех, кто впервые открывает терминал в Linux (опытным: короткий путь из исходников и таблица команд — в конце этого раздела и раздела «Использование»).
Три термина по ходу дела: терминал — текстовое окно для ввода команд
с клавиатуры, а не мышью; sudo в начале команды — «выполнить от
имени администратора» (система спросит пароль вашей учётной записи, и,
пока вы его набираете, на экране не появляется ничего — ни точек, ни
звёздочек, это нормально); вставить скопированный текст в терминал —
Ctrl+Shift+V (обычный Ctrl+V там не работает).
WaySwitch работает только на GNOME и только на Wayland (способ, которым система рисует окна и читает клавиатуру; старая альтернатива — X11, там WaySwitch бесполезен). Откройте «Параметры → О системе» (Settings → About): рабочий стол должен быть GNOME, а строка «Windowing System» / «Оконная система» — Wayland, не X11. Поддерживаются GNOME 46–50, Ubuntu 24.04 и новее (включая 26.04). Если указано X11 — выйдите из системы, на экране входа нажмите значок шестерёнки рядом с полем пароля и выберите GNOME (не «GNOME on Xorg» / «GNOME на Xorg»), затем войдите заново.
«Параметры → Клавиатура → Источники ввода» (Settings → Keyboard → Input Sources): нужно ровно две раскладки — русская и английская (латинская); лишние удалите кнопкой «−», недостающую добавьте кнопкой «+». Проверьте, что Super (клавиша с логотипом) + Пробел переключает раскладку в верхней панели.
Нажмите Super, наберите «Терминал» (Terminal), откройте найденное приложение. Скопируйте три строки ниже и вставьте в терминал (Ctrl+Shift+V), затем нажмите Enter:
url=$(curl -s https://api.github.com/repos/Wetoshkin/WaySwitch/releases/latest | grep -o 'https://[^"]*\.deb' | head -1)
wget "$url"
sudo apt install ./wayswitch_*.debПервые две строки скачивают последний релиз (пара секунд); третья
начинается с sudo, спросит пароль, покажет список зависимостей и
Продолжить? [Д/н] — нажмите Enter или Y. Меньше минуты; apt сам
подтянет GTK4, IBus и остальные библиотеки.
Выйдите из системы и войдите заново (подойдёт и перезагрузка) — правило доступа к устройствам ввода (udev), которое поставил пакет, применяется только к новому сеансу: без перелогина демон не сможет читать клавиатуру.
wayswitch doctor✓ — всё в порядке, ✗ — чего-то не хватает, под строкой — подсказка,
что сделать; в конце — «Всё готово.» либо «Не пройдено обязательных
проверок: N.». Строки «Расширение GNOME Shell» и «systemd user-сервис»
необязательны: к расширению вернётесь ниже. Если обязательная проверка
не пройдена — выполните подсказку и запустите doctor заново.
systemctl --user enable --now wayswitch--now запускает WaySwitch сразу, enable — включает автозапуск при
каждом входе в систему. Проверить, что демон работает: wayswitch status или systemctl --user status wayswitch (ищите строку Active: active (running)).
git clone https://github.com/Wetoshkin/WaySwitch.git wayswitch
cd wayswitch
sudo packaging/install.shСтавит системные пакеты, копирует код в /usr/local/lib/wayswitch,
кладёт udev-правило, systemd user-юнит и расширение GNOME Shell в
профиль вызвавшего пользователя (sudo от обычного пользователя, не от
root). Дальше — шаги 4–6 выше. На Debian/Ubuntu предпочтителен
.deb-пакет; этот путь — для Fedora и сборки из исходников.
sudo apt remove wayswitch # если ставили .deb
sudo packaging/uninstall.sh # если ставили из исходниковНастройки (~/.config/wayswitch) не трогаются — на случай
переустановки; чтобы стереть и их: rm -rf ~/.config/wayswitch.
Откройте текстовое поле — например, «Текстовый редактор» (Text Editor,
есть в Ubuntu по умолчанию; найдите через Super). Переключитесь на
английскую раскладку (Super+Пробел), наберите ghbdtn и нажмите пробел
— слово станет «привет», раскладка переключится на русскую.
Опробуйте сразу ещё три жеста (нажатия Shift подряд, без пауз; точные тайминги — в таблице «Жесты» ниже): двойной Shift сразу после слова исправляет его вручную, даже если автоисправление промолчало; тройной Shift (третье нажатие сразу за двойным) исправляет всю фразу целиком; двойной Shift в течение нескольких секунд после автоисправления откатывает слово обратно и запоминает его как исключение.
После перелогина (шаг 4) включите расширение, которое пакет уже положил
в систему, — оно даёт демону точное знание раскладки и печатает
мгновенно: gnome-extensions enable wayswitch@siberia.ru, либо через
приложение «Расширения» (Extensions). Затем в окне настроек WaySwitch
(ниже) на странице «Настройки» в поле «Бэкенд раскладки» выберите
«Расширение GNOME Shell». Без него WaySwitch работает через IBus с
небольшой задержкой (settle_ms, 30 мс по умолчанию) — обычно
незаметно, но расширение точнее.
wayswitch-guiили «WaySwitch» в списке приложений (Super). Четыре страницы:
- Статус — работает ли демон, бэкенд, раскладка, счётчик исправлений, тестовое поле.
- Настройки — автоисправление, чувствительность, жест ручного исправления, окно отката, задержки, бэкенд.
- Исключения — слова, которые никогда не исправляются; можно добавлять и удалять вручную.
- Автозапуск — переключатели «Демон при входе в систему» и «Значок в трее при входе».
Чтобы значок был в трее сразу после входа, включите второй переключатель на странице «Автозапуск» — для него в Ubuntu нужно расширение AppIndicator, оно включено по умолчанию.
Перед вводом пароля в необычном поле (не в системном диалоге входа, а,
например, в форме на сайте) поставьте WaySwitch на паузу — в трее
(«Пауза») или командой wayswitch pause — и возобновите после
(wayswitch resume). Демон старается не трогать поля паролей, но
полагаться на это не стоит.
wayswitch doctor — не появился ли новый ✗; journalctl --user -u wayswitch -n 50 — последние строки лога демона; wayswitch dry-run в
терминале — демон наблюдает и печатает решения в лог, ничего не меняя на
экране. Не помогло — заведите issue в репозитории проекта и приложите
вывод этих трёх команд.
| Жест | Действие |
|---|---|
| Двойной Shift (второй тап в пределах 0,4 с) | исправить последнее слово; при пустом буфере — просто переключить раскладку |
| Тройной Shift (третий тап следом за двойным) | исправить всю фразу в раскладке, которую выбрал двойной Shift |
Двойной Shift в течение undo_window_sec после автоисправления |
откатить слово и запомнить его как исключение |
Жесты не работают, пока экран заблокирован или демон на паузе.
| Команда | Действие |
|---|---|
wayswitch run [--verbose] [--dry-run] [--config PATH] |
запустить демон |
wayswitch dry-run |
демон в режиме наблюдения (verbose, без действий) |
wayswitch doctor |
диагностика окружения |
wayswitch devices |
список устройств ввода |
wayswitch pause / resume |
пауза/возобновление по D-Bus |
wayswitch fix |
исправить последнее слово по D-Bus |
wayswitch status |
состояние демона |
wayswitch gui |
открыть окно настроек |
wayswitch version |
версия |
wayswitch-gui [--tray] |
настройки; --tray — сразу в трей, без окна |
Значок в трее открывает меню: переключатель автоисправления, пауза/ возобновление, «исправить последнее слово», настройки, выход.
~/.config/wayswitch/config.toml (создаётся при первом сохранении из GUI
или руками):
[general]
auto_correct = true # включено ли автоисправление на пробеле
sensitivity = "normal" # conservative | normal | aggressive
phrase_timeout_sec = 8.0 # пауза между словами, после которой фраза для тройного Shift обнуляется (1..300)
undo_window_sec = 5.0 # сколько секунд после автоисправления двойной Shift ещё откатывает слово (0..60)
[gesture]
manual = "double_shift" # double_shift | pause_key | none
pause_hotkey = "" # клавиша паузы, например "scroll_lock" (пусто — не назначена)
[typing]
settle_ms = 30 # запас после сигнала о смене раскладки на пути IBus, мс (0..2000)
key_delay_ms = 0 # задержка между отправляемыми клавишами, мс (0..100)
[backend]
prefer = "auto" # auto | shell | ibus | hotkeysensitivity регулирует порог: conservative реже ошибается, но и реже
чинит короткие/редкие слова; aggressive — наоборот.
~/.config/wayswitch/exceptions.txt — слова, которые никогда не
исправляются автоматически (по слову в строке, регистр не важен);
пополняется откатом жестом или из GUI.
evdevслушает клавиатуры напрямую по/dev/input/event*, без захвата устройства и без прав root: правило udev с тегомuaccessвыдаёт доступ пользователю активного сеанса, никаких групп добавлять не нужно.- Буфер копит коды клавиш текущего слова и фразы, отдельно отслеживает Shift/CapsLock.
- На пробеле детектор декодирует нажатия двумя способами — в текущей
раскладке и в альтернативной — по таблицам
libxkbcommon, построенным из настоящих раскладок пользователя (не зашитых QWERTY/ЙЦУКЕН). - Решение «оставить» или «исправить» принимается по словарю и модели символьных триграмм, с стоп-правилами для цифр, смешанных алфавитов, camelCase, путей/URL и коротких слов вне словаря.
- Для исправления строится план: N×Backspace, переключение раскладки
через выбранный бэкенд (расширение GNOME Shell → IBus → хоткей как
резерв) и перепечатка символов через
uinput. - Ранний триггер отдельно ловит начало URL (
http://,https://,ftp://), набранное не в той раскладке, — не дожидаясь пробела. - Жесты (двойной/тройной Shift) и откат с запоминанием слова в исключениях работают поверх того же плана исполнения; пока экран заблокирован или демон на паузе, ничего не происходит.
Качество детектора на отложенной части словаря (не участвовавшей в обучении): ru — полнота 96,5 %, ложные срабатывания 0,07 %; en — полнота 96,8 %, ложные срабатывания 0,07 %.
- GNOME 46–50 на Wayland.
- Ровно две раскладки ввода: одна
ru*, одна латинская. - Ubuntu 24.04+ или Fedora 40+.
- Python 3.11+.
WaySwitch v2 — альфа, полностью переписанная с нуля. Вся логика
покрыта юнит-тестами и проверена на Windows и в CI (Linux), но ни разу не
запускалась на живом GNOME — чек-лист первого запуска в VM:
docs/testing-vm.md. Известные ограничения:
- Демон не видит текст в полях паролей — на время ввода пароля ставьте его на паузу.
- Поля с автодополнением (например, адресная строка браузера) могут вести себя неожиданно при перепечатке.
- Если исправление прервано на середине (физическое нажатие клавиши во время перепечатки), уже отправленные символы не откатываются — попытка «починить» вслепую только усугубила бы расхождение с экраном.
- Правило udev
uaccessдаёт чтение событий клавиатуры любой программе текущего пользователя, не только WaySwitch, — это цена схемы наevdev. - Поддерживается только GNOME; KDE и Sway/Hyprland — в планах.
pip install pytest ruff
python -m pytest -q
python -m ruff check .Два теста keymap.py, завязанных на настоящий libxkbcommon
(tests/test_keymap_xkb.py), пропускаются на Windows и выполняются в CI
(GitHub Actions, ubuntu-latest). Словарные данные пересобираются
командой python tools/build_data.py. Пакет .deb собирается на Linux
командой bash tools/build_deb.sh; релизы выпускаются по тегу vX.Y.Z,
совпадающему с версией в pyproject.toml.
- Бэкенд для KDE Plasma и IPC-бэкенды для Sway/Hyprland.
- Определение полей паролей и активного приложения через AT-SPI — на любом окружении, не только через эвристики GNOME.
- Исправление уже выделенного текста через буфер обмена/портал.
- Третьи языки как подключаемый пакет словаря и триграмм.
- Привилегированный helper вместо широкого правила
uaccessна клавиатуры. .rpm-пакет (Flatpak невозможен: нужен прямой доступ к/dev/input).
Код — MIT (LICENSE). Словарные данные и триграммы (wayswitch/data/*.gz)
собраны из открытого проекта FrequencyWords и распространяются по
CC-BY-SA 4.0 — подробности в wayswitch/data/LICENSE.