Скрипт для автоматического переключения раскладки клавиатуры - Линукс.

На виндовых машинах у меня Punto Switcher - удобная переключалка раскладки, которая исправляет последний ввод. Очень удобно, а к удобному быстро привыкаешь. Для Линукса раньше был xNeur, Easy Switcher - всё это перестало работать, что-то ещё пробовал, в общем ничего не нашёл, что бы просто работало. Написал маленький скрипт, который делает ровно две вещи: меняет раскладку слова слева от курсора по горячей клавише или меняет раскладу выделенного фрагмента. Например набрал ghbdtn, нажал кнопку - получил привет. Если набрать gjcktlbq ghbdtn и нажать хоткей, то получится gjcktlybq привет - исправилось только последнее слово. Что бы исправить всё нужно выделить оба слова и нажать хоткей - будет последний привет. Издаёт звук и показывает в середине экрана подключенную раскладку. Всё, больше ничего не умеет. И да, не работает в консоли и в некоторых приложениях.

У меня Kubuntu Linux, думаю что можно напрямую использовать с любым дебианоподобным. В системе у меня два языка - русский и латышский, но скрипт заменяет только русский <--> английский он не видит на каком языке там что вводили. Конечно же будет отлично работать в системах где русский и английский язык - самый распространённый вариант.

Теперь важное: этот скрипт работает только с X11, с Weyland не работает! Проверить можно набрав в терминале:

echo $XDG_SESSION_TYPE

Если ответ X11 - читаем дальше, если нет - проходим мимо. Что ещё, для нормальной работы нужно проверить наличие в системе пакетов python3, xsel и xdotool, проверить их наличие в системе можно выполнив в терминале команду:

which xsel xdotool python3

Должно показать путь до исполняемого файла, ну или можно посмотреть версию, команды будут такими:

xsel --version
xdotool --version
python3 --version

В ответ должно показывать версию установленного пакета. Если их в системе нет, то нужно поставить:

sudo apt update && sudo apt install -y xsel xdotool python3

 Теперь нужно сделать в директории, в которой лежат скрипты (у меня /home/sergey/scripts/), файл скрипта layout-fix и положить в него вот такое содержимое:

#!/bin/bash
# ============================================================
# Исправление ошибочной русской/английской раскладки
# Kubuntu / Linux + xdotool + xsel
#
# Примеры:
#   ;jgf       -> жопа
#   жопа       -> ;jgf
#   ghbdtn     -> привет
#   привет     -> ghbdtn
# ============================================================
#
# ------------------------------------------------------------
# Функция для имитации нажатий
# ------------------------------------------------------------
press()
{
    xdotool key --clearmodifiers "$1"
    sleep 0.02
}
# ------------------------------------------------------------
# 1. Выделяем последнее слово
# ------------------------------------------------------------
press "Ctrl+Shift+Left"
# ------------------------------------------------------------
# 2. Расширяем выделение влево, пока не дойдём до пробела
# ------------------------------------------------------------
while true; do
    text=$(xsel -o 2>/dev/null)
    # Если выделение начинается с пробела/табуляции/переноса —
    # убираем этот пробел из выделения и заканчиваем
    first="${text:0:1}"
    if [[ "$first" =~ [[:space:]] ]]; then
        press "Shift+Right"
        break
    fi
    # Расширяем выделение ещё на один символ влево
    press "Shift+Left"
    # Защита от начала текста
    new_text=$(xsel -o 2>/dev/null)
    if [ "$new_text" = "$text" ]; then
        break
    fi
