Jak kopiować z / do 'schowka' tmux za pomocą rur powłoki?

17

Podczas pracy w środowisku powłoki dość często spotykam się z potrzebą kopiowania „danych wyjściowych potoku pośredniego” (np. Z / do już działających edytorów, na inne powłoki, inne maszyny itp.).

W środowisku okienkowym łatwą (i ogólną) metodą rozwiązania tego problemu jest często schowek systemowy, np .:

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

Jak mogę uzyskać podobnie wygodne zachowanie za pomocą narzędzia kopiuj / wklej tmux?

nieprzemyślane
źródło

Odpowiedzi:

20

tl; dr

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

Wyjaśnienie i tło

W tmux wszystkie operacje kopiowania / wklejania przechodzą przez stos buforów, w którym górny (indeks 0) jest ostatnio skopiowanym tekstem i będzie używany do wklejania, gdy jawnie nie zostanie udostępniony indeks bufora -b. Możesz sprawdzić bieżące bufory za pomocą tmux list-bufferslub domyślnego skrótu tmux-prefix+ #.

Istnieją dwa sposoby na przesłanie do nowego bufora tmux na górze stosu, set-bufferpobranie argumentu ciągu i load-bufferpobranie argumentu pliku. Aby potokować do bufora, którego zwykle chcesz używać load-bufferze standardowym wejściem, np .:

print -l **/* | tmux loadb -

Wklejenie tego z powrotem do edytorów i takie jest dość oczywiste ( tmux-prefix+ ]lub cokolwiek, do czego się zobowiązałeś paste-buffer), jednak dostęp do pasty z wnętrza powłoki nie jest, ponieważ wywołanie paste-bufferspowoduje zapisanie pasty do standardowego wejścia, co kończy się edycją twojego terminalu bufor, a każda nowa linia w wierszu spowoduje, że powłoka wykona wszystko, co zostało wklejone do tej pory (potencjalnie świetny sposób na zrujnowanie twojego dnia).

Istnieje kilka sposobów podejścia do tego:

  1. tmux pasteb -s ' ': -szastępuje wszystkie zakończenia linii (separatory) dowolnym separatorem, który podasz. Jednak nadal zachowuje się to, paste-bufferco oznacza, że ​​wklejanie kończy się w buforze edycji terminala, co może być tym, czego chcesz, ale zwykle nie jest.
  2. tmux showb | ...: show-bufferdrukuje bufor na standardowe wyjście i jest prawie tym, co jest wymagane, ale jak wspomina Chris Johnsen w komentarzach , show-bufferwykonuje ósemkowe kodowanie niedrukowalnych znaków ASCII i znaków spoza ASCII. To niestety dość często przerwy być denerwujące, a nawet prostych rzeczy jak NUL ciągi lub akcentowane znaki Łacińskiej (np. (W zsh) print -N á | tmux loadb - ; tmux showbdrukuje \303\241\000).
  3. tmux saveb - | ...: save-bufferrobi po prostu odwrotność load-bufferi zapisuje nieprzetworzone bajty niezmodyfikowane do standardowego wejścia, co w większości przypadków jest pożądane. Następnie możesz kontynuować montaż innej rury, i np. przejść | xargs -n1 -I{} ...do linii technologicznej itp.
nieprzemyślane
źródło
1
tmux show-bufferwykona kodowanie ósemkowe znaków sterujących C0 i bajtów spoza ASCII (np. akcentowane znaki łacińskie itp.). Możesz użyć, tmux save-buffer -jeśli chcesz surowych bajtów (zwykle tego właśnie chcesz).
Chris Johnsen
@ChrisJohnsen Wielkie dzięki za złapanie tego, odpowiednio zaktualizowałem odpowiedź.
nieprzemyślane