Обработка текста буфера обмена через скрипт между копированием и вставкой
Я хочу перехватить событие вставки и пропустить любой текст через мой скрипт. Пример использования подобен этому (предположим, у меня где-то есть скрипт, который принимает текст на 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
для изменения содержимого, скопированного с использованием первичного выбора.