根據 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
。
* 除非您使用由縮放或調整大小的窗格觸發的鉤子,並且該鉤子會產生另一個進程。暫時取下掛鉤,以免干擾測試。