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
実行されませんが、空でもゼロでもない場合は成功と見なされます (形式が展開された後)。
(ソース)
示されているコマンドはすべてcommand
tmux コマンドであり、シェルは必要ありません。が指定されていないshell-command
限り、シェルが必要です-F
。 すべてのテストを実行できるわけではありません-F
が、あなたの場合は簡単です。 これにより、別のプロセスは生成されません。
tmux if-shell -F '#{window_zoomed_flag}' '' 'resize-pane -Z'
追加のプロセスが生成されないことを確認するにはif-shell -F
、次の手順を実行します。
- tmux 内で作業するため、tmux サーバーが存在します。2 つのペインが必要になるので、事前に作成してください。
tmux サーバーの PID を保存します。
pid="$(pgrep 'tmux: server')"
念のため、変数が空でないことを確認してください。
echo "$pid"
strace
サーバーが新しいプロセスを作成するかどうかを知るために使用します(この答え):strace -e fork,vfork,clone,execve -fb execve -p "$pid"
他のペインを選択して呼び出します:
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'
印刷された内容を確認します
strace
。出力がないはずです。* これは、追加のプロセスが生成されなかったことを意味します。比較すると、これらは なしで同等のコマンドです
-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
。
* ペインのズームまたはサイズ変更によってトリガーされるフックを使用し、フックが別のプロセスを生成する場合を除きます。テストの妨げにならないように、フックを一時的に削除します。