Вопрос или проблема
В руководстве 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 аргументом или с 2. Первая действовала только на PRIMARY, вторая – на PRIMARY и SECONDARY. Своеобразный “механизм переключения”, если хотите. Или резервное копирование, если вы действительно хотели оставить то, что у вас было в PRIMARY, нетронутым. Однако спецификация не соблюдалась, и разные приложения делали это по-разному.
- Windows / Mac популяризировали буфер обмена.
- Это привело к интересному случаю: 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:
- PRIMARY (XA_PRIMARY): Используется для хранения выделенного текста. Обычно текст, выделенный в графическом интерфейсе, автоматически помещается в этот буфер.
- SECONDARY (XA_SECONDARY): Более редкий буфер, который не используется так часто, как PRIMARY и CLIPBOARD.
- 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
часто ведут себя похоже, они были созданы для разных задач:
- Историческая причина: Различные приложения использовали их по-разному, и утилиты, такие как
xclip
иxsel
, по умолчанию обращаются к первичному буферу. - Невостребованность SECONDARY: Этот буфер не стал популярным и часто остаётся пустым.
- Преемственность копирования:
PRIMARY
часто используется для выделения текста, в то время какCLIPBOARD
используется более классическим способом копирования/вставки.
Заключение
Итак, на ваш вопрос о том, могут ли три буфера обмена содержать разные значения: да, но только при условии, что вы корректно используете их. Понимание того, как работает xclip
и взаимодействие с различными буферами, может помочь избежать путаницы и максимизировать эффективность рабочего процесса.
Для более подробного изучения можно обратиться к спецификации буферов обмена, чтобы понять, как эти механизмы работают за кулисами.
Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за более точными разъяснениями.