シェルパイプを使用してtmuxの「クリップボード」との間でコピーする方法


17

シェル環境で作業するとき、「中間パイプ出力」をコピーする必要性にかなり頻繁に遭遇します(たとえば、既に実行中のエディターから、他のシェル、他のマシンなどへ)。

ウィンドウ環境では、これを解決する簡単な(そして一般的な)方法は、多くの場合、システムクリップボードを介したものです。

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

tmuxのコピー/貼り付け機能を使用して、同様の便利な動作を取得するにはどうすればよいですか?

回答:


20

tl; dr

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

説明と背景

tmuxでは、すべてのコピー/貼り付けアクティビティはバッファスタックを通過します。トップ(インデックス0)は最新のコピーテキストであり、バッファインデックスが明示的に提供されていない場合の貼り付けに使用され-bます。tmux list-buffersまたはデフォルトのショートカットtmux-prefix+を使用して、現在のバッファーを検査できます#

スタックの一番上にある新しいtmuxバッファにパイピングするにはset-buffer、文字列引数をload-buffer取り、ファイル引数をとる2つの方法があります。通常load-buffer、stdinで使用するバッファにパイプするには、次のようにします。

print -l **/* | tmux loadb -

編集者にこのバックを貼り付けると、そのようなはかなり明白である(tmux-prefix+ ]またはものは何でもあなたがバインドしましpaste-buffer呼び出しがあるため、シェルの内部からペーストにアクセスし、しかし、されていないために)paste-bufferあなたの端末の編集で終わる標準入力にペーストを、書きますバッファ、およびペースト内のすべての改行により、シェルはこれまでに貼り付けられたものをすべて実行します(1日を台無しにする素晴らしい方法)。

これにアプローチする方法はいくつかあります。

  1. tmux pasteb -s ' '-sすべての行末(区切り文字)を、指定した区切り文字に置き換えます。しかし、あなたはまだその動作を得るpaste-bufferので、ペーストは最終的に端末編集バッファに行き着きます。これはあなたの望むものかもしれませんが、通常そうではありません。
  2. tmux showb | ...show-bufferバッファーをstdoutに出力します。これはほとんど必要なものですが、Chris Johnsenがコメント述べているようにshow-buffer印刷不可能なASCII文字と非ASCII文字の8進エンコードを実行します。十分な頻度でこの残念な休憩は、NULL終端文字列やアクセントラテン文字(例えば。(zshの中)のようにもシンプルなもので、いらいらすることにするprint -N á | tmux loadb - ; tmux showb版画\303\241\000)。
  3. tmux saveb - | ...save-buffer単に逆の処理をload-buffer行い、未変更のバイトを変更せずにstdinに書き込みます。これはほとんどの場合に望ましいことです。その後、別のパイプを組み立て続けることができます。通過| xargs -n1 -I{} ...など、賢明なプロセスラインに..

1
tmux show-bufferC0制御文字および非ASCIIバイト(アクセント付きラテン文字など)の8進エンコードを行います。tmux save-buffer -生のバイトが必要な場合に使用できます(通常はこれが必要です)。
クリスジョンセン

@ChrisJohnsenそれをキャッチしてくれてありがとう、それに応じて答えを更新しました。
12
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.