Автор Тема: Файлы буфера обмена.  (Прочитано 7394 раз)

Оффлайн Merblud

  • Давно тут
  • **
  • Сообщений: 460
Re: Файлы буфера обмена.
« Ответ #15 : 15.03.2018 09:04:40 »
А почему вы думаете, что буфер обмена должен быть файлом? Это вполне может быть просто некоторой областью в ОЗУ.

Я бы даже сказал, что в большинстве случаев под буфером и понимается ОЗУ, или область в ОЗУ.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Файлы буфера обмена.
« Ответ #16 : 15.03.2018 15:58:21 »
Здравствуйте.
Подскажите пожалуйста, если я копирую текст используя Ctrl+C, в каком файле хранятся данные буфера обмена?
Но просто я думал, чтов Альте можно как-то самому, напрямую обратиться к файлам буфера. Просто у меня если честно, ум за разум заходит. Я не так давно пользуюсь Linux и многое мне не привычно и не понятно.

Если не используется стороннее приложение или плагин, перехватывающие комбинации Ctrl+c Ctrl+v, то эти комбинации работают с областью памяти выделенной под буфер обмена. Нет принципиального значения какая это операционная система: с таким же успехом это может быть и ZX Spectrum.

'xclip -o' извлекает содержимое буфера обмена и выводит на стандартный вывод, т.е. в данном случае в терминал.


Статью про xclip я читал, спасибо.

:-) Там не про xclip, там про его использование в скриптах. Про xclip автор ничего не сказал.

Но вы же понимаете, что иногда результат может быть отличным от ожидаемого.

Результат может быть таким
$ echo 'grep . $HOME/.cache/xfce4/clipman/textsrc' | xclip
$ xclip -o
grep . $HOME/.cache/xfce4/clipman/textsrc
[user@comp release]$ _

Или таким:
grep . $HOME/.cache/xfce4/clipman/textsrc
$ ^C  # Копирование в буфер обмена выделенного фрагмента
$ xclip -o
grep . $HOME/.cache/xfce4/clipman/textsrc[user@comp release]$ _

Все зависит от того,
есть ли управляющие коды в скопированном в буфер обмена фрагменте
$ echo 'grep . $HOME/.cache/xfce4/clipman/textsrc' | xclip
$ xclip -o > 1.txt
$ hexdump -C 1.txt
00000000  67 72 65 70 20 2e 20 24  48 4f 4d 45 2f 2e 63 61  |grep . $HOME/.ca|
00000010  63 68 65 2f 78 66 63 65  34 2f 63 6c 69 70 6d 61  |che/xfce4/clipma|
00000020  6e 2f 74 65 78 74 73 72  63 0a                    |n/textsrc.|
0000002a

или их нет
grep . $HOME/.cache/xfce4/clipman/textsrc
$ ^C  # Копирование в буфер обмена выделенного фрагмента
$ xclip -o > 2.txt
$ hexdump -C 2.txt
00000000  67 72 65 70 20 2e 20 24  48 4f 4d 45 2f 2e 63 61  |grep . $HOME/.ca|
00000010  63 68 65 2f 78 66 63 65  34 2f 63 6c 69 70 6d 61  |che/xfce4/clipma|
00000020  6e 2f 74 65 78 74 73 72  63                       |n/textsrc|
00000029

Эту таблицу можно найти в каждой третьей мало-мальски приличной книге по ZX Spectrum:
(см. хэкс код 0A - код перевода строки)
https://www.asciitable.com/
Все символы с кодом меньше чем у пробела, это управляющие коды. С их помощью можно сделать много полезных или много полезных вредных вещей.
Во второй группе примеров, приглашение bash "порезалось", поскольку фрагмент не имеет завершающего кода перевода строки 0A.


mcedit работающий в tty, без X-сов, имеет свой файл буфера обмена с которым он работает по комбинациям клавиш Ctrl+Ins Shift+Ins
$HOME/.local/share/mc/mcedit/mcedit.clip

Принцип тот же:
Чтобы приглашение bash не резалось при выводе буфера mcedit в терминал, содержимое буфера должно оканчиваться управляющим кодом перевода строки.
Но соль в том, что в mcedit этого никогда не произойдёт, поскольку теряется смысл буфера mcedit, иначе после вставки фрагмента из буфера mcedit, после фрагмента будет сделан перевод строки по управляющему коду 0ah
$ hexdump -C ~/.local/share/mc/mcedit/mcedit.clip
00000000  62 69 72 64                                       |bird|
00000004

Как это может работать в контексте буфера mcedit?
При выводе содержимого буфера mcedit в терминал может показаться что буфер mcedit пуст
[user@comp release]$ cat $HOME/.local/share/mc/mcedit/mcedit.clip
[user@comp release]$
$ cat $HOME/.local/share/mc/mcedit/mcedit.clip | wc -l
0

но на самом деле это не так, - после символов фрагмента содержащегося в буфере mcedit стоят символы управляющиго кода backspace, они-то и скрывают содержимое буфера mcedit при его выводе в терминал:
$ cat $HOME/.local/share/mc/mcedit/mcedit.clip | wc -c
8
$ hexdump -C $HOME/.local/share/mc/mcedit/mcedit.clip
00000000  62 69 72 64 08 08 08 08                           |bird....|
00000008

Не пугайтесь этих линуксовых заморочек. Всё это справедливо для всего, что хоть как-то можно назвать компьютером. И ZX Spectrum или БК-0010 не исключение.
Здесь всё это не об использовании xclip или чего-то подобного, а бегло о том, с чем вы можете столкнуться (ну или не столкнуться :-)) при работе с буфером.
Подобные приёмы на платформе ZX Spectrum применялись против тех, кто не имел никакого отношения к платформе и ничего не сделал для неё, но желал не ударив палец-о-палец, по-быстрому срубить денег.
« Последнее редактирование: 15.03.2018 16:52:00 от Speccyfighter »

Оффлайн Пурпур

  • Завсегдатай
  • *
  • Сообщений: 131
    • Email
Re: Файлы буфера обмена.
« Ответ #17 : 16.03.2018 11:55:33 »
После долгих раздумий, решил, что пока проще пользоваться утилитой xclip.
Но тут же опять обозначилась проблема: утилита выводит только последнее копирование из буфера. Так и не смог понять, какие функции выполняет опция -selection. Перебрал последовательно все предлагаемые значения, разницы никакой.

Может быть, кто-то может мне подсказать, как через консоль обращаться к данным буфера?

Как я понимаю, для работы с данными буфера, в KDE используется утилита klipper, а xclip обращается только к последнему копированию. Это так? Если да, то можно ли как-то через консоль работать с klipper'ом? Или еще какие-то варианты может быть есть.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Файлы буфера обмена.
« Ответ #18 : 16.03.2018 19:22:32 »
Перенаправить в буферы:
$ echo 'Это буфер обмена' | xclip
$ echo 'Буфер обмена' | xclip -selection secondary
$ echo 'Это буфер X' > ./11.txt
$ xclip -selection clipboard < ./11.txt

Вывести из буферов
$ xclip -selection primary -o
Это буфер обмена
$ xclip -selection secondary -o
Буфер обмена
$ xclip -selection clipboard -o
Это буфер X

Содержимое буфера clipboard можно вставить по Ctrl+v в любое приложение X, например в ascii редактор leafpad.

Как я понимаю, для работы с данными буфера, в KDE используется утилита klipper, а xclip обращается только к последнему копированию. Это так?

Нет.
Буфер, это стэк с одним регистром произвольного размера:
- То что попало в регистр, выталкивает из него то что там было.

Клипперы X работают с буфером обмена через кеш-файлы:

В буфер последовательно скопированы слова X, буфер, Это.
В выпадающем окне clipman они видны сверху вниз как:
Это
буфер
X

Слово 'Это' находится в буфере X, - clipboard, поскольку попало в буфер обмена X последним,
и в кеше clipman оно последнее, - первое в выпадающем окне clipman, то что находится в буфере X, clipboard:
$ grep . $HOME/.cache/xfce4/clipman/textsrc
[texts]
texts=X;буфер;Это;

Это содержимое буфера X, clipboard (то что можно вставить по Ctrl+v):
$ xclip -selection clipboard -o
Это[user@comp release]$

После выбора в окне clipman слова 'буфер', порядок содержимого кеша clipman меняется (слово 'буфер' попадает в буфер X, а в кеше clipman оно становится последним, - первым в выпадающем окне clipman)
$ grep . $HOME/.cache/xfce4/clipman/textsrc
[texts]
texts=X;Это;буфер;
$ xclip -selection clipboard -o
буфер[user@comp release]$


(Похоже весь этот материал придётся сводить в одно целое в логической последовательности и отправлять в Советы)

Оффлайн Александр Ерещенко

  • Завсегдатай
  • *
  • Сообщений: 1 153
Re: Файлы буфера обмена.
« Ответ #19 : 16.03.2018 19:35:12 »
После долгих раздумий, решил, что пока проще пользоваться утилитой xclip.
Но тут же опять обозначилась проблема: утилита выводит только последнее копирование из буфера. Так и не смог понять, какие функции выполняет опция -selection. Перебрал последовательно все предлагаемые значения, разницы никакой.
Может быть, кто-то может мне подсказать, как через консоль обращаться к данным буфера?
Я попробовал и нашел разницу :)
Для теста сначала выделил первый кусок текста и помести в буфер через Ctrl-C.
Потов просто мышью выделил второй кусок текста
xclip -o -selection "clipboard"вывел первый отмеченный кусок (он же выведется по Ctrl-V)

xclip -o -selection "primary"вывел второй кусок (он же выведется по средней кнопке мыши)

Как я понимаю, для работы с данными буфера, в KDE используется утилита klipper, а xclip обращается только к последнему копированию. Это так? Если да, то можно ли как-то через консоль работать с klipper'ом? Или еще какие-то варианты может быть есть.
xclip обращается непосредственно к системному буферу через функции XWindow (не поленился, заглянул в исходники xclip)
И различные менеджеры буфера обмена в различных DE тоже обращаются к системному буферу и предоставляют дополнительные возможности, например, историю буфера обмена, синхронизацию (или нет) clipboard и выделения мышью и пр.
И если уж так хочется работать именно с klipper через консоль, то это надо смотреть его API и писать самому эту консольную утилиту (или переделывать xclip). Но так как это еще никто не реализовал, значит никому это особо не было нужным. :)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Файлы буфера обмена.
« Ответ #20 : 16.03.2018 21:45:20 »
xclip обращается непосредственно к системному буферу через функции XWindow (не поленился, заглянул в исходники xclip)
И различные менеджеры буфера обмена в различных DE тоже обращаются к системному буферу и предоставляют дополнительные возможности, например, историю буфера обмена, синхронизацию (или нет) clipboard и выделения мышью и пр.
 :)

Уточню:

Ctrl+c помещает выделенное сразу в два буфера: primary и clipboard
Следующее копирование по Ctrl+c замещает содержимое этих буферов.
По Средней Кнопке Мыши, вставка идёт из primary.
По Ctrl+v - из clipboard.
Но это разные буферы:
$ xclip -selection primary -o
prim
$ xclip -selection secondary -o
sec
$ xclip -selection clipboard -o
clip
содержимое буферов после копирования в буфер:
$ echo вставка | xclip -selection буфер

Поэтому если пользователь думает, что копируя в clipboard по Ctrl+c он не повредит содержимое primary буфера, он ошибается:
$ xclip -selection primary -o
DESCRIPTION
$ xclip -selection secondary -o
sec
$ xclip -selection clipboard -o
DESCRIPTION
« Последнее редактирование: 16.03.2018 22:14:21 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Файлы буфера обмена.
« Ответ #21 : 17.03.2018 23:09:53 »
man mplayer, это man. man bash, это man. А man xclip, это огрызок. Он не даёт ясной картины об xclip.
Хэлп xclip вызывается по -h или -help, но не стандартным для Unix-подобных --help.
Более того, список опций в хэлп не соответствует списку опций описываемых в man.
ИМХО:
автор xclip раздолбай.
« Последнее редактирование: 17.03.2018 23:18:16 от Speccyfighter »

Оффлайн Merblud

  • Давно тут
  • **
  • Сообщений: 460
Re: Файлы буфера обмена.
« Ответ #22 : 19.03.2018 09:33:45 »
Уточню:

Ctrl+c помещает выделенное сразу в два буфера: primary и clipboard
Следующее копирование по Ctrl+c замещает содержимое этих буферов.
...
Поэтому если пользователь думает, что копируя в clipboard по Ctrl+c он не повредит содержимое primary буфера, он ошибается:

По конечному результату получается действительно так, как написано. А вот происходит все несколько иначе. Ctrl+c не помещает выделенное сразу в два буфера. Там, уж если совсем быть точным, то буфер для копируемых данных  один, а именно clipboard. Копирование по средней кнопке мыши идет непосредственно из приложения, в котором данные были выделены. Непосредственно при передаче данные может быть и буфферизируются X-сервером, но это прозрачная буферизация (если она вообще есть).
В X-ах есть есть два встроенных способа обмена данными между приложениями: xselection и xclipboard.
Когда мышью выделяется, например, фрагмент текста, то приложение через primary всего лишь уведомляет, что у него имеются данные (текст в данном случае), которые приложение готово передать, если их запросят. Сам текст никуда не помещается.
А вот по Ctrl+c как раз выделенный фрагмент помещается в xclipboard. Но, разумеется, перед тем, как нажать  Ctrl+c, необходимо выделить фрагмент текста. Вот в этот то момент старое уведомление об xselection и перезатирается. Результат то будет один и тот же, но суть происходящего иная.
После нажатия Ctrl+c можно, например, выделить другой фрагмент текста. Тогда по средней кнопке мыши будет вставляться один фрагмент, а по Ctrl-V - другой.


Оффлайн andrew_b

  • Завсегдатай
  • *
  • Сообщений: 534
