Я хочу перехватить событие вставки и пропустить любой текст через мой скрипт. Пример использования подобен этому (предположим, у меня где-то есть скрипт, который принимает текст на stdin и превращает «world» в «potato», пишущий на stdout).
Между 1 и 2 не должно быть ручного шага , т.е. я хочу перехватить событие вставки (или, возможно, событие копирования), чтобы текст обрабатывался автоматически. Я не имею в виду ничего плохого; это просто автоматическое форматирование исходного кода при копировании / вставке из / в Интернет.
Мой вопрос касается буфера выделения (буфер обмена средней кнопкой мыши), но я думаю, что вопрос в целом относится и к другому тексту буфера обмена.
Можно использовать следующую функцию 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"
Опция Use c
для изменения содержания скопировал использование буфера обмена, т.е. содержание скопировало использование Ctrl+C или из меню правой кнопки.
Опция Use p
для изменения содержания скопировал использование основного выбора.
Вы можете использовать clipnotify
, чтобы получать уведомления об изменениях в буфере обмена без опроса. Со страницы проекта:
while clipnotify; do
[an event happened, do something with the selection]
done
Инструмент представляет собой всего несколько строк кода C, использующего функциональность XFIXES.