如果当前窗口未使用 %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返回成功则执行第一个命令,否则执行第二个命令。在执行之前,shell-command使用 FORMATS 部分中指定的规则进行扩展,包括与target-pane.使用 时-b,shell 命令会在后台运行。

如果-F给定,shell-command则不执行,但如果既不为空也不为零(在扩展格式后),则认为成功。

来源

任何表示的命令command都是 tmux 命令,它不需要 shell。除非给出,shell-command否则需要一个 shell 。-F并非所有测试都可以执行,-F但就您而言,这很容易。这不会产生另一个进程:

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

要确认if-shell -F不生成任何其他进程,请执行以下操作:

  1. 在 tmux 内部工作,因此 tmux 服务器存在。您将需要两个窗格;预先创建它们。
  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,它们会生成 shell:

    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


* 除非您使用由缩放或调整大小的窗格触发的钩子,并且该钩子会生成另一个进程。暂时取下挂钩,以免干扰测试。

相关内容