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

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

  1. Выделите текст "Привет, мир!" с курсором
  2. Щелчок средней кнопкой мыши для вставки из буфера выбора и «привет картошка!» появляется

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

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

6
задан 12 January 2017 в 20:21

2 ответа

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

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

Использование

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

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

Пример

Скажите, что Ваш выбор является "привет миром!". Затем Вы работаете в терминале,

cngstr world potato

Использовать "" для строки, состоящей больше чем из одного слова. Затем, когда Вы вставляете использование клипа середины мыши, "привет картофель!" появится. См. снимки экрана.

Enter image description here

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

  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"
  • Опция Use c для изменения содержания скопировал использование буфера обмена, т.е. содержание скопировало использование Ctrl+C или из меню правой кнопки.

  • Опция Use p для изменения содержания скопировал использование основного выбора.

4
ответ дан 12 January 2017 в 20:21

Вы можете использовать clipnotify, чтобы получать уведомления об изменениях в буфере обмена без опроса. Со страницы проекта:

while clipnotify; do
    [an event happened, do something with the selection]
done

Инструмент представляет собой всего несколько строк кода C, использующего функциональность XFIXES.

4
ответ дан 4 May 2020 в 01:01

Другие вопросы по тегам:

Похожие вопросы: