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

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

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

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

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

  • Как выделить результат поиска в tmux?
  • Достаточно установить параметр -g-prefix, чтобы изменить префикс ключа tmux
  • Почему mutt зависает при запуске gpg в tmux?
  • «Заменить» оболочку по умолчанию (bash) с помощью tmux
  • Почему tmux задает переменную TERM для отображения?
  • Как напрямую переключиться на панель в Tmux?
  • Как мне связать мой ctrl + b, чтобы мне не нужно было нажимать его, чтобы изменить размер моей панели?
  • Захват цветов с копией буфера tmux (hardcopy)
  • One Solution collect form web for “Как скопировать из / в буфер обмена tmux с оболочками?”

    ТЛ; др

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

    Объяснение и справочная информация

    В tmux вся операция копирования / вставки проходит через стек буфера, где верхний индекс (индекс 0) является последним скопированным текстом и будет использоваться для вставки, когда индекс буфера явно не снабжен -b . Вы можете проверить текущие буферы с помощью tmux list-buffers или по умолчанию short-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 | ... tmux showb | ... : show-buffer печатает буфер в stdout, и это почти то, что требуется, но, как упоминает Крис Джонсен в комментариях , show-buffer выполняет восьмеричную кодировку непечатаемых символов ASCII и символов, отличных от ASCII. Это, к сожалению, довольно часто ломается, чтобы раздражать, даже простыми вещами, такими как строки с нулевым завершением или акцентированные латинские символы (например, (zsh) print -N á | tmux loadb - ; tmux showb prints \303\241\000 ).
    3. tmux saveb - | ... tmux saveb - | ... : save-buffer делает просто обратную сторону load-buffer и записывает необработанные байты, не модифицированные в stdin, что и требуется в большинстве случаев. Затем вы можете продолжить сборку другой трубы и, например. пройти через | xargs -n1 -I{} ... | xargs -n1 -I{} ... обрабатывать строку мудрый и т. д.
    Linux и Unix - лучшая ОС в мире.