LINUX.ORG.RU

Выпуск gswitch 0.6.6, утилиты исправления текста в неверной раскладке

 , gswitch, , ,


2

1

Состоялся выпуск gswitch 0.6.6 – свободной утилиты для Linux (X11 и Wayland), которая по команде исправляет уже набранный текст в неверной раскладке. Программа не пытается угадывать язык во время ввода: пользователь сам запускает преобразование последнего слова, текста после последнего Enter или выделенного фрагмента.

По умолчанию триггером служит двойное нажатие Shift, но в настройках вместо него можно выбрать отдельную клавишу. При обычном вызове триггер исправляет последнее слово. Если удерживать Shift, триггер исправляет весь текст после последнего Enter. С Ctrl он исправляет выделенный текст. С Ctrl+Shift триггер меняет регистр выделения. Повтор триггера сразу после исправления возвращает исходный текст.

gswitch читает события физических клавиатур через evdev и воспроизводит исправленный ввод через uinput. Поэтому исправление слов и строк работает в приложениях под X11 и Wayland без отдельных расширений для браузера или редактора. Преобразование выделения использует буфер обмена.

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

Работа проверена на Ubuntu с GNOME и KDE на Wayland и X11, Fedora с GNOME и KDE на Wayland, а также RED OS с KDE на X11. Для кириллицы проверены пары us+ru и us+ua. Другие пары: us+de, us+fr, us+es. Все преобразования проверены в обоих направлениях.

В релиз входят пакеты DEB, RPM и tar.gz для x86_64, а также контрольные суммы. Исходный код опубликован под лицензией MIT.

Изображение: снимок окна настроек gswitch 0.6.6 из репозитория проекта.

>>> Репозиторий и релиз 0.6.6



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)

с одной стороны ни нужно, с другой стороны респект автору за то что работает везде.

gagarin0
()

С одной стороны не нужно, с другой нужно. Респект.

Gonzo ★★★★★
()

Я уж как-то перестал подобным пользоваться после того, как смену раскладки на капс забил. Но дело хорошее, кому-нибудь да пригодится.

bbc69
()

Здорово! Думал все аналоги давно умерли, а тут прям новая разработка - пару недель отроду. Попробуем!

GladAlex ★★★★★
()

Если удерживать Shift, триггер исправляет весь текст после последнего Enter.

Это как?! Нажать 2 раза Shift, удерживая Shift?!

С Ctrl+Shift триггер меняет регистр выделения.

Это как?!

С Ctrl он исправляет выделенный текст.

Вот это работает! Сtrl и двойное нажатие Shift.

Хорошо бы всё таки в новых версиях добавить автоматическое исправление и не только последнего слова, но и возможно 2-3-х. И иконку я бы исправил - а то у меня теперь 2 флага в системном лотке - неудобно: можно в трее показывать просто иконку самого приложения?

Благодарю за полезное приложение - очень не хватало!

GladAlex ★★★★★
()
Последнее исправление: GladAlex (всего исправлений: 1)

не помешало-бы добавить в описание:
- написан на Go
- какой тулкит используется для визуализации?

+

$ go build -o builds/gswitch ./cmd/gswitch
cmd/gswitch/main.go:6:2: cannot find package "github.com/arumata/gswitch/internal/gswitch" in any of:
/usr/src/github.com/arumata/gswitch/internal/gswitch (from $GOROOT)
($GOPATH not set)

почему «он» лезет/ищет что-то в дереве, вместо «локального каталога»?

sunjob ★★★★★
()

gswitch читает события физических клавиатур через evdev и воспроизводит исправленный ввод через uinput. Поэтому исправление слов и строк работает в приложениях под X11 и Wayland без отдельных расширений для браузера или редактора. Преобразование выделения использует буфер обмена.

Как всё сложно. Я на днях себе что-то подобное навайбкодил. Так там скрипт в 300 строк на питоне получился всего лишь и пол часа неспешной переписки с гроком. У меня работает либо для последней строки, либо для выделенного в primary selection. Меня другие варианты в принципе не особо интересовали.

А, да, у меня через wl-copy и wl-paste делается и никакой демон не нужен.

