Пользователь
0,0
рейтинг
12 января 2009 в 23:40

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

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


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 ;)
Владимир @Dreadatour
карма
146,3
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (99)

  • +2
    Спасибо, не знал
    • 0
      это фактически первоисточник ;)
  • +1
    картинко оскорбляет девушек? ;)
    • +5
      двум моим знакомым близняшкам эта картинка очень нравится =)
      • 0
        А есть full resolution? )
  • +2
    Программирование на bash… Чччерт, как это легко читается =))
    • +2
      и пишется так же просто =)
      в этом его прелесть =)
    • +1
      это sed :) шелл здесь исключительно как пускалка для седа.
      • 0
        Ну здесь не только sed ;) Хотя в первом примере он самый грозный =D
        А шелл нужен хотя бы для связи всего этого хозяйства через pipe =)
      • +1
        Сидел, изучал синтаксис и разбирал команду в примере. Осилил, понравилось. :)

        Комментариев бы туда запихнуть, пол-страницы кода получилось бы… Но как?
        • +1
          sed'у можно передовать команды из файла, вот там коменты и оставляйте
        • +1
          Туда бы не комментарии, а выделить эти команды в отдельный скрипт типа urlencode или, ещё лучше, найти существующий анлог
  • +1
    Полезно. Жаль что со сложными объектами буфер обмена в Linux не очень хорошо работал (не знаю как сейчас), по крайней мере у меня было не все гладко.
    • 0
      у меня не было проблем… наверное я просто не копирую сложные объекты =)

      кстати, xclip умеет копировать и файлы — в пакете есть пара скриптов для этого.
    • +1
      есть такая беда (незнаю кто виноват) — копируем изображение (наприер в FF) а в GIMP выбираем «вставить» и всё :) GIMP умирает
      • 0
        Только что попробовал — работает. Ubuntu 8.10. Что я делаю неправильно?
        • 0
          Было с оперой и гимпом такое, подтверждаю. Но какое-то время назад всё устаканилось.
        • 0
          ступил, делал не из ФФ а скриншот и выбирал там не сохранить в файл а скопировать в буфер, гимп умирал
      • 0
        У меня спокойно и с FF и с Opera и с OOo вставляются изображения в GIMP… Что я делаю не так?
  • +4
    предлагаю заменить(ну или добавить) glipper на parcellite потому как первое по моему уже умерло, а parcellite довольно активно развивается, может работать как демон и поддерживает действия с буфером обмена, вообщем всем рекомендую.
    • +1
      с удовольствием добавлю =)
      спасибо за ссылку! давно ищу менеджер буфера обмена для awesome (этот WM я использую) — чтобы висел демон в памяти, и средствами awesome обрабатывалась история. авось с parcellite у меня получится это сделать =)
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Мне кажется, что целесообразность использования таких программ зависит от человека и его привычек, а не от WM =)
          Лично мне так удобнее работать =)
          • НЛО прилетело и опубликовало эту надпись здесь
    • +2
      О, спасибо за parcellite, не знал про него (видел только дохлый glipper и активно пользуюсь klipper`ом). Интересный проект, надеюсь что скоро обгонят по функциональности klipper (пока же уступают в двух важных мне вещах — история только до 100, а не до 2048 и нет удобного поиска по истории) и мне удасться избавиться на своём дектопе от последней KDEшной программы.
      • 0
        ну у меня таких требований не было, единственное что для меня было критично так это синхронизация выделения мышью и буфера обмена, а эту фичу как раз в свн версии реализовали, поэтому без сожаления снёс klipper.
        а на счет твоих пожеланий — советую написать реквест
        • 0
          > ну у меня таких требований не было,

          А любопытно — как можно пользоваться историей даже в 100 едениц без удобного поиска по оной?

          > а на счет твоих пожеланий — советую написать реквест

          Я так и сделал.

          А, кстати, не в курсе ли программы, аналогичной этим клипперам, но хранящим (вечно, а не пока не затёрлось) не просто историю, но некие сниппеты, категоризированные, с удобным доступом к оным?
  • +5
    >У кого в наличии не имеется трёхкнопочной мышки, а так же владельцам ноутбуков с тачпадами следует одновременно нажать левую и правую кнопки мышки для выставки текста.
    Только, если включена эмуляция средней клавиши мыши.
    • +1
      Совершенно верно.
      А ещё на некоторых мышках (например, на Logitech VX Nano) роль средней кнопки выполняет кнопка «Search», которая находится перед колёсиком.

      Собственно, всё можно настроить как угодно — это же Его Величество Линукс =)))
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Ммм… Возможно я ошибаюсь — у меня она стёрта давно =) Главное, что она работает :D
          • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        У меня тоже ета мышка, но у меня она работает как сдедняка кнопка. Хотя линза для поиска там была.
  • +1
    В FreeBSD:
    xclip нужно устанавливать из порта.
    Конструкция: «xargs firefox -new-tab» не работает.
    Буфер обмена есть и в текстовой консоли и работает выделить/вставить по щелчку средней кнопки мыши.
    • 0
      упс… нет «гуёвой» FreeBSD под рукой, чтобы проверить =(

      xclip есть и в репозитории, скажем, убунты, но с utf-8 она у меня отказалась работать. поэтому пришлось собирать из исходников версию для Alt Linux =)
  • +1
    Вот бы еще скриптик написали для отправки слова/фразы из буфера обмена в google translate :)
    • +1
      Там POST'ом передаются данные, насколько я знаю. Но можно будет помудрить =)

      Для 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
    • +2
      Пардон, вот для гугла ;)

      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

      перевод с английского на русский.
      • +1
        Спасибо большое :]
  • +3
    Use an Os that works. Use Linux.
    Спасибо за удобную утилиту, еще в 2005 видел klipper в кедах, но лень мешала найти аналог для гнома.
    • 0
      Если вы про glipper, то версия из репозитория не совсем корректно отрабатывает выделения — для достаточно длинного выделения в истории окажутся продублированные строки.

      Желательно скачать и собрать версию с сайта программы — они это пофиксили.

      Впрочем, может быть, в репозитории уже доступна свежая версия =)
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Подозреваю, что dcop потянет за собой половину KDE, а мне даже Gnome лишним кажется =)
      Но штука, несомненно, интересная. Если бы у меня такая команда работала в «голом» Awesome, я был бы счастлив =D
  • 0
    Для Xfce4 есть xfce4-clipman-plugin.
  • +1
    Гмгм. А у меня вот (бубунта + кде) достаточно просто щёлкнуть средней мышкой в окне оперы. Если там (в буфере) url — он откротся в текущей вкладке, если просто фраза — откроется страница гугла с оной.
    • 0
      Это фича оперы. У меня без менеджера буфера всё так же.
  • +3
    с CTRL + V на майке, опасно по улице ходить
  • +6
    Текст подготовлен в редакторе VIM ;)
    5! :)
    • 0
      Я знал, что кому-то понравится =)))
      • +1
        Расскажите поподробнее как в vim готовите посты к публикации.
    • +2
      Да-да, вим наше фсио. Я уже даже успел отвыкнуть, что он умеет всё портить и бибикать ;)
      Особенно после того как меня одарили вимрц, с которым оно стало нормально работать во фряшном скрине (раньше работало не так как мне было надо).
      • 0
        согласен! =)
        мне бы ещё сдружить его с urxvt (через Ctrl и Alt не понимает комбинации в vimrc), — но пока руки не дошли просто — алгоритм уже известен.

        dotfiles.org/ — крайне полезная ссылка =)
        • 0
          Попробуйте добавить

          URxvt.meta8: true 

          в Xdefaults
  • +2
    а я бы поработал с буферами в желтых маечках
  • +1
    Чудесная тулза для работы с клипбордом Windows — CLCL
  • +1
    подскажите, как заставить mc копировать текст в буффер обмена и вставлять из него?
    • 0
      Просто зажмите Shift.
      • 0
        что-то непонимаю с какой комбинацией? ctrl+ins / shift+ins не работают. ctrl+c — выход из редактора. если просто выделять текст зажав шифт, то тоже ничего не происходит
        • 0
          Можно просто выделить текст, зажав Shift. Для того, чтобы вставить текст в MC — нужно кликнуть средней кнопкой мыши, зажав кнопку шифт, — в другую программу — просто кликнуть средней кнопкой мышки.

          Можно так же выделить текст с помощью Shift, и нажать комбинацию Ctrl+Insert для копирования, или Shift+Insert для вставки.
          • 0
            спасибо. выделение с зажатым шрифтом работает, но только в пределах одного экрана. но уже что-то!
          • 0
            Представляю себе работу в миднайте с мышкой в руках и содрогаюсь… Кстати, это его, пожалуй, основное отличие в плане использования от фара)

            xmages.net/out.php/i86149_mc.far.png

            • 0
              я до сих пор фар юзаю, даже под линем, именно из-за буффера обмена.
              • +1
                Мм… Я редко использую mc — шелл мне нравится гораздо больше, — он даёт куда больше возможностей (при условии обладания навыков работы с ним, конечно же).
                А для наглядности (если нужно) всегда можно воспользоваться командой «tree», настроенной соответствующим образом в bashrc =)
                Впрочем, кому как удобнее =) Даже при использовании mc я не могу представить себе случая, когда мне потребуется мышка.

                Кстати! Вот строчка, которую я когда-то добавлял в меню MC:
                + ! t t
                f Copy full filename into clipboard
                echo -n %d/%f | xclip

                Она копирует полный путь к выделенному файлу в clipboard =)
                А я совсем забыл про это… Нужно будет добавить в статью в качестве примера =)
  • 0
    Хорошая заметка. как раз столкнулся с такой проблемой в KWrite.
    Спасибо.
  • 0
    а как бы эту вставку по средней кнопе отключить, а то случайно нажмешь, а ФФ давай открывать урл
    • 0
      это уже фича не буфера обмена, а ФФ
      • 0
        конквер ведет себя точно так же.
        а вот под виндой ФФ такого себе не позволяет
        • 0
          Под виндой FF включает быструю перемотку, что очень удобно. Не знаю как это настроить в линуксе
          • +2
            Preferences->Advanced->General->Use Autoscrolling
            • +1
              Ой спасибо!!!
        • 0
          не уверен, потому как в основном пользуюсь оперой, но по моему «Tab Mix Plus» позволяет это настроит
          • 0
            опера под линем ведет себя точно так же, по средней кнопке начинает пытаться открыть что в буфере обмена.
      • 0
        Это кликать по заголовку вкладки, то это ещё и фича конкретной сборки
    • +1
      about:config --> middlemouse.contentLoadURL = false
  • +3
    > при закрытии программы, из которой были скопированы данные, содержимое буфера обмена теряется
    Вот из-за этого мне много раз уже хотелось кого-нибудь пристрелить…
    • +1
      Сколько нервов полегло из-за этого…
  • +2
    С теорией все понятно, за практическую часть и скрипты отдельное спасибо.
    Очень полезная и приятная статья вышла, добавлю в избранное.
  • +2
    За скрипты огромное спасибо!
    Но вот в теорию надо было бы наверно дописать для ясности, что на самом деле нет никакого буфера обмена ,-)
    Всё работает так:
    Когда вы «копируете в буфер обмена», приложение сообщает иксам, что оно может отдать содержимое буфера обмена и отдаёт и callback-функцию. При этом никакого копирования не происходит(!). Когда вы «вставляете из буфера обмена», иксы дёргают callback, а он отаёт данные. (Причём, данные могут отдавать порциями, а callback дёргаться много раз.) Поэтому, действительно, если закрыть приложение, то callback пропадёт, а буфер «отчистится».
    Мне кажется, что это многое бы объяснило ,-)
    • 0
      Всегда пожалуйста =)

      Копирование данных, или получение ссылки на них — по сути ведь нет особой разницы для конечного пользователя. То, что иксы не плодят сущности и не дублируют эти данные является как плюсом (экономим память), так и минусом (при закрытии программы данные пропадают).

      Но вы правы, — пожалуй, следует расписать этот момент для лучшего понимания. Спасибо за замечание =)
      • 0
        Я всё же буду настаивать… :-)
        Передаётся не ссылка на данные, а ссылка на процедуру. Это позволяет делать с буфером обмена самые разные вещи. На пример «положить в него» текущее время :-) То есть, при вставке, функция будет возвращать всегда разное значение. Вы говорите два раза Ctrl-V и получаете разные значения. Или «положить в буфер обмена» бесконечно много данных. Скажем при каждой следующей вставке функция будет возвращать следующую цифру числа «пи»… При копировании, работа с данными вообще не происходит; ни по значению, ни по ссылке, ни как-то иначе. Это важное обстоятельтво, дающие принципиально больше возможностей, чем работа с данными.
        (извините уж за настырность :-))
        • 0
          Абсолютно с вами согласен — неправильно выразился насчёт «ссылки на данные» =)
          Дополню статью вечером, из дома — сейчас, к сожалению, нет возможности сделать это.

          Ещё раз спасибо за замечания! =)
  • +1
    я уже объяснял, что в иксах копирование через выделение и среднюю кнопку — не является копированием и вставкой. После выделения текста ничего никуда ни в какой примари не копируется, просто приложение отправляет иксам событие что текущий селекшн его, а другое приложение может через иксы событийно запросить содержимое текущего селекшна, и если программа держащая селекшн не подвисла — даже возможно его получить.
    • 0
      Допишу, чтобы не возникало путаницы =) Спасибо! ;)
  • 0
    Кто-нибудь знает как переназначить вставку третей кнопкой мыши на что-нибудь другое? Да хотя бы просто то самое зажатие обоих клавишь
    • 0
      или просту убить эту штуку на корню
  • +1
    Последний год сидел на работе под иксами, очень привык к копипасту мышью. Теперь под виндами работать некомфортно. Кто-нибудь сталкивался с тулзой, реализующей аналогичный функционал в windows? Гугл помочь отказался, максимум что удалось найти — это плагин для файерфокса…
    • 0
      могу подать только надежду. года 2 назад я находил такую штуку под винду и долго ей пользовался. но уже не помню ни названия, ни где искать
      • 0
        Спасибо! Раз штука существует, значит стоит продолжить поиски.
        • 0
          Вроде оно, но сам не тестировал fy.chalmers.se/~appro/nt/TXMouse/
          • 0
            Да, спасибо большое. Проблему софтина решает, но к сожалению она недостаточно настраивается. А кроме копипаста она делает и другие вещи, вроде автофокуса…
  • 0
    Небольшой оффтоп:
    Кто нибудь может посоветовать стоящую прогу под Mac OS?
    А то Clipboard Evolved во-первых платный, во вторых внешне как то не понравился.

    А по теме очень не хватает функцианала со средней кнопкой в системах отличных от Linux.
    • 0
      Тогда понятно что надо делать!

      … шучу, шучу.
      • 0
        Вот будет нативный фотошоп…
        Только не надо про Gimp.
  • 0
    > Выделенный текст незамедлительно попадает в буфер primary

    Вы говорите о консоли или о любом X приложении? Если я в firefox выделю текст, то он скопируется, а потом вставится при клике на средней кнопке мыши?
    • 0
      В Firefox работает, да и вообще я не сталкивался, что бы не работало. Очень удобно например сообщение об ошибке из графического окна копировать прямо в гугл.
      • 0
        И вправду работает! Я и не предполагал. Спасибо автору за это мое маленькое открытие, которое возможно приведет к большим свершениям :)
  • 0
    Проблема xclip, xsel и sselp (аналогичные утилиты) — не работают с юникодом.
    С юникодом работает uclip.
    Первые например не обработают x-selection текста из firefox.
    • 0
      ;) ;) ;)
      К сожалению, официальная версия xclip у меня с кириллицей корректно не заработала, несмотря на то, что я собирал последнюю версию. Поэтому я предлагаю скачать и собрать версию xclip для дистрибутива Alt Linux.
      Ссылка для скачивания есть в статье. Всё работает корректно уже давно — ни разу не было проблем.
  • 0
    Не подскажете тулзину или настройку, чтобы можно было настраивать по какому сочетанию клавиш будет делаться Copy / Paste?
    Т.к. на ноуте нажимать левой рукой Ctrl + Ins / Shift +Ins не очень удобно, хочу настроить Super + C / Super + V. Все равно кнопка зря пропадает.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.