web-dev-qa-db-ja.com

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

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

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

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

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

18
unthought

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日を台無しにする素晴らしい方法)。

これに取り組むにはいくつかの方法があります:

  1. tmux pasteb -s ' '-sは、すべての行末(セパレータ)を指定したセパレータに置き換えます。ただし、paste-bufferの動作は引き続き得られます。つまり、貼り付けは最終的に端末編集バッファーに入れられますが、これは必要なことかもしれませんが、通常はそうではありません。
  2. tmux showb | ...show-bufferはバッファをstdoutに出力しますが、これはほとんど必要なことですが、 Chris Johnsenがコメントで言及している のように、show-bufferは印刷できないASCII文字の8進エンコーディングを実行します残念ながら、これは、nullで終了する文字列やアクセント付きのラテン文字(例:(zshの場合)print -N á | tmux loadb - ; tmux showb\303\241\000を出力する)のような単純なものでさえ、迷惑になるほど頻繁に壊れます。
  3. tmux saveb - | ...save-bufferは単にload-bufferの逆を行い、未加工のバイトを変更せずにstdinに書き込みます。これはほとんどの場合に必要です。次に、別のパイプを組み立て続けることができます。 | xargs -n1 -I{} ...をパススルーして行ごとに処理します。
21
unthought