Замена xneur для новых версий линукс
В связи с прекращением поддержки новых версий ubuntu клавиатурным менеджером xneur, он был заменен на 2 других скрипта
1. Замена сокращений (и много другое, чего не было в xneur) - Espanso
Установка описана тут
2. Конвертация последнего слова или фразы в другую раскладку - Easy Switcher (обсуждение на форуме)
Изменение раскладки выделенного текста
Эту задачу можно решить 2 способами.
1. Триггер в Espanso
- trigger: ":sw"
replace: "{{output}}"
vars:
- name: clipboard
type: clipboard
- name: output
type: shell
params:
cmd: |
echo "{{clipboard}}" | sed "y/qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,/йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?/"
Как это работает:
- Вы выделяете текст (мышкой или клавишами).
- Нажимаете Ctrl+C (копируете).
- Печатаете триггер :sw (от switch).
- Espanso подставляет на место триггера текст из буфера, уже сконвертированный в другую раскладку.
Нет конфликтов с физическими клавишами: Espanso срабатывает после ввода текстового триггера, а не по «горячей клавише», поэтому система не «глючит» от одновременных нажатий.
Надежность: Espanso сам следит за тем, чтобы текст вставился целиком, не теряя первые символы.
Кросс-платформенность: Если вы перенесете конфиг на другой компьютер, он будет работать так же.
Можно ли сделать это «в одно нажатие»?
К сожалению, Espanso — это расширитель текстовых сокращений, а не глобальный обработчик горячих клавиш. Он не умеет сам нажимать Ctrl+C за вас.
Алгоритм всегда будет таким:
- Выделили.
- Ctrl+C.
- Ввели :sw.
2. Простой скрипт на python
Чтобы сделать это без использования буфера обмена и решить проблему со скоростью (когда вставка не успевает за копированием), нужно использовать механизм X11 Primary Selection (это то, что попадает в память системы сразу при выделении мышкой, без нажатия Ctrl+C).
Решение через "Primary Selection" (без затирания буфера)
Этот скрипт берет текст напрямую из выделения, конвертирует его и «печатает» вместо выделенного текста, не трогая ваш буфер обмена (то, что вы копировали через Ctrl+C).
Установите зависимости (если еще нет):
sudo apt install xkblayout-state xdotool xclip
Создайте скрипт ~/Programs/switcher.py:
import subprocess
import time
def get_selected_text():
# Берем текст напрямую из выделения (не из буфера обмена!)
try:
return subprocess.check_output(['xclip', '-o', '-selection', 'primary'], encoding='utf-8')
except:
return ""
def switch_layout():
text = get_selected_text()
if not text:
return
en_chars = "qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?@#$^&"
ru_chars = "йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,\"№;:?"
# Создаем таблицу перевода в обе стороны
to_ru = str.maketrans(en_chars, ru_chars)
to_en = str.maketrans(ru_chars, en_chars)
# Определяем, в какую сторону переводить (по первому найденному символу)
first_char = next((c for c in text if c in en_chars or c in ru_chars), None)
if not first_char:
return
converted = text.translate(to_ru) if first_char in en_chars else text.translate(to_en)
# 1. Удаляем выделенный текст
subprocess.run(['xdotool', 'key', 'BackSpace'])
# 2. Печатаем новый текст напрямую (очень быстро)
# Используем --clearmodifiers, чтобы зажатые клавиши (типа Alt) не мешали
subprocess.run(['xdotool', 'type', '--clearmodifiers', converted])
# 3. Опционально: переключаем раскладку в системе
subprocess.run(['xdotool', 'key', 'alt+shift']) # Замените на ваш хоткей
if __name__ == "__main__":
switch_layout()
В чем преимущества этого метода:
- Ваш буфер (Ctrl+C) остается нетронутым.
- Мгновенная работа: xdotool type имитирует ввод текста, что надежнее вставки из буфера.
- Не нужно ждать: Мы не ждем, пока сработает системное копирование.
Как это использовать в Linux Mint:
- chmod +x ~/Programs/switcher.sh
- Зайдите в Параметры -> Клавиатура -> Комбинации клавиш.
- Добавьте «Дополнительную команду».
- Команда: python3 ~/Programs/switch_fast.py
- Назначьте на клавишу (например, Shift-ScrollLock).
Важно: Чтобы этот скрипт работал, текст должен быть выделен мышкой. Если вы выделили текст клавиатурой (Shift + стрелки), он может не попасть в primary selection в некоторых приложениях.
Опубликовано