Вернуться назад

Буфер обмена (clipboard)

В Wayland нет глобального clipboard-сервиса, как в X11. Буфер обмена реализует compositor, то есть сам Sway. То есть, когда я нажимаю Ctrl+C, приложение само передаёт данные compositor'у. А когда я нажимаю Ctrl+V, compositor отдаёт данные другому приложению.

!!! В Wayland есть важное ограничение: буфер обмена живёт, пока живо приложение-источник. Если я запустил, например, FeatherPad, выделил текст и скопировал его в буфер обмена, то я смогу его вставить в другое приложение только если FeathPad запущен. Если я закрою FeatherPad, то Ctrl+V в другом приложении ничего не вставит.

Вроде бы как можно обойти это ограничение. Есть такие инструменты как cliphist, clipman. По идее, они должны сохранять историю. Но я пока с ними не разобрался. У меня они ничего не сохраняют после закрытия источника.

wl-clipboard

Зачем тогда нужен пакет wl-clipboard, если GUI-приложения и так могут напрямую отправлять данных в буфер обмена Sway?

wl-clipboard добавляет две команды:

То есть, wl-clipboard ≠ буфер обмена.

Буфер обмена (clipboard) у меня и так есть. Его даёт Sway.

wl-clipboard – это мост между CLI и Wayland clipboard.

wl-copy

Копируем сообщение с помощью wl-copy:

echo "Зелёные помидоры падают с дерева прямо в рот дяде Паше" | wl-copy

wl-paste

А затем это сообщение можно вставить в любое приложение с помощью Ctrl+V.

Или вывести прямо в терминал:

wl-paste

# убрать перевод строки в конце:
wl-paste -n

Можно следить за изменением буфера обмена:

wl-paste --watch echo "clipboard changed"

Каждый раз, когда в буфер обмена попадёт что-то новое, будет выводиться надпись: "clipboard changed".

wl-paste --list-types
  # text/plain
  # text/plain;charset=utf-8
  # TEXT
  # STRING
  # UTF8_STRING

Всё, что мы получили в выводе – это форматы (MIME-типы), в которых доступно одно и то же содержимое. Когда приложение кладёт текст в буфер обмена, оно не кладёт "просто текст". Оно говорит compositor'у: я могу отдать это содержимое вот в таких форматах. А получающее приложение выбирает любой формат, который понимает.

Когда мы просто пишем команду wl-paste без явного указания MIME-типа, то wl-paste сам подбирает лучший подходящий текстовый тип. Обычно это text/plain;charset=utf-8.

Но можно и самому явно указать тип:

wl-paste --type text/plain

# или:
wl-paste --type UTF8_STRING

Подводя итог

GUI-приложения не используют wl-copy. Они напрямую отправляют скопированные данные композитору, а тот отдаёт их другому приложению. wl-clipboard – это мост между CLI и Wayland'овским буфером обмена.

Многие приложения, такие например, как NormCap, используют под капотом wl-clipboard, поэтому без него они не будут ничего копировать в буфер обмена.