Но вообще, дело нужное, а то только 2 полутрупа есть на этой арене. Кстати, для вдохновления можно глянуть вендузячий Mahou3.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 2)
Ответ на: комментарий от sunjob

Ты зря установил GOROOT, эту переменную лучше не трогать

golang использует кэш в хомяке (~/go/src/), т.е. если ты хочешь, чтобы он увидел скачанные исходники, копируй их в

~/go/src/github.com/arumata/gswitch

оффтоп: я не рискну. прямой доступ к клавиатуре и sudo

router ★★★★★
()
Ответ на: комментарий от router

Ты зря установил GOROOT

откуда такие глубокие познания в всевидении и магии?

$ echo $GOROOT

golang использует кэш в хомяке
~/go/src/
если ты хочешь, чтобы он увидел скачанные исходники, копируй их в
~/go/src/github.com/arumata/gswitch

+

прямой доступ к клавиатуре и sudo

ну уж нахрен такие дефолтные условия-сборки (я лучше в сторонке постою, покурю, пошушукаюсь с людьми :о)

sunjob ★★★★★
()
Последнее исправление: sunjob (всего исправлений: 1)
Ответ на: комментарий от sunjob

откуда такие глубокие познания в всевидении и магии?

Ну мне приходилось собирать хомячий сусличный (или кто там маскот golang) софт

router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)

Тю. Давно решил эту проблему, вот эти 3 строчки забиндил на Break. Работает вообще везде, по схеме: выделил, Break, вставил.

#!/usr/bin/env bash
SRC="qwertyuiop[]asdfghjkl;'zxcvbnm,./\`QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё"
DST="йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ёqwertyuiop[]asdfghjkl;'zxcvbnm,./\`QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?~"
xsel | sed "y|$SRC|$DST|" | xsel -b -i

cybsant
()
Ответ на: комментарий от router

я про другое - безапеляционное заявление про «человека за океаном» и что у него «что-то неправильно настроено» и/или «вообще неправильно настроно»
аккуратнее надо быть, сдесь вам не тут :о)

мне приходилось собирать хомячий софт

а уж как всем остальным тут присутствующим это приходится каждодневно и ношно делать?! :о)

add:

сусличный (или кто там маскот golang)

такие вот они цуцлики :о)

sunjob ★★★★★
()
Последнее исправление: sunjob (всего исправлений: 2)
Ответ на: комментарий от sunjob

Ну если бы ты не трогал GOROOT, то в выводе ошибки go build был бы хомяк и не было бы GOROOT

cannot find package "github.com/arumata/gswitch/internal/gswitch" in any of:
/usr/src/github.com/arumata/gswitch/internal/gswitch (from $GOROOT)
router ★★★★★
()
Ответ на: комментарий от router

если бы ты не трогал GOROOT

ну т.е. вы аппонента
- не слышите
- держите его за идиота
- считаете лгуном

и... и вам недостаточно того, что я в пред. сообщении предоставил пустой выхлоп «этих вот значении»
повторю еще раз (повторенье мать... её)

main$ echo "начало экскримента"
начало экскримента
main$ echo $GOROOT

main$ echo $GOPATH

main$ env | grep GOROOT
main$ env | grep GOPATH
main$ echo "окончание экскримента"
окончание экскримента

лады, чего там?! :о)

sunjob ★★★★★
()
Последнее исправление: sunjob (всего исправлений: 5)
Ответ на: комментарий от sunjob

Я не разбираюсь в «go», но могу предположить что эта переменная прописана в каком-то конфиге. Например часто для make делают глобальный конфиг в /etc откуда он переменные берёт при каждом разпуске, тут наверно какая-то другая штука но может быть есть аналогичное.

firkax ★★★★★
()
Ответ на: комментарий от firkax

переменная прописана в каком-то конфиге
глобальный конфиг в /etc

да нет, /etc - чистый (в этом отношении)
с Go-шками всегда так, все через ... go-o-o...(ну, или я чего-то не знаю, всяко бывает :о)
думаю, настройки «внутри самой сборки», да - прописаны (или что там еще?!)

пример сборки с «установленными» переменными

