如果目前視窗未使用 %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


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

相關內容