Обработка текста буфера обмена через скрипт между копированием и вставкой
Я хочу перехватить событие вставки и пропустить любой текст через мой скрипт. Пример использования подобен этому (предположим, у меня где-то есть скрипт, который принимает текст на stdin и превращает "world" в "potato", записывая на stdout).
- Выделите текст "Привет, мир!" с курсором
- Щелчок средней кнопкой мыши для вставки из буфера выбора и "привет, картошка!" появляется
Между 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
использование ""для строки, состоящей из более чем одного слова. Далее, когда вы вставляете, используя средний клип мыши, "привет картошка!" будет появляться. Смотрите скриншоты.

Как это устроено
xclip -oпечатает выделение на стандартный вывод, который передаетсяsedВот.- следующий
sedзаменяет строки, принимая данные от пользователя. - Наконец измененное содержимое передается
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для изменения содержимого, скопированного с использованием первичного выбора.