シェル環境で作業するときは、「中間パイプの出力」(たとえば、すでに実行されているエディタ、他のシェル、他のコンピュータなど)をコピーする必要がある状況によく遭遇します。
ウィンドウ環境でこの問題を解決する簡単な(一般的な)方法は、通常システムクリップボードを使用することです。たとえば、次のようになります。
- X11:
... | xsel -i
/xsel -o | ...
- オペレーティングシステム:
... | pbcopy
/pbpaste | ...
tmuxコピー/貼り付けツールを使用して、同様の便利な動作をどのように取得できますか?
答え1
長すぎます。
... | 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
貼り付けをstdoutに書き出し、端末の編集バッファに保存されるためです。そして、貼り付け内容に新しい行を入力すると、シェルはこれまでに貼り付けた内容を実行します(潜在的に1日を台無しにするのに最適な方法です)。
この問題を解決する方法はいくつかあります。
tmux pasteb -s ' '
:-s
すべての行末(区切り記号)をユーザーが提供する区切り文字に置き換えます。ただし、この動作がまだ発生します。paste-buffer
これは、貼り付けが端末編集バッファで終了することを意味します。これは望むものかもしれませんが、一般的にそうではありません。tmux showb | ...
:show-buffer
バッファをstdoutとして印刷します。これはほとんど必要なものですが、次のようになります。Chris Johnsonによるコメント、show-buffer
印刷できないASCII文字と非ASCII文字の8進符号化を実行します。残念ながら、これはnullで終わる文字列やアクセント付きのラテン文字(zsh'sprint -N á | tmux loadb - ; tmux showb
prints\303\241\000
)のような単純なものでもしばしば壊れて面倒です。tmux saveb - | ...
:save-buffer
その逆を実行しload-buffer
、未変更の生バイトを標準出力に書き込みます。これはほとんどの場合に必要なものです。その後、例えば別のパイプ組立を進めることができる。| xargs -n1 -I{} ...
プロセス方式などで行います。