シェル環境で作業しているとき、「中間パイプ出力」をコピーする必要がかなり頻繁に発生します(たとえば、既に実行中のエディターから/へ、他のシェル、他のマシンなどへ)。
ウィンドウ環境では、これを解決するための簡単な(そして一般的な)メソッドは、多くの場合、システムクリップボードを使用します。
... | xsel -i
/xsel -o | ...
... | pbcopy
/pbpaste | ...
Tmuxのコピー/貼り付け機能を使用して、同様に便利な動作を得るにはどうすればよいですか?
tl; dr
... | tmux loadb -
tmux saveb - | ...
説明と背景
Tmuxでは、すべてのコピー/貼り付けアクティビティは バッファスタック を通過します。ここで、先頭(インデックス0)は最後にコピーされたテキストであり、-b
で明示的にバッファインデックスが提供されていない場合に貼り付けに使用されます。 tmux list-buffers
またはデフォルトのショートカットを使用して現在のバッファを検査できます tmux-prefix+#。
スタックの最上部にある新しいtmuxバッファーにパイプする方法は2つあります。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
の動作は引き続き得られます。つまり、貼り付けは最終的に端末編集バッファーに入れられますが、これは必要なことかもしれませんが、通常はそうではありません。tmux showb | ...
:show-buffer
はバッファをstdoutに出力しますが、これはほとんど必要なことですが、 Chris Johnsenがコメントで言及している のように、show-buffer
は印刷できないASCII文字の8進エンコーディングを実行します残念ながら、これは、nullで終了する文字列やアクセント付きのラテン文字(例:(zshの場合)print -N á | tmux loadb - ; tmux showb
が\303\241\000
を出力する)のような単純なものでさえ、迷惑になるほど頻繁に壊れます。tmux saveb - | ...
:save-buffer
は単にload-buffer
の逆を行い、未加工のバイトを変更せずにstdinに書き込みます。これはほとんどの場合に必要です。次に、別のパイプを組み立て続けることができます。 | xargs -n1 -I{} ...
をパススルーして行ごとに処理します。