Как скопировать из / в буфер обмена tmux с трубами оболочки?

17

При работе в среде оболочки я довольно часто сталкиваюсь с необходимостью копировать «промежуточный вывод канала» (например, из / в уже работающие редакторы, в другие оболочки, на другие машины и т. Д.).

В оконной среде простой (и универсальный) метод решения этой проблемы часто осуществляется через системный буфер обмена, например:

  • X11: ... | xsel -i/xsel -o | ...
  • OS X: ... | pbcopy/pbpaste | ...

Как я могу получить такое же удобное поведение, используя средство копирования / вставки tmux?

неосмысленное
источник

Ответы:

20

ТЛ; др

  • ... | tmux loadb -
  • tmux saveb - | ...

Объяснение и история вопроса

В tmux вся деятельность по копированию / вставке проходит через буферный стек, где верхняя часть (индекс 0) является последним скопированным текстом и будет использоваться для вставки, когда явно не указан индекс буфера -b. Вы можете проверить текущие буферы с помощью tmux list-buffersили ярлыка по умолчанию tmux-prefix+ #.

Существует два способа передачи в новый буфер tmux в верхней части стека, set-bufferпринимая строковый аргумент и load-bufferфайловый аргумент. Для передачи в буфер, который вы обычно хотите использовать load-bufferс stdin, например:

print -l **/* | tmux loadb -

Вставить это обратно в редакторы, и это довольно очевидно ( tmux-prefix+ ]или что бы вы ни связали paste-buffer), однако, доступ к вставке из оболочки не возможен, потому что вызов paste-bufferзапишет вставку в stdin, что в конечном итоге приведет к редактированию вашего терминала. буфер, и любая новая строка в вставке заставит оболочку выполнить все, что было вставлено до сих пор (потенциально отличный способ испортить ваш день).

Есть несколько способов подойти к этому:

  1. tmux pasteb -s ' ': -sзаменяет все окончания строки (разделители) тем разделителем, который вы указали. Однако вы все равно получаете поведение, paste-bufferкоторое означает, что вставка заканчивается в буфере редактирования терминала, что может быть тем, что вы хотите, но обычно это не так.
  2. tmux showb | ...: show-bufferпечатает буфер в stdout, и это почти то, что требуется, но, как упоминает Крис Джонсен в комментариях , show-bufferвыполняет восьмеричное кодирование непечатных символов ASCII и не-ASCII символов. Это, к сожалению, ломается достаточно часто, чтобы раздражать, даже с такими простыми вещами, как строки с нулевым символом в конце или латинские символы с акцентом (например, (в zsh) print -N á | tmux loadb - ; tmux showbпечатные издания \303\241\000).
  3. tmux saveb - | ...: save-bufferпросто выполняет обратную операцию load-bufferи записывает необработанные байты без изменений в стандартный ввод, что в большинстве случаев является желаемым. Затем вы можете продолжить сборку другой трубы, например. пройти | xargs -n1 -I{} ...до технологической линии и т.д.
неосмысленное
источник
1
tmux show-bufferвыполнит восьмеричное кодирование управляющих символов C0 и байтов не ASCII (например, латинские символы с акцентом и т. д.). Вы можете использовать, tmux save-buffer -если вы хотите необработанные байты (это обычно то, что вы хотите).
Крис Йонсен
@ChrisJohnsen Большое спасибо за то, что поймал это, я обновил ответ соответственно.
размышлений