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

