Laut der Manpage von tmux ist es möglich, %if
die 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-shell
kann 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
, wennshell-command
er erfolgreich ist, andernfalls den zweiten. Vor der Ausführungshell-command
wird mit den im Abschnitt FORMATS angegebenen Regeln erweitert, einschließlich der für relevantentarget-pane
. Mit-b
wird der Shell-Befehl im Hintergrund ausgeführt.Wenn
-F
angegeben,shell-command
wird es nicht ausgeführt, aber als erfolgreich betrachtet, wenn es weder leer noch null ist (nachdem die Formate erweitert wurden).
(Quelle)
Jeder angegebene Befehl command
ist ein tmux-Befehl, er benötigt keine Shell. shell-command
benötigt eine Shell, sofern nicht -F
angegeben. Nicht jeder Test kann mit durchgeführt werden, -F
aber 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 -F
keine zusätzlichen Prozesse erzeugt werden, gehen Sie wie folgt vor:
- Arbeiten Sie innerhalb von tmux, damit der tmux-Server vorhanden ist. Sie benötigen zwei Bereiche. Erstellen Sie diese vorher.
Speichern Sie die PID des tmux-Servers:
pid="$(pgrep 'tmux: server')"
Überprüfen Sie zur Sicherheit, dass die Variable nicht leer ist:
echo "$pid"
Verwenden Sie
strace
diese Option, um festzustellen, ob der Server neue Prozesse erstellt (siehediese Antwort):strace -e fork,vfork,clone,execve -fb execve -p "$pid"
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'
Beobachten Sie, was
strace
ausgegeben wird. Es sollte keine Ausgabe erfolgen.* Dies bedeutet, dass kein zusätzlicher Prozess gestartet wurde.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 angezeigtstrace
.
* 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.