Обновить

Зябра: как я поймал Карамбу на выходе в интернет и написал свой офлайн-переключатель раскладки

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели9.4K
Всего голосов 7: ↑5 и ↓2+4
Комментарии21

Комментарии 21

Зачем весь этот слоп - непонятно. Заблокировать карамбе выход в интернет - религия не позволила? Не хватило подписки на реверс вызова библиотеки обновления?

Не топлю за carambа, но если это самостоятельная программа так и пишите про неё.

Поставил себе Зябру и такой вопрос — она должна работать во всех приложениях или есть исключения? Конкретно у меня не работает в The Story Nexus за авторством vijayk1989, запускал без прав администратора на Win10 22H2.

Зябра должна работать в любом окне, которое видит низкоуровневый хук. Не видит она окна, запущенные от администратора, своё собственное окно и классические поля пароля. Раскладка нужна обычная: английская или русский ЙЦУКЕН.

Win10 22H2 и запуск без прав администратора тут ни при чём. The Story Nexus — это Tauri: текст набирается в WebView2, а не в обычном поле Windows. Фокус там сидит на дочернем окне, и его поток не тот, что у верхнего окна. Зябра читала раскладку верхнего окна, считала набор русским и ничего не заменяла.

В 0.1.6 раскладка берётся у окна, которое реально принимает клавиши: https://github.com/DmNep/zyabra/releases/tag/v0.1.6

Проверил на таком же WebView2, не на самой Story Nexus. Если после обновления в ней всё ещё не переключается, напишите.

Данный коментарий написал с использованием вашей программы, очень крутая. Вот только не хватает функционала переназначить клавишу отмены т.к. на ноутбуках небольшой диагонали клавиша Pause отсутствует

Спасибо, приятно, что комментарий набран Зяброй. Pause на маленьких ноутбуках правда часто нет.

Настраиваемую клавишу пока не делаю: выбранный код клавиши надо где-то хранить, а Зябра ничего не записывает ни на диск, ни в реестр. Без этого настройка пропадёт при следующем запуске.

Подумаю над второй клавишей или сочетанием клавиш, рядом с Pause, чтобы на компактной клавиатуре было чем переложить слово. Что сами назначили бы?

Ну для меня самой нечасто используемой клавишей является правый Alt - т.к. он ещё и имеет дубль слева то я предложил бы его)

Можно взять SharpKeys и переназначить на Pause любую ненужную вам кнопку. SharpKeys работает без установки, ремап записывается в реестр. Можно и руками записать, но это немного мудрено.

P.S. Зябра же нормально воспримет такой переназначенный Pause?

SharpKeys просто пишет в Scancode Map системного реестра Windows. Для операционки и всех хуков клавиша физически меняет свой код еще до попадания в обработчики приложений, так что по идее Зябра вообще не заметит разницы и отработает как надо

А что не позволяет запускать с аргументом кода клавиши в командной строке?

P. S. Пожалуйста позовите человека в ответы. А то это короткое саммари предыдущего комментария перед ответом по делу все портит.

Правый Alt для этого плох. На русской раскладке это не запасная копия левого Alt, а AltGr: с ним набирается третий ряд символов, и Windows ещё посылает его как Ctrl+Alt. Если Зябра заберёт эту клавишу, чужие сочетания пропадут, а каждое нажатие будет перекладывать последнее слово.

Левый Alt при этом остаётся обычным Alt и открывает меню. Для дублёра Pause нужна клавиша или сочетание, которое само ничего не печатает и не переключает раскладку.

Словари на полтора миллиона словоформ без контекстного анализа все равно будут спотыкаться на коротких сокращениях

Да, Вы правы. Короткие сокращения Зябра будет иногда перекладывать. Контекст фразы для этого не нужен и в текущую схему не ложится. Разбор предложения означал бы держать соседние слова. Сейчас в памяти только текущее слово и одна последняя замена.
Пытаюсь соблюсти баланс между минимально удобной функциональностью и простотой.