done
# ------------------------------------------------------------
# 3. Получаем выделенное слово
# ------------------------------------------------------------
text=$(xsel -o 2>/dev/null)
[ -z "$text" ] && exit 0
# ------------------------------------------------------------
# 4. Меняем раскладку символ-в-символ
# Таблица соответствует физическим клавишам стандартной
# русской раскладки Linux.
# Английская -> Русская
# Русская    -> Английская
# ------------------------------------------------------------
fixed=$(TEXT="$text" python3 -c '
import os
import sys
# ------------------------------------------------------------
# Соответствие физических клавиш английской и русской
# раскладок.
# ------------------------------------------------------------
pairs = [
    # Цифровой ряд
    ("`", "ё"),
    ("1", "1"),
    ("2", "2"),
    ("3", "3"),
    ("4", "4"),
    ("5", "5"),
    ("6", "6"),
    ("7", "7"),
    ("8", "8"),
    ("9", "9"),
    ("0", "0"),
    ("-", "-"),
    ("=", "="),
    # Верхний ряд
    ("q", "й"),
    ("w", "ц"),
    ("e", "у"),
    ("r", "к"),
    ("t", "е"),
    ("y", "н"),
    ("u", "г"),
    ("i", "ш"),
    ("o", "щ"),
    ("p", "з"),
    ("[", "х"),
    ("]", "ъ"),
    # Средний ряд
    ("a", "ф"),
    ("s", "ы"),
    ("d", "в"),
    ("f", "а"),
    ("g", "п"),
    ("h", "р"),
    ("j", "о"),
    ("k", "л"),
    ("l", "д"),
    (";", "ж"),
    ("'\''", "э"),
    # Нижний ряд
    ("z", "я"),
    ("x", "ч"),
    ("c", "с"),
    ("v", "м"),
    ("b", "и"),
    ("n", "т"),
    ("m", "ь"),
    (",", "б"),
    (".", "ю"),
    ("/", "."),
    # --------------------------------------------------------
    # Shift + цифровой ряд
    # --------------------------------------------------------
    ("~", "Ё"),
    ("!", "!"),
    ("@", "\""),
    ("#", "№"),
    ("$", ";"),
    ("%", "%"),
    ("^", ":"),
    ("&", "?"),
    ("*", "*"),
    ("(", "("),
    (")", ")"),
    ("_", "_"),
    ("+", "+"),
    # --------------------------------------------------------
    # Shift + верхний буквенный ряд
    # --------------------------------------------------------
    ("Q", "Й"),
    ("W", "Ц"),
    ("E", "У"),
    ("R", "К"),
    ("T", "Е"),
    ("Y", "Н"),
    ("U", "Г"),
    ("I", "Ш"),
    ("O", "Щ"),
    ("P", "З"),
    ("{", "Х"),
    ("}", "Ъ"),
    # --------------------------------------------------------
    # Shift + средний ряд
    # --------------------------------------------------------
    ("A", "Ф"),
    ("S", "Ы"),
    ("D", "В"),
    ("F", "А"),
    ("G", "П"),
    ("H", "Р"),
    ("J", "О"),
    ("K", "Л"),
    ("L", "Д"),
    (":", "Ж"),
    ("\"", "Э"),
    # --------------------------------------------------------
    # Shift + нижний ряд
    # --------------------------------------------------------
    ("Z", "Я"),
    ("X", "Ч"),
    ("C", "С"),
    ("V", "М"),
    ("B", "И"),
    ("N", "Т"),
    ("M", "Ь"),
    ("<", "Б"),
    (">", "Ю"),
    ("?", ","),
]
# ------------------------------------------------------------
# Создаём две таблицы:
# English -> Russian
# Russian -> English
# ------------------------------------------------------------
en_to_ru = dict(pairs)
ru_to_en = {ru: en for en, ru in pairs}
# ------------------------------------------------------------
# Определяем направление преобразования.
# Если в тексте есть русские буквы — считаем, что ошибочно
# включена русская раскладка и переводим в английскую.
# Если русских букв нет — переводим английскую раскладку
# в русскую.
# ------------------------------------------------------------
text = os.environ.get("TEXT", "")
has_russian = any(
    ("\u0400" <= c <= "\u04FF")
    for c in text
)
if has_russian:
    mapping = ru_to_en
else:
    mapping = en_to_ru
# ------------------------------------------------------------
# Преобразуем каждый символ.
# Символы, которых нет в таблице, оставляем без изменения.
# ------------------------------------------------------------
result = "".join(mapping.get(c, c) for c in text)
print(result, end="")
')
# ------------------------------------------------------------
# 5. Удаляем выделенное
# ------------------------------------------------------------
press "Delete"
# ------------------------------------------------------------
# 6. Вставляем исправленный текст
# ------------------------------------------------------------
echo -n "$fixed" | xsel -ib
press "Ctrl+V"
# ------------------------------------------------------------
# 7. Звук: если нет такого файла, то поискать в /usr/share/sounds
# ------------------------------------------------------------
paplay /usr/share/sounds/sound-icons/chord-7.wav 2>/dev/null &
# ------------------------------------------------------------
# 8. Индикатор и переключение раскладки
# ------------------------------------------------------------
xdotool key --clearmodifiers Scroll_Lock

И сделать его исполняемым, соответственно с путём к директории в вашей ситеме:

sudo chmod +x /home/sergey/scripts/layout-fix

Всё подготовительная работа закончена. Теперь нужно назначить, кроме стандартной комбинации, хоткей, переключающий раскладку одной кнопкой, для этого в настройках системы выбираем Устройства ввода-->Клавиатура-->Раскладки и ставим альтернативную комбинацию ScrollLock - по этой комбинации будет меняться раскладка, со стандартным хоткеем из двух клавиш у меня глючило. Не забываем Применить!

lf1

Ну и последнее, нужно назначить PauseBreak клавишей исправляющей раскладку, как в Пунто, для этого в настройках системы идём в Комбинации клавиш-->Команды-->Добавить команду... и в открывшемся окне вставить путь к скрипту, у меня /home/sergey/scripts/layout-fix и нажать Добавить, нажать кнопку Назначить свою комбинацию и нажать PauseBreak для выбора, Применить - и всё сразу заработает.