main$ export GOPATH=/home/xxx/tmp.ram/01/gswitch-0.6.6
main$ go build -o builds/gswitch ./cmd/gswitch
cmd/gswitch/main.go:6:2: cannot find package "github.com/arumata/gswitch/internal/gswitch" in any of:
        /usr/src/github.com/arumata/gswitch/internal/gswitch (from $GOROOT)
        /home/xxx/tmp.ram/01/gswitch-0.6.6/src/github.com/arumata/gswitch/internal/gswitch (from $GOPATH)

main$ export GOROOT=/home/xxx/tmp.ram/01/gswitch-0.6.6
main$ go build -o builds/gswitch ./cmd/gswitch
warning: GOPATH set to GOROOT (/home/xxx/tmp.ram/01/gswitch-0.6.6) has no effect
cmd/gswitch/main.go:6:2: cannot find package "github.com/arumata/gswitch/internal/gswitch" in any of:
        /home/xxx/tmp.ram/01/gswitch-0.6.6/src/github.com/arumata/gswitch/internal/gswitch (from $GOROOT)
        ($GOPATH not set)

вот это
$GOPATH not set

хотя переменная уже установлена на пред. шаге
ладно, забили на го :о)

sunjob ★★★★★
()
Последнее исправление: sunjob (всего исправлений: 5)
Ответ на: комментарий от router

Успехов в поиске

спасибо великодушное. и вам не хворать! :о)

sunjob ★★★★★
()

С одной стороны не нужно, с другой стороны тоже не нужно. Лично меня автоисправлялки бесят и не факт что они работают везде. А еще привычка ожидать исправления там где его не будет

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Так это не АВТОисправлялка, а вполне себе ручная. Пока кнопку(комбинацию) для исправления не нажмешь, ничего исправлять не будет. Я вот иногда бывает слов 20 могу в не той раскладке нафигарить, причем половину английский по русски, а половину фразы наоборот(когда рассинхронизация произошла, например переключение не прожалось). И такое бывает раз 10-20 в день, иногда уже трясёт перепечатывать. А тут выделил, нажал F13(я на неё настроил) и всё само.

Loki13 ★★★★★
()
Ответ на: комментарий от sunjob
router@ubuntu2204-i1:~/local$ tar -xzf ~/go1.25.5.linux-amd64.tar.gz
router@ubuntu2204-i1:~/local$ export PATH=$HOME/local/go/bin:$PATH

router@ubuntu2204-i1:~/local$ cd ~/src/gswitch/

router@ubuntu2204-i1:~/src/gswitch$ go version
go version go1.25.5 linux/amd64

router@ubuntu2204-i1:~/src/gswitch$ env | grep GOPATH
router@ubuntu2204-i1:~/src/gswitch$ env | grep GOROOT
router@ubuntu2204-i1:~/src/gswitch$ go get ./cmd/gswitch
go: downloading github.com/jezek/xgb v1.3.1
go: downloading golang.org/x/sys v0.47.0
go: downloading golang.org/x/image v0.41.0
go: downloading golang.org/x/mobile v0.0.0-20250606033058-a2a15c67f36f
go: downloading golang.org/x/exp/shiny v0.0.0-20250606033433-dcc06ee1d476
router@ubuntu2204-i1:~/src/gswitch$ go build -o builds/gswitch ./cmd/gswitch
router@ubuntu2204-i1:~/src/gswitch$
router ★★★★★
()
Ответ на: комментарий от sunjob

Но /usr/src все равно не похоже на что-то стандартное

У golang есть свои переменные. Проверь

go env GOROOT
go env GOPATH

В этих внутренних дефолтных переменных GOROOT есть, но обычно он указывает туда, где установлен golang. Если нет, где-то в каком-то конфиге что-то не так

router@ubuntu2204-i1:~/src/gswitch$ go env GOROOT
/home/router/local/go
router ★★★★★
()
Ответ на: комментарий от Loki13

А тут выделил, нажал F13(я на неё настроил) и всё само.

Оно конечно полезно, но меня вот это пугает:

SUBSYSTEM=="input", KERNEL=="event*", ENV{ID_INPUT_KEYBOARD}=="1", TAG+="uaccess"
router ★★★★★
()
Ответ на: комментарий от router

Это я просто писал насчет нужности. А выше писал, что я использую свой скрипт(работающий исключительно в юзерспейсе) для этого.

