Pull to refresh

Работа с буфером обмена в Linux: теория и практика

Reading time 5 min
Views 110K

Совсем немного теории


Copy and PasteИсторически сложилось так, что в X Window System (X11, — оконная система для Linux, UNIX) существует два буфера обмена.

Один из них (clipboard) похож на буфер обмена в Windows — при нажатии на Ctrl+Insert или Ctrl+C выделенный фрагмент (текст, картинка, файл) копируется в буфер обмена, а при нажатии на Shift+Insert (или Ctrl+V) — вставляется из него. Следует заметить, что во многих программах эти сочетания зарезервированы для иных целей и приходится пользоваться другими — например, в терминале сочетание Ctrl+C используется для завершения процесса, а для работы с буфером обмена используются сочетания Ctrl+Shift+C для копирования и Ctrl+Shift+V для вставки.

Второй буфер (primary) является специфичным для оконной системы X11. Выделенный текст незамедлительно попадает в буфер primary, и для того, чтобы вставить скопированный текст, достаточно лишь нажать среднюю кнопку мышки (колёсико). У кого в наличии не имеется трёхкнопочной мышки, а так же владельцам ноутбуков с тачпадами следует одновременно нажать левую и правую кнопки мышки для вставки текста.

Обычно эти буферы не связаны друг с другом (некоторые программы некорректно их обрабатывают и считают, что это один и тот же буфер обмена). Следовательно, хранящиеся в них данные не влияют друг на друга, что, несомненно, крайне удобно. Следует заметить, что при закрытии программы, из которой были скопированы данные, содержимое буфера обмена теряется.


Практика


Для решения проблемы утери данных из буфера обмена при закрытии программы существует сторонний софт. Например, Clipboard Daemon. Этот маленький демон держит содержимое буфера обмена в памяти независимо от того, было ли закрыто приложение, из которого скопированы данные.

Для более комфортной работы с буфером обмена существует целый ряд программ:
  • Parcellite — многообещаюший менеджер буфера обмена на GTK
  • glipper — для Gnome
  • klipper — для KDE
  • wmcliphist — для Window Maker
  • и куча других (в том числе для Windows, Mac OS и прочего).
Эти программы позволяют существенно облегчить работу — они хранят историю содержимого буферов обмена — в любой момент можно вернуться к любому из предыдущих состояний (в пределах разумного, конечно, — этот предел, как водится, устанавливается в настройках) и воспользоваться им =)

Существует так же весьма и весьма полезная в умелых руках утилита под названием xclip, предназначенная для работы с буферами обмена из командной строки. Копирование и вставка текста осуществляется простыми командами, что позволяет использовать её в различного рода вспомогательных скриптах, примеры которых я продемонстрирую ниже.

К сожалению, официальная версия xclip у меня с кириллицей корректно не заработала, несмотря на то, что я собирал последнюю версию. Поэтому я предлагаю скачать и собрать версию xclip для дистрибутива Alt Linux.


Скрипты


Я предлагаю два скрипта, которые смогут облегчить вашу повседневную работу. Первый скрипт:
xclip -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "http://www.google.ru/search?hl=ru&q=" $1}' | xargs firefox -new-tab
Он открывает вкладку в Firefox, переходит на страничку google с поисковой фразой, являющейся содержимым вашего буфера обмена. Для работы со скриптом достаточно выделить любое слово, словосочетание или предложение и запустить скрипт (я рекомендую назначить выполнение этого скрипта на горячие клавиши — например, у меня это сочетание Win+G). Рассмотрим его чуть подробнее:
  1. Программа xclip выводит содержимое буфера обмена (параметр «-o»).
  2. Далее это содержимое передаётся текстовому редактору sed, который удаляет все строки, кроме первой (в случае, если они были) и заменяет все специальные символы на их безопасный для адресной строки вариант (urlencode).
  3. Обработанная строка передаётся программе awk, которая, в свою очередь, добавляет полученную поисковую фразу к ссылке google.
  4. Ссылка открывается в новой вкладке Firefox. Всё =)
Второй скрипт чуть проще, и логически следует из первого:
xclip -o | sed -n 1p | xargs firefox -new-tab
Он открывает новую вкладку в Firefox с адресом, который находится в буфере обмена (очень часто нужно открыть ссылку в виде простого текста — например, если ссылка встретилась в текстовом редакторе — приходится её копировать, открывать вкладку в браузере и вставлять скопированный адрес. Скрипт делает всё за вас ;). Я назначил его на сочетание Win+F.

Благодаря тому, что буфер обмена является универсальной для ОС сущностью, эти скрипты будет работать везде — от терминала и текстового редактора до самого Firefox'а (впрочем, желающие могут настроить этот же скрипт и для альтернативных браузеров. Назначить скриптам сочетание кнопок можно как с помощью вашего windows manager'а (например, gconf-editor для Gnome), так и с помощью сторонних программ, таких как xmodmap или actkbd.


Что дальше?


Да что угодно =) Можно переводить фразы, выделенные мышкой, можно копировать их в программу для заметок — всё зависит от вашей фантазии и потребностей. Конечно, для таких вещей могут существовать отдельные программы, но такие вот самописные скрипты, на мой взгляд, для любого пользователя окажутся удобнее всего — linux тем и хорош, что можно всё, абсолютно всё настроить под себя и для себя.


Update: добавлена ссылка на менеджер буфера обмена Parcellite — спасибо хабрапользователю drujebober

Update 2: по просьбе хабраюзера dimaka добавил скрипты для перевода:

Lingvo.yandex.ru:
xclip -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "lingvo.yandex.ru/en?st_translate=on&text=" $1}' | xargs firefox -new-tab

Google translate (перевод с английского на русский):
xclip -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "translate.google.com/translate_t?hl=ru#en|ru|" $1}' | xargs firefox -new-tab

Update 3: Добавление пункта «копировать полный путь текущего файла» в меню Midnight Commander (Добавить в файл ~/.mc/menu):
+ ! t t<br>f Copy full filename into clipboard<br>echo -n %d/%f | xclip


_________
Текст подготовлен в редакторе VIM ;)
Tags:
Hubs:
+88
Comments 99
Comments Comments 99

Articles