tmuxコピーモードで任意のコマンドを実行する

tmuxコピーモードで任意のコマンドを実行する

tmuxコピーモードでいくつかのテキストを選択するときに、事前定義されたキーバインディングを使用せずに選択したテキストに対してシステムコマンドを呼び出すことはできますか?

たとえば、電話をかけてpastebin選択したテキストをPastebinに送信したり、電話をかけたりする回数をカウントwcできます。私は成功せずに次のことを試しました。

  1. テキストの選択c-b [
  2. 両方の方法を試しました。
    1. :コマンドモードに入るを押します。 「行に移動」というメッセージが表示されるため、機能しません。
    2. 押すとc-b :copy-pipe wc- コピーパイプが不明なコマンドなので動作しません。

注:私はTmux 3.1cを使用しています。

私はこの解決策を知っています。これ。ただし、これを行うには、すべてのユースケースを予測して実行できるすべてのコマンドのキーバインディングを事前定義する必要があります。

Vimではこれがサポートされています。つまり、テキストを選択し、:!<system_command>テキストをsystem_command

ベストアンサー1

あなたは少なくとも目標に近づいています。コピーモードコマンドは経由で送信する必要がありますsendkeys -X

したがって、選択したテキストをコマンドにパイプするには、次のようにします。

  • Prefix :
  • send-keys -X copy-pipe "wc"

しかし、Tmuxはcopy-pipeどこにも出力を表示しません。を使用すると、run-command出力がコピーバッファに表示されます。の場合copy-pipe、ただ捕まえたようでした。他の回答にリンクした例はバッファを保存するだけなので、出力/フィードバックは必要ありません。

これはwc。私が推測する出力はpastebin非常に便利なURLです...

私が見つけた最も簡単な選択肢は、混乱し始めることです。特にこれは、任意のコマンドを使用してこれを実行しようとするためです。

  • Prefix :
  • send-keys -X copy-selection-no-clear ; run-shell "tmux show-buffer | wc"

項目が選択されていることを確認するためのエラーチェックはありません。単にshow-buffer最新のバッファで実行されます。

IMHOはおそらくより良い選択肢でしょう

Vimはこのユースケースに精通しています。vimプロセス置換を使用するときにスクロールバックバッファをオンにするキーバインディングを設定します。

シェルでテストする場合(テスト済み):

tmux bind-key -T copy-mode v new-window -d -n scrollback "vi <(tmux capture-pane -p -S - -E -)" \\\; run-shell "sleep 1" \\\; select-window -t scrollback

または設定(テストされていない)から:

bind-key -T copy-mode v new-window -d -n scrollback "vi <(tmux capture-pane -p -S - -E -)" \; run-shell "sleep 1" \; select-window -t scrollback

Hacky、そうです。より大きなバッファを追加する必要があるかもしれませんsleep。まだテストしたことがありません。おそらくより良い方法があります。しかし、これが私が思いついた方法です。

また、ANSIカラーコードは失われますが、次のコマンドを使用してそれを処理できます(興味がある場合)。アンシーESCVIM拡張子-eとして追加されますcapture-buffer(バッファリングされた出力からANSIコードを保存するため)。

おすすめ記事