%if を使用して現在のウィンドウがズームされていない場合は tmux コマンドを実行します。

%if を使用して現在のウィンドウがズームされていない場合は tmux コマンドを実行します。

tmux のマニュアル ページによると、コマンドを条件付きで実行するために使用できるようです%if。そのため、現在のペインがまだズームされていない場合は、これを使用しようとしています (そうでない場合は、ズームが解除されます)。

いくつかのバリエーションを試してみました

%if '#{window_zoomed_flag}' resize-pane -Z %endif

成功しませんでした。何かアイデアはありますか?

私がやろうとしていることを を使って実現する例をいくつか見てきましたがif-shell、私はそれを「ネイティブ」な tmux コマンドだけで実行したいと思います。「ネイティブ」とは、別のプロセスを生成しないことを意味します。

答え1

私がやろうとしていることを を使って実現する例をいくつか見てきましたがif-shell、私はそれを「ネイティブ」な tmux コマンドだけで実行したいと思います。「ネイティブ」とは、別のプロセスを生成しないことを意味します。

if-shellシェルを生成する場合と生成しない場合があります。説明を参照してください:

if-shell [-bF] [-t target-pane] shell-command command [command]

(別名: if)

commandが成功を返す場合は最初のコマンドを実行shell-commandし、そうでない場合は 2 番目のコマンドを実行します。 は、実行される前にshell-command、 に関連するものも含め、FORMATS セクションで指定されたルールを使用して展開されますtarget-pane。 を使用すると-b、shell-command はバックグラウンドで実行されます。

-Fが指定されている場合はshell-command実行されませんが、空でもゼロでもない場合は成功と見なされます (形式が展開された後)。

ソース

示されているコマンドはすべてcommandtmux コマンドであり、シェルは必要ありません。が指定されていないshell-command限り、シェルが必要です-F。 すべてのテストを実行できるわけではありません-Fが、あなたの場合は簡単です。 これにより、別のプロセスは生成されません。

tmux if-shell -F '#{window_zoomed_flag}' '' 'resize-pane -Z'

追加のプロセスが生成されないことを確認するにはif-shell -F、次の手順を実行します。

  1. tmux 内で作業するため、tmux サーバーが存在します。2 つのペインが必要になるので、事前に作成してください。
  2. tmux サーバーの PID を保存します。

    pid="$(pgrep 'tmux: server')"
    
  3. 念のため、変数が空でないことを確認してください。

    echo "$pid"
    
  4. straceサーバーが新しいプロセスを作成するかどうかを知るために使用します(この答え):

    strace -e fork,vfork,clone,execve -fb execve -p "$pid"
    
  5. 他のペインを選択して呼び出します:

    tmux if-shell -F '#{window_zoomed_flag}' '' 'resize-pane -Z'
    # now similar command to unzoom
    tmux if-shell -F '#{window_zoomed_flag}' 'resize-pane -Z'
    
  6. 印刷された内容を確認しますstrace。出力がないはずです。* これは、追加のプロセスが生成されなかったことを意味します。

  7. 比較すると、これらは なしで同等のコマンドです-Fが、シェルを生成します。

    tmux if-shell '[ #{window_zoomed_flag} -eq 1 ]' '' 'resize-pane -Z'
    # now similar command to unzoom
    tmux if-shell '[ #{window_zoomed_flag} -eq 1 ]' 'resize-pane -Z'
    

    各コマンドはexecve("/bin/sh", …からの出力に表示されますstrace


* ペインのズームまたはサイズ変更によってトリガーされるフックを使用し、フックが別のプロセスを生成する場合を除きます。テストの妨げにならないように、フックを一時的に削除します。

関連情報