Wie kopiere ich mit Shell Pipes von / in die tmux 'Zwischenablage'?

17

Wenn ich in einer Shell-Umgebung arbeite, stoße ich ziemlich oft auf die Notwendigkeit, "Intermediate-Pipe-Ausgaben" zu kopieren (z. B. von / zu bereits laufenden Editoren, zu anderen Shells, anderen Maschinen usw.).

In einer Windows-Umgebung erfolgt eine einfache (und generische) Lösung häufig über die System-Zwischenablage, z.

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

Wie kann ich mit der tmux-Funktion zum Kopieren / Einfügen ein ähnlich komfortables Verhalten erzielen?

ungedacht
quelle

Antworten:

20

tl; dr

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

Erklärung & Hintergrund

In tmux durchlaufen alle Kopier- / Einfügevorgänge den Pufferstapel, wobei der oberste (Index 0) der zuletzt kopierte Text ist und zum Einfügen verwendet wird, wenn kein Pufferindex explizit bereitgestellt wird -b. Sie können die aktuellen Puffer mit tmux list-buffersoder der Standardverknüpfung tmux-prefix+ anzeigen #.

Es gibt zwei Möglichkeiten, in einen neuen tmux-Puffer oben im Stapel zu leiten, set-bufferein String-Argument und load-bufferein Datei-Argument zu übernehmen. Um in einen Puffer zu load-bufferleiten, möchten Sie normalerweise mit stdin arbeiten, zB:

print -l **/* | tmux loadb -

Das Einfügen in Editoren und Ähnliches ist ziemlich offensichtlich ( tmux-prefix+ ]oder was auch immer Sie gebunden haben paste-buffer), der Zugriff auf die Paste aus der Shell heraus jedoch nicht, da das Aufrufen paste-bufferdie Paste in stdin schreibt, was in der Bearbeitung Ihres Terminals endet Puffer, und jede neue Zeile in der Paste bewirkt, dass die Shell das ausführt, was bisher eingefügt wurde (möglicherweise eine großartige Möglichkeit, Ihren Tag zu ruinieren).

Es gibt verschiedene Möglichkeiten, dies zu erreichen:

  1. tmux pasteb -s ' ': -sErsetzt alle Zeilenenden (Trennzeichen) durch das von Ihnen angegebene Trennzeichen. Sie erhalten jedoch immer noch das Verhalten, paste-bufferdas bedeutet, dass die Paste in Ihrem Terminal-Bearbeitungspuffer landet. Dies kann das sein, was Sie wollen, ist es aber normalerweise nicht.
  2. tmux showb | ...: show-bufferdruckt den Puffer auf stdout und ist fast erforderlich, aber wie Chris Johnsen in den Kommentaren erwähnt , show-bufferführt er eine oktale Codierung von nicht druckbaren ASCII-Zeichen und Nicht-ASCII-Zeichen durch. Dies unterbricht leider oft genug, um ärgerlich zu sein, selbst bei einfachen Dingen wie nullterminierten Zeichenfolgen oder lateinischen Zeichen mit Akzent (z. B. (in zsh) print -N á | tmux loadb - ; tmux showb-Prints \303\241\000).
  3. tmux saveb - | ...: save-buffermacht einfach das Gegenteil von load-bufferund schreibt die rohen Bytes unverändert in stdin, was in den meisten Fällen erwünscht ist. Sie könnten dann weiter ein anderes Rohr montieren, und z. durchlaufen | xargs -n1 -I{} ..., um zeilenweise zu verarbeiten, usw.
ungedacht
quelle
1
tmux show-bufferDie oktale Codierung von C0-Steuerzeichen und Nicht-ASCII-Bytes (z. B. lateinische Zeichen mit Akzent usw.) wird durchgeführt. Sie können verwenden, tmux save-buffer -wenn Sie die unformatierten Bytes möchten (dies ist normalerweise das, was Sie möchten).
Chris Johnsen
@ChrisJohnsen Vielen Dank, dass du das verstanden hast. Ich habe die Antwort entsprechend aktualisiert.
Ungedacht