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

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

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

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

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

1 ответ

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

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

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

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

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

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

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

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

пример

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

cngstr world 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 для изменения содержимого, скопированного с использованием первичного выбора.

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