Führen Sie den tmux-Befehl aus, wenn das aktuelle Fenster nicht mit %if gezoomt ist

Führen Sie den tmux-Befehl aus, wenn das aktuelle Fenster nicht mit %if gezoomt ist

Laut der Manpage von tmux ist es möglich, %ifdie Befehle bedingt auszuführen. Ich versuche also, damit den aktuellen Bereich zu vergrößern, wenn er nicht bereits vergrößert ist (sonst würde er verkleinert).

Ich habe einige Variationen ausprobiert

%if '#{window_zoomed_flag}' resize-pane -Z %endif

ohne Erfolg. Irgendwelche Ideen?

Ich habe einige Beispiele gesehen, um das zu erreichen, was ich versuche if-shell, aber ich möchte es nur mit „nativen“ tmux-Befehlen tun. Mit „nativ“ meine ich, dass kein weiterer Prozess gestartet wird.

Antwort1

Ich habe einige Beispiele gesehen, um das zu erreichen, was ich versuche if-shell, aber ich möchte es nur mit „nativen“ tmux-Befehlen tun. Mit „nativ“ meine ich, dass kein weiterer Prozess gestartet wird.

if-shellkann eine Shell erzeugen oder nicht. Siehe die Beschreibung:

if-shell [-bF] [-t target-pane] shell-command command [command]

(alias: if)

Führen Sie den ersten Befehl aus command, wenn shell-commander erfolgreich ist, andernfalls den zweiten. Vor der Ausführung shell-commandwird mit den im Abschnitt FORMATS angegebenen Regeln erweitert, einschließlich der für relevanten target-pane. Mit -bwird der Shell-Befehl im Hintergrund ausgeführt.

Wenn -Fangegeben, shell-commandwird es nicht ausgeführt, aber als erfolgreich betrachtet, wenn es weder leer noch null ist (nachdem die Formate erweitert wurden).

(Quelle)

Jeder angegebene Befehl commandist ein tmux-Befehl, er benötigt keine Shell. shell-commandbenötigt eine Shell, sofern nicht -Fangegeben. Nicht jeder Test kann mit durchgeführt werden, -Faber in Ihrem Fall ist es einfach. Dies wird keinen weiteren Prozess erzeugen:

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

Um zu bestätigen, dass if-shell -Fkeine zusätzlichen Prozesse erzeugt werden, gehen Sie wie folgt vor:

  1. Arbeiten Sie innerhalb von tmux, damit der tmux-Server vorhanden ist. Sie benötigen zwei Bereiche. Erstellen Sie diese vorher.
  2. Speichern Sie die PID des tmux-Servers:

    pid="$(pgrep 'tmux: server')"
    
  3. Überprüfen Sie zur Sicherheit, dass die Variable nicht leer ist:

    echo "$pid"
    
  4. Verwenden Sie stracediese Option, um festzustellen, ob der Server neue Prozesse erstellt (siehediese Antwort):

    strace -e fork,vfork,clone,execve -fb execve -p "$pid"
    
  5. Wählen Sie den anderen Bereich aus und rufen Sie Folgendes auf:

    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. Beobachten Sie, was straceausgegeben wird. Es sollte keine Ausgabe erfolgen.* Dies bedeutet, dass kein zusätzlicher Prozess gestartet wurde.

  7. Zum Vergleich: Dies sind gleichwertige Befehle ohne -F, sie erzeugen Shells:

    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'
    

    Jeder Befehl wird execve("/bin/sh", …in der Ausgabe von angezeigt strace.


* Sofern Sie keinen Hook verwenden, der durch das Zoomen oder Ändern der Größe eines Bereichs ausgelöst wird, und der Hook einen anderen Prozess startet, entfernen Sie den Hook vorübergehend, damit er den Test nicht beeinträchtigt.

verwandte Informationen