根据 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
不生成任何其他进程,请执行以下操作:
- 在 tmux 内部工作,因此 tmux 服务器存在。您将需要两个窗格;预先创建它们。
存储 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
,它们会生成 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
。
* 除非您使用由缩放或调整大小的窗格触发的钩子,并且该钩子会生成另一个进程。暂时取下挂钩,以免干扰测试。