Ejecute el comando tmux si la ventana actual no está ampliada usando %if

Ejecute el comando tmux si la ventana actual no está ampliada usando %if

Según la página de manual de tmux, es posible utilizarlo %ifpara ejecutar condicionalmente sus comandos. Así que estoy tratando de usarlo para hacer zoom en el panel actual si aún no lo está (de lo contrario, lo quitaría).

Probé algunas variaciones de

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

sin éxito. ¿Algunas ideas?

He visto algunos ejemplos para lograr lo que estoy tratando de hacer usando if-shell, pero me gustaría hacerlo solo con comandos tmux 'nativos'. Por "nativo" me refiero a no generar otro proceso.

Respuesta1

He visto algunos ejemplos para lograr lo que estoy tratando de hacer usando if-shell, pero me gustaría hacerlo solo con comandos tmux 'nativos'. Por "nativo" me refiero a no generar otro proceso.

if-shellpuede o no generar un caparazón. Ver la descripción:

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

(alias: if)

Ejecute el primero commandsi shell-commandel resultado es exitoso o el segundo comando en caso contrario. Antes de ser ejecutado, shell-commandse expande utilizando las reglas especificadas en la sección FORMATOS, incluidas las relevantes para target-pane. Con -b, el comando shell se ejecuta en segundo plano.

Si -Fse proporciona, shell-commandno se ejecuta pero se considera exitoso si no está vacío ni es cero (después de expandir los formatos).

(fuente)

Cualquier comando indicado commandes un comando tmux, no necesita un shell. shell-commandnecesita un caparazón a menos que -Fse le dé. No todas las pruebas se pueden realizar, -Fpero en su caso es fácil. Esto no generará otro proceso:

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

Para confirmar que if-shell -Fno genera procesos adicionales, haga lo siguiente:

  1. Trabaje dentro de tmux, para que exista el servidor tmux. Necesitará dos paneles; crearlos de antemano.
  2. Almacene el PID del servidor tmux:

    pid="$(pgrep 'tmux: server')"
    
  3. Verifique que la variable no esté vacía, por si acaso:

    echo "$pid"
    
  4. Se utiliza stracepara saber si el servidor crea nuevos procesos (veresta respuesta):

    strace -e fork,vfork,clone,execve -fb execve -p "$pid"
    
  5. Seleccione el otro panel e invoque:

    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. Observe lo que straceimprimió. No debería haber ningún resultado.* Esto significa que no se generó ningún proceso adicional.

  7. A modo de comparación, estos son comandos equivalentes sin -F, generan 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'
    

    Cada comando aparecerá execve("/bin/sh", …en la salida de strace.


* A menos que utilice un gancho activado por un panel que se está ampliando o cambiando de tamaño, y el gancho genera otro proceso. Retire temporalmente el gancho para que no interfiera con la prueba.

información relacionada