+0 000-000-00-00

Замена 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 в некоторых приложениях.

 

    Опубликовано

    Menu