Loki13 ★★★★★
()
Ответ на: комментарий от GladAlex

Спасибо, что попробовали. Комбинации зависят от выбранного триггера.

Если оставлен стандартный Double Shift, для всей фразы нужно зажать один Shift и, не отпуская его, дважды нажать второй Shift. Для смены регистра выделения нужно зажать Ctrl и один Shift, затем дважды нажать второй Shift.

Если в настройках выбрана отдельная клавиша, для всей фразы нужно нажать ее вместе с Shift. Ctrl + эта клавиша исправляет выделение, Ctrl + Shift + эта клавиша меняет его регистр. Если у вас выбран другой триггер и это работает иначе, напишите, какая именно клавиша назначена.

Автоматического режима сейчас нет. Я специально оставил исправление ручным, чтобы программа не меняла правильный текст сама. Вариант с двумя-тремя последними словами надо отдельно продумать.

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

arumata
() автор топика
Ответ на: комментарий от sunjob

Написано на Go. Окно настроек сделано на GTK3 через gotk3, значок в трее - через fyne.io/systray.

По этому выводу модульный режим Go не включился. Я воспроизвел ту же ошибку с GO111MODULE=off; с включенными модулями команда из корня репозитория собирается. Копировать исходники в GOPATH не нужно. gswitch использует go.mod и требует Go 1.25.5 или новее.

Покажите, пожалуйста, вывод go version и go env GOMOD GO111MODULE. По ним будет видно, старый ли это Go или модульный режим отключен настройкой.

arumata
() автор топика
Ответ на: комментарий от router

Опасение по делу: процесс действительно читает события клавиатуры, поэтому ему нельзя доверять вслепую.

Сам демон под root не работает. Права администратора нужны при установке и при записи системного конфига. В обычной работе gswitch запускается через systemd –user, а udev/logind выдает активному локальному пользователю ACL на клавиатуры и /dev/uinput. Polkit разрешает только вызов /usr/bin/gswitch --write-config.

Граница здесь не отдельная песочница gswitch, а текущий пользовательский сеанс. Это прямо описано в README. Сетевого кода в gswitch нет, а сервису разрешены только AF_UNIX и AF_NETLINK.

arumata
() автор топика
Ответ на: комментарий от ki724

Спасибо. Пока T9 и автоматического исправления в планах нет. gswitch меняет текст только по явному нажатию: так он не исправляет правильный текст по своей догадке. Если появятся конкретные сценарии, где ручного режима не хватает, посмотрю на них отдельно.

arumata
() автор топика
Ответ на: комментарий от arumata

Если оставлен стандартный Double Shift, для всей фразы нужно зажать один Shift и, не отпуская его, дважды нажать второй Shift.

У меня не получилось. Всё по умолчанию (Shift) - ничего не менял. Здесь явно баг - проверил ещё раз: поменял раскладку только последнего слова и зачем-то ещё и его регистр, хотя регистр в порядке.

Автоматического режима сейчас нет. Я специально оставил исправление ручным, чтобы программа не меняла правильный текст сама. Вариант с двумя-тремя последними словами надо отдельно продумать.

Выпуск gswitch 0.6.6, утилиты исправления текста в неверной раскладке (комментарий) - вот тут товарищ описывает вполне себе рабочий сценарий, у меня такое тоже бывает:

Я вот иногда бывает слов 20 могу в не той раскладке нафигарить, причем половину английский по русски, а половину фразы наоборот(когда рассинхронизация произошла, например переключение не прожалось). И такое бывает раз 10-20 в день, иногда уже трясёт перепечатывать.

Так что автоматический режим очень даже востребованный!

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

Спасибо! GXneur, например, просто показывал свою иконку.

GladAlex ★★★★★
()
Последнее исправление: GladAlex (всего исправлений: 1)
Ответ на: комментарий от Loki13

Понятно, я писатель не читатель, не вчитался в описание а полез комментировать… У меня таких ситуаций никогда не случается, максимум слово напишу не так и сразу вижу, поэтому быть может я не способен оценить данное ПО из сабжа

I-Love-Microsoft ★★★★★
()

Установить gswitch

Хотел с наскока на awesome 4.3-7

