Исправление текста, напечатанного в другой раскладке

Дмитрий Корнев
4 декабря 2020

Под Linux мне не попадалось хорошей программы, чтобы исправлять набранное не в той раскладке. Они были либо глючными, либо какими-то сомнительными. Нашёл решение, как это делать при помощи простого bash-скрипта.

Идея отсюда. Но у меня скрипты получились немного проще.

Исправление выделенного текста:

#!/bin/bash
xdotool key Ctrl+Insert
sleep 0.1s
xsel | sed "y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.\/<>?@#\$^&\`~фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбюБЮ№ёЁ/фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбю.БЮ,\"№;:?ёЁabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.<>#\`~/" | xsel -b -i
sleep 0.1s
xdotool key Shift+Insert
sleep 0.1s
xdotool key Shift+Alt

Исправление последнего слова, либо всей строки, если в ней нет пробелов:

#!/bin/bash
xsel --clear
sleep 0.1s
xdotool key Shift+Ctrl+Left
sleep 0.1s
xdotool key Ctrl+Insert
sleep 0.1s
xsel | sed "y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.\/<>?@#\$^&\`~фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбюБЮ№ёЁ/фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбю.БЮ,\"№;:?ёЁabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.<>#\`~/" | xsel -b -i
sleep 0.1s
xdotool key Shift+Insert
sleep 0.1s
xdotool key Shift+Alt

Чтобы это работало нужны утилиты:

sudo apt install xdotool xsel

Утилита xdotool нажимает нужные кнопки, по коду видно, что происходит. В конце осуществляется ещё и переключение раскладки — Shift+Alt. Едиственное неудобство заключается в том, что приходится использовать буфер обмена, где может находиться, что-то нужное в этот момент.

Каждый приведенный код записывается в отдельный sh-файл. Файлам даются права на выполнение. Далее прописываем выполнение этих файлов по каким-нибудь удобным для себя комбинациям клавиш.

В Elementary OS это делается здесь:

Запуск скриптов в Elementary OS по комбинациям клавиш

В Ubuntu (Gnome) здесь:

Запуск скриптов в Ubuntu по комбинациям клавиш

6 комментариев

Вл
Xswitcher не? https://habr.com/ru/post/495748/
Спасибо, я видел эту публикацию. Меня смущает, что там надо запускать с правами root. Здесь же с bash-скриптом простейший вариант, никакого риска.
Ал
Заработало только после модификации: - добавил опцию в первую команду "xdotool key --clearmodifiers ctrl+Insert". Это понятно - скрипт запускаю нажатием Shift+Break, вот этот Shift нажатый мешал; - добавил опцию во вторую команду "xsel -o | sed "y/.....". Без -o никак. Переключение раскладки не работает ни в каком виде, даже просто из консоли "xdotool key Shift+Ctrl"
Ka
> Едиственное неудобство заключается в том, что приходится использовать буфер обмена, где может находиться, что-то нужное в этот момент. Чтобы это обойти можно заранее копировать то что сейчас в буфере, после вставки, возвращать скопированное обратно: ``` # save original buffer orig_bufer=$(xsel --clipboard --output) # to buffer and insert printf %s "$forconvert" | xsel --clipboard --input xdotool key Shift+Insert # Return original bufer back printf %s "$orig_bufer" | xsel --clipboard --input ```
Спасибо!
ВЕ
Переделал под wayland. xdotool и xsel заменил на ydotool и wl-clipboard, соответственно. Ну, и объединил скрипты. ``` #!/usr/bin/env bash function sendkeys() { key_press='' for key in $(echo $* | tr " " "\n") do key_press+="${key}:1 " done key_release=${key_press//:1/:0} ydotool key $key_press $key_release } ORIG_CB=$(wl-paste) #Коды клавиш. Можно посмотреть в /usr/include/linux/input-event-codes.h LCTRL=29 LSHIFT=42 INS=110 CAPS=58 LEFT=105 RIGHT=106 SWL_KEYS="$CAPS" #Сочетание переключения раскладки COPY_KEYS="$LCTRL $INS" PASTE_KEYS="$LSHIFT $INS" RUS="йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪ\/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё\"№;:?" ENG="qwertyuiop[]asdfghjkl;'zxcvbnm,.\/\`QWERTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?~@#$^&" if [ "$1" == "--last" ]; then sendkeys $LCTRL $LSHIFT $LEFT fi sendkeys $COPY_KEYS wl-paste --no-newline | sed "y/$RUS$ENG/$ENG$RUS/"| wl-copy sendkeys $PASTE_KEYS wl-copy $ORIG_CB sendkeys $SWL_KEYS ```