Re: Файлы буфера обмена.
« Ответ #23 : 19.03.2018 10:27:00 »
Хэлп xclip вызывается по -h или -help, но не стандартным для Unix-подобных --help.
Исторически существует три типа ключей:
стиль Unix: -h (однобуквенные с одним дефисом)
стиль X Window System: -help (многобуквенные с одним дефисом)
расширение GNU: --help (многобуквенные с двумя дефисами)
Автор xclip следует стилям Unix и X.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Файлы буфера обмена.
« Ответ #24 : 19.03.2018 16:13:07 »
Хэлп xclip вызывается по -h или -help, но не стандартным для Unix-подобных --help.
Исторически существует три типа ключей:
стиль Unix: -h (однобуквенные с одним дефисом)
стиль X Window System: -help (многобуквенные с одним дефисом)
расширение GNU: --help (многобуквенные с двумя дефисами)
Автор xclip следует стилям Unix и X.

:-) А ещё у Рассела Сейджа в процедуре описывающей параметры используется -z и -?. А в *DOS - /? и -?.
Также и Федорчук упоминает -? как возможный вариант вызова помощи.
Как безошибочно угадать какой опцией может быть вызван help без перебора всех существующих опций?

:-) Ах да:
$ man --help | grep help
  -?, --help                 give this help list
Но обрабатывает и -h и -help
Т.е. все четыре:
-?, -h, -help, --help
Любая из введённых приведёт к выводу хэлпа.
« Последнее редактирование: 19.03.2018 16:52:41 от Speccyfighter »

Оффлайн andrew_b

  • Завсегдатай
  • *
  • Сообщений: 534
Re: Файлы буфера обмена.
« Ответ #25 : 19.03.2018 17:04:32 »
Я использовал -h/-help/--help лишь в качестве иллюстрации в ключевой экскурс юниксовых программ. Разумеется, всё это справедливо для других ключей, а не только для справки.
Это всё написано у Э. Реймонда в книге "Искусство программирования для Unix".

А DOS тут вообще ни при чём.

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Файлы буфера обмена.
« Ответ #26 : 19.03.2018 18:22:48 »
Вопрос/проблема не о других ключах, а о единых правилах вызова информации о программе. Без, здесь работает, здесь не работает.

dos при том, что опция вызова в man та же (см. выброс man выше).

Оффлайн Пурпур

  • Завсегдатай
  • *
  • Сообщений: 131
    • Email
Re: Файлы буфера обмена.
« Ответ #27 : 23.03.2018 12:29:28 »
Все зависит от того,
есть ли управляющие коды в скопированном в буфер обмена фрагменте
Код: [Выделить]

$ echo 'grep . $HOME/.cache/xfce4/clipman/textsrc' | xclip

Код: [Выделить]

$ xclip -o > 1.txt

Всем спасибо за ответы, что-то стало проясняться.

Осталось только уточнить еще несколько моментов ). Я-то все по старинке буфером пользуюсь, используя Ctrl+C. Посмотрел, действительно, вызов Сtrl+С помещает данные в primary и clipboard. Средней конопки мыши у меня нет, т.к. работаю на ноуте, да и не знал до этого, об этом свойстве.

У меня вопрос, как сделать так, чтобы выделенные данные сразу помещались в буфер (без нажатий кнопок)? Писали, что это возможно. И соответственно вопрос, как сделать так, чтобы я делал три выделения и каждое следующее выделение не "затирало" предыдущие данные в primary and clipboard, а спределялось в clipboard, prim and secon.

Чувствую, что вопрос составлен несколько "коряво", поэтому попробую поставить вопрос еще по-другому:
Какое назначение в утилите xclip выполняют три селектора - primary, secondary and clipboard? Они эффективно работают только в консоли, когда юзер сам выбирает при помощи селектора, в какой буфер отправить данные? Или можно как-то сделать так, чтобы данные распределялись сами по трем буферам? Т.е. так, чтобы после трех кратного нажатия Ctrl+C, данные распределялись по primary, secondary, clipboard и аналогично после трех выделений, чтобы тоже распределялись по трем этим буферам.
« Последнее редактирование: 23.03.2018 13:00:24 от Пурпур »

Оффлайн Александр Ерещенко

  • Завсегдатай
  • *
  • Сообщений: 1 153
Re: Файлы буфера обмена.
« Ответ #28 : 23.03.2018 19:33:46 »
Средней конопки мыши у меня нет, т.к. работаю на ноуте, да и не знал до этого, об этом свойстве.
Для двухкнопочных мышей обычно действует эмуляция средней кнопки - одновременное нажатие левой и правой кнопок мыши.

У меня вопрос, как сделать так, чтобы выделенные данные сразу помещались в буфер (без нажатий кнопок)?
Это может обеспечиваться менеджером буфера обмена, например, в КДЕ в настройках апплета буфера обмена есть опция "синхронизировать буфер обмена и выделение мышью". Возможно, и в других такая опция может присутствовать