cd /home/petav/Downloads
wget https://github.com/arumata/gswitch/releases/download/v0.6.6/gswitch_0.6.6_linux_amd64.deb
dpkg -i gswitch_0.6.6_linux_amd64.deb
gswitch-tray
[*][*]  2026/09/02 21:51:22 systray error: failed to register: The name org.kde.StatusNotifierWatcher was not provided by any .service files
dpkg -r gswitch
petav ★★★★★
()
Последнее исправление: petav (всего исправлений: 1)
Ответ на: комментарий от GladAlex

Спасибо, это уже отдельный случай. Я прогнал на v0.6.6 точную последовательность: зажал один Shift, дважды нажал второй, затем отпустил первый. Она выбирает всю строку. Без Ctrl этот жест не должен менять регистр, поэтому по одному описанию причину не восстановить.

Пришлите, пожалуйста, конкретный пример «до -> после», какой Shift держали и какой нажимали. Еще нужны дистрибутив, рабочий стол, X11 или Wayland и вывод трех команд:

gswitch --version

gswitch --detect-layout-switch

grep -E '^(layout-switch|convert-key|reverse-mode|layout1|layout2)=' /etc/gswitch/default.conf

По ним будет видно, какой триггер и способ переключения раскладки реально выбрал демон.

В сообщении по ссылке пользователь как раз вручную выделяет текст и нажимает кнопку. Это не автоматический режим. Сам запрос я все равно записал отдельно. Иконку без флага тоже.

arumata
() автор топика
Ответ на: комментарий от sunjob

Спасибо, теперь причина ясна. GOMOD=/dev/null означает, что Go не нашел go.mod в текущем каталоге или выше. Кроме того, Go 1.16.5 для этой версии gswitch слишком старый: проект требует Go 1.25.5.

Установите актуальный Go, перейдите в корень клонированного репозитория и проверьте, что go env GOMOD показывает путь к gswitch/go.mod. После этого команда сборки будет такой:

go build -o builds/gswitch ./cmd/gswitch

arumata
() автор топика
Ответ на: комментарий от petav

Спасибо за проверку. Это не ошибка установки пакета, а несовместимость текущего tray backend с Awesome. gswitch-tray регистрирует значок по протоколу StatusNotifierItem, а встроенный systray Awesome использует XEmbed и не предоставляет org.kde.StatusNotifierWatcher. Сообщение в логе как раз об этом.

Демон от трея не зависит. Если захотите проверить саму конверсию, после повторной установки включите его:

systemctl --user enable --now gswitch.service

Проверить состояние можно так:

systemctl --user status gswitch.service --no-pager

Настроить gswitch без трея можно через sudo gswitch -c. Для значка под Awesome нужен отдельный StatusNotifier host или мост SNI -> XEmbed. Такой вариант с gswitch пока не проверен. Совместимость с Awesome записал как отдельное ограничение.

arumata
() автор топика
Ответ на: комментарий от vadiml

Не наследник и не форк. gswitch написан отдельно и решает более узкую задачу: по явному нажатию исправляет последнее слово, всю строку или выделенный текст. Автоматического режима сейчас нет.

arumata
() автор топика
Ответ на: комментарий от arumata

Я прогнал на v0.6.6 точную последовательность: зажал один Shift, дважды нажал второй, затем отпустил первый.

Да, так работает, тогда не буду пока баг репорт писать, может последовательность другая была.

GladAlex ★★★★★
()

Господа линуксоиды с командной строкой на подкорке до сих пор смотрят на кнопки??!🫨

lomaster
()

Это ж сколько приседаний вместо того чтобы освоить уже слепую печать и видеть что ты набираешь вместо тупого созерцания клавиатуры.

zabbal ★★★☆☆
()

Эх, вот если б он ещё сам переключал русский/английский, а не клавишу генерил… Подозреваю, с loloswitcher-ом не сработается, да и вообще, чего ему отвечать на вопрос о клавише? У меня левый Ctrl — английский, правый — русский.

fat-II
()
Ответ на: комментарий от Loki13

Людям, много работающим за компом, было бы не дурно освоить слепой метод печати. Тогда указанные проблемы уйдут сами собой.

bbc69
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.