Як скопіювати з / у tmux 'буфер обміну' з оболонками?


17

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

Перебуваючи у віконному середовищі, простий (і загальний) спосіб вирішити це часто відбувається через буфер обміну системи, наприклад:

  • X11: ... | xsel -i/xsel -o | ...
  • ОС 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і записує необроблені байти незмінені в stdin, що саме бажано в більшості випадків. Потім ви можете продовжити збирання іншої труби, наприклад. пройти через | xargs -n1 -I{} ...обробку лінії розумно тощо.

1
tmux show-bufferзробить восьмеричне кодування контрольних символів C0 та байтів, що не належать до ASCII (наприклад, наголошені латинські символи тощо). Ви можете використовувати, tmux save-buffer -якщо хочете необроблені байти (зазвичай це те, що ви хочете).
Кріс Джонсен

@ChrisJohnsen Велике спасибі за те, що я це зрозумів, відповідь я оновив відповідно.
несподівано
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.