Странное поведение xclip

Вопрос или проблема

В руководстве xclip сказано, что существуют три места хранения: первичное (XA_PRIMARY), вторичное (XA_SECONDARY) и буфер обмена (XA_CLIPBOARD). Я скопировал (Ctrl+c) какой-то текст из своего браузера и проверил содержимое трех упомянутых мест в терминале:

xclip -s primary -o
xclip -s secondary -o
xclip -s clipboard -o

Все три содержат один и тот же текст.

Теперь если я напишу

date | xclip -selection XA_PRIMARY

Только XA_PRIMARY должен содержать текст даты. Но на самом деле другие два, т.е. XA_SECONDARY и XA_CLIPBOARD, также содержат тот же текст (информацию о дате). Так являются ли эти три местом одним и тем же? И если да, то в чем тогда смысл?

Меня еще больше озадачило то, что Ctrl+Shift+v (по-прежнему в режиме терминала) вставляет оригинальный текст, который я скопировал из браузера! Это предполагает, что собственный буфер обмена оболочки также работает.

Кто-нибудь может привести пример, который демонстрирует, что три места могут содержать разные значения одновременно и как они соотносятся с обычным буфером обмена?

К сожалению, xclip молча игнорирует недопустимые параметры командной строки:

Не существует опции -s, так как как -selection, так и -silent начинаются с -s. Вам нужно использовать хотя бы -se.

Поскольку xclip просто игнорирует вашу опцию -s, команды

xclip -s primary -o
xclip -s secondary -o
xclip -s clipboard -o
xclip -s asdfghj -o

все просто используют выбор по умолчанию (primary).

Для имени выбора используется только первый символ, и если он не является s или c, используется значение по умолчанию.

date | xclip -selection XA_PRIMARY
date | xclip -selection XA_SECONDARY
date | xclip -selection XA_CLIPBOARD

все используют первичный выбор.

Используйте что-то вроде

date | xclip -se p    # записать в первичный выбор
xclip -se c -o        # считать из буфера обмена

Я коснусь упущенного момента, а именно “почему 3 различных буфера обмена”.

  1. Исторически вы могли выполнить команду с 1 аргументом или с 2. Первая действовала только на PRIMARY, вторая – на PRIMARY и SECONDARY. Своеобразный “механизм переключения”, если хотите. Или резервное копирование, если вы действительно хотели оставить то, что у вас было в PRIMARY, нетронутым. Однако спецификация не соблюдалась, и разные приложения делали это по-разному.
  2. Windows / Mac популяризировали буфер обмена.
  3. Это привело к интересному случаю: XA_PRIMARY использовался для выборок (как задумано), редко кто имел хорошую идею для XA_SECONDARY, а XA_CLIPBOARD был… как буфер обмена.

xclip и xsel по умолчанию работают с XA_PRIMARY, поскольку большинство X-приложений работают таким образом: если вы выделяете текст, он выбирается и, следовательно, попадает в буфер ПЕРВИЧНОГО ВЫБОРА.

Если вы хотите вставить PRIMARY, используйте среднюю кнопку мыши или Shift+Insert. Или перенесите его содержимое в BUFFOR ОБМЕНА и просто вставьте xclip -o | xclip -se c.

Отличное чтение (сейчас в формате HTML): https://specifications.freedesktop.org/clipboard-spec/1.0/

Старая ссылка, через Wayback Machine, в txt: https://web.archive.org/web/20230901182311/https://specifications.freedesktop.org/clipboards-spec/clipboards-latest.txt

Ответ или решение

Странное поведение xclip: анализ проблемы и объяснение

Введение

При использовании утилиты xclip для работы с буферами обмена в среде X Window System пользователи могут столкнуться с непредсказуемым поведением, когда разные области хранения, такие как PRIMARY, SECONDARY и CLIPBOARD, ведут себя так, как будто они идентичны. В этой статье мы подробно рассмотрим, почему это происходит, и объясним, как правильно использовать эти области хранения для максимальной эффективности.

Проблема с xclip

Как указано в вашем вопросе, после копирования текста из браузера и проверки всех трех типов буферов обмена с помощью команды:

xclip -s primary -o
xclip -s secondary -o
xclip -s clipboard -o

мы наблюдаем, что все три хранят одинаковое содержимое. Кроме того, после выполнения команды:

date | xclip -selection XA_PRIMARY

вы обнаруживаете, что содержимое XA_PRIMARY, XA_SECONDARY и XA_CLIPBOARD становится одинаковым, несмотря на ожидание, что только PRIMARY должен содержать новое значение.

Понимание хранилищ обмена

Существует три основных области хранения в X11:

  1. PRIMARY (XA_PRIMARY): Используется для хранения выделенного текста. Обычно текст, выделенный в графическом интерфейсе, автоматически помещается в этот буфер.
  2. SECONDARY (XA_SECONDARY): Более редкий буфер, который не используется так часто, как PRIMARY и CLIPBOARD.
  3. CLIPBOARD (XA_CLIPBOARD): Создан в основном для работы с копированием и вставкой, как это реализовано в Windows и macOS.

Однако, как вы правильно заметили, в xclip команда -s игнорируется, если не использовать опцию -se, что может привести к неправильному поведению, где каждая команда по умолчанию обращается к PRIMARY. Это объясняет, почему все три области обмена показывают одно и то же значение.

Как различать буферы

Чтобы правильно взаимодействовать с каждой областью хранения, используйте следующие команды:

date | xclip -selection XA_PRIMARY    # для PRIMARY
date | xclip -selection XA_SECONDARY  # для SECONDARY
date | xclip -selection XA_CLIPBOARD  # для CLIPBOARD

Но, как упоминается, если не указать -se, по умолчанию будет использоваться PRIMARY. Для чтения содержимого из других буферов используйте:

xclip -se c -o    # Для чтения из CLIPBOARD
xclip -se s -o    # Для чтения из SECONDARY

Почему три буфера значения?

Несмотря на то, что PRIMARY, SECONDARY и CLIPBOARD часто ведут себя похоже, они были созданы для разных задач:

  1. Историческая причина: Различные приложения использовали их по-разному, и утилиты, такие как xclip и xsel, по умолчанию обращаются к первичному буферу.
  2. Невостребованность SECONDARY: Этот буфер не стал популярным и часто остаётся пустым.
  3. Преемственность копирования: PRIMARY часто используется для выделения текста, в то время как CLIPBOARD используется более классическим способом копирования/вставки.

Заключение

Итак, на ваш вопрос о том, могут ли три буфера обмена содержать разные значения: да, но только при условии, что вы корректно используете их. Понимание того, как работает xclip и взаимодействие с различными буферами, может помочь избежать путаницы и максимизировать эффективность рабочего процесса.

Для более подробного изучения можно обратиться к спецификации буферов обмена, чтобы понять, как эти механизмы работают за кулисами.

Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за более точными разъяснениями.

Оцените материал
Добавить комментарий

Капча загружается...