
tmuxコピーモードでいくつかのテキストを選択するときに、事前定義されたキーバインディングを使用せずに選択したテキストに対してシステムコマンドを呼び出すことはできますか?
たとえば、電話をかけてpastebin
選択したテキストをPastebinに送信したり、電話をかけたりする回数をカウントwc
できます。私は成功せずに次のことを試しました。
- テキストの選択
c-b [
- 両方の方法を試しました。
:
コマンドモードに入るを押します。 「行に移動」というメッセージが表示されるため、機能しません。- 押すと
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コードを保存するため)。
答え2
NotTheDr01dsベース回答、完全な解決策を得ました。
bind-key -T copy-mode ! command-prompt -p "cmd:" "send-keys -X copy-selection-no-clear \; run-shell \"tmux show-buffer | %1\" "
bind-key -T copy-mode-vi ! command-prompt -p "cmd:" "send-keys -X copy-selection-no-clear \; run-shell \"tmux show-buffer | %1\" "
使用法:いくつかのテキストを選択してを押します!
。シェルコマンドを実行するように求められます。選択したテキストは、シェルコマンドの標準入力として提供されます。シェルコマンドの標準出力がtmuxウィンドウに再表示されます。
素晴らしいヒントをいただきありがとうございます NotTheDr01ds!