П.С. С грустью наблюдаю, как из нормальных рабочих вещей "супер маркетологи" делают "супер вещи". Нормальная, качественная софтина сначала обрастает игровым режимом, который начисляет золотишко за активности, на которое можно купить шкурки, потом прямо в интерфейсе появляются какие ни будь сторис, потом ИИ помощник и сверху ИИ бот.

В 0.1.7 добавил аргумент запуска: zyabra --key 0x2C. Код десятичный или с префиксом 0x. На Windows это виртуальный код клавиши (0x2C - Print Screen), на Linux - код evdev (Print Screen - 99). Зябра его никуда не записывает: аргумент остаётся в ярлыке, если сделать ярлык запуска Зябры с параметрами или в команде, если запускать из командной строки. Pause по-прежнему работает. Если клавиша задана, её имя видно в окне рядом с Pause. Пока Зябра уже запущена, повторный запуск новый код не подхватывает, нужно выйти и запустить снова.

https://github.com/DmNep/zyabra/releases/tag/v0.1.7

Та же Caramba или Lay позволяет переключаться по double shift, очень удобно. И в Lay например мне не хватает возможности переключить выделенное предложение.

Думал над сменой выделенного фрагмента. Но программа его не видит. Она знает только те клавиши, которые прошли через неё в текущем слове. Выделение в браузере, ide или мессенджере не прочитать. На Windows часть старых полей отдаёт текст через специальные функции доступа, на Wayland не отдаёт почти никто. Общий способ один - послать копирование, прочитать буфер, переложить буквы по клавишам и вставить обратно. Прежнее содержимое буфера после этого возвращается. Но, любая программа в том же сеансе может подписаться на смену буфера и прочитать текст. Отдельного разрешения на это нет, так устроен сам буфер, и так работают менеджеры буфера и вредоносные программы, которые, например, подменяют скопированный адрес кошелька.

Момент, когда Зябра положит туда выделенный фрагмент, они увидят. Возврат прежнего содержимого это не стирает - содержимое уже ушло.

Можно попробовать использовать Accessibility API для чтения выделения, не уверен только что это везде будет работать.
А что про переключение по Shift-Shift?

zyabra --key 2sh перекладывает слово со второго Shift подряд, не позже 0,4 с и без другой клавиши между ними. Сам Shift при этом не глотается: заглавные, ! и ? остаются. Удержание Shift не считается. Аргумент хранится в ярлыке или в команде, не в Зябре. Если клавиша задана, окно пишет её имя рядом с Pause.

отлично, спасибо!

... и хорошо бы добавить в словарь `ююю` = `...`
спасибо!

Короткие словари-добавки сделал, лежат отдельно: dictionaries/extra-en.txt и dictionaries/extra-ru.txt. Скрипт их не перезаписывает. Новое слово добавляется коммитом в репозиторий и попадает в программу при следующей сборке. Уже собранный файл строку сам не подхватывает.

В строке пишется слово того языка, которым оно является: строчными буквами, от 2 до 20 знаков. Пар словарь не хранит. Набранное меняется, только когда в своём списке его нет, а те же клавиши есть в другом. В английском списке есть ..., поэтому ююю становится ...: три "ю" по-русски словом не считаются, а эта клавиша по-английски печатает точку. В русский список добавляют слово, которого нет среди словоформ. Тогда набранное по-русски остаётся, а английские клавиши этого слова перекладываются в него, если сами словом не являются. Буква ё в строке пишется как е.

хорошо бы при старте подгружать пару En/Ru внешних словарей из файлов - чтобы обойтись без сборки ради добавления одного слова...

да, заменил Карамбу на Зябру, обновил до v1.10, подключил " --key 2sh" — спасибо!
теперь не хватает только перекладывания выделенного текста и файлов-словарей
))

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации