Обработка текста буфера обмена через скрипт между копированием и вставкой

Я хочу перехватить событие вставки и запустить любой текст через мой скрипт. Пример использования такой (предположим, что у меня есть скрипт где-то, который принимает текст на stdin и превращает «мир» в «картофель», записывая на stdout).

  1. Выделите текст «привет мир!». с курсором
  2. Среднее мышь, чтобы вставить из буфера выбора, и «hello potato!» появляется

Не должно быть ручного шага между 1 и 2 , т. Е. Я хочу привязать к событию вставки (или, возможно, к событию копирования), чтобы текст обрабатывался автоматически. У меня нет ничего злонамеренного; это просто автоматическое форматирование некоторого исходного кода при копировании / вставке из / в Интернет.

Мой вопрос касается буфера выбора (буфер обмена среднего мыши), но я думаю, что вопрос относится и к другому тексту сообщения в целом.

    Вы можете использовать следующую функцию Bash. Скопируйте его в ~/.bashrc и ~/.bashrc его как . ~/.bashrc . ~/.bashrc с терминала.

     cngstr(){ echo `xclip -o` | sed -e "s#$1#$2#g" | xclip } 

    Применение

    • Выделите любой текст, выбрав его мышью. Как обычно, выделенный текст можно вставить с помощью мыши.
    • Запуск в терминале:

       $ cngstr "string" "replacement" 
    • Затем, когда вы вставляете, используя средний клик мыши, слово (и) «строка» в вашем выборе будет заменено «заменой».

    пример

    Скажите, что ваш выбор – «привет мир!». Затем вы запустите терминал,

     cngstr world potato 

    Используйте "" для строки, состоящей из нескольких слов . Затем, когда вы вставляете, используя средний клип мыши, «hello potato!» будет появляться. Смотрите скриншоты.

    Введите описание изображения здесь

    Как это работает

    1. xclip -o выводит выделение на стандартный вывод, который передается в sed здесь.
    2. Следующий sed заменяет строки, принимающие входные данные от пользователя.
    3. Наконец, измененное содержимое передается в xclip который помещает его в основной выбор и становится доступным для вставки средним щелчком мыши.

    Я думаю, что xclip поставляется с дистрибутивом Ubuntu по умолчанию. В противном случае установите его через apt-get :

     sudo apt-get install xclip 

    Дополнительная информация

    Сделайте измененное содержимое доступным для буфера обмена

    Если вы хотите, чтобы измененное содержимое также было доступно в буфер обмена, так что Ctrl + V также работает, добавьте следующую строку в вышеупомянутый скрипт.

     echo `xclip -o` | xclip -selection c 

    Вышеприведенная строка передает содержимое первичного выделения в буфер обмена. Измененная функция будет выглядеть так:

     cngstr(){ echo `xclip -o` | sed -e "s#$1#$2#g" | xclip echo `xclip -o` | xclip -selection c } 

    Функция Bash, которая может изменять содержимое буфера обмена (т. Е. Скопировать с помощью Ctrl + C или из контекстного меню) и сделать измененную строку доступной как для первичного выделения, так и для буфера обмена.

     cngstr1(){ echo `xclip -o -selection c` | sed -e "s#$1#$2#g" | xclip echo `xclip -o` | xclip -selection c } 

    xclip -o по умолчанию печатает содержимое основного выделения. Используйте -selection c для печати содержимого буфера обмена. Подробнее см. man xclip .


    Вы можете комбинировать эти две функции в скрипте, используя случай переключения,

     #!/bin/sh string="$2" replacement="$3" cngstr(){ echo `xclip -o` | sed -e "s#$1#$2#g" | xclip echo `xclip -o` | xclip -selection c } cngstr1(){ echo `xclip -o -selection c` | sed -e "s#$1#$2#g" | xclip echo `xclip -o` | xclip -selection c } if [ $# -lt 2 ] then echo "Usage : $0 [c|p] \"string\" \"replacement\" " exit fi case "$1" in c) cngstr1 "$string" "$replacement" ;; p) cngstr "$string" "$replacement" ;; *) echo "Usage : $0 [c|p] \"string\" \"replacement\" " ;; esac 

    Применение

     ./script.sh [c|p] "string" "replacement" 
    • Используйте параметр c для изменения содержимого, скопированного с помощью буфера обмена, т.е. содержимого, скопированного с помощью Ctrl + C или из меню правой кнопки мыши.

    • Используйте параметр p для изменения содержимого, скопированного с использованием первичного выбора.