Según la página de manual de tmux, es posible utilizarlo %if
para 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-shell
puede 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
command
sishell-command
el resultado es exitoso o el segundo comando en caso contrario. Antes de ser ejecutado,shell-command
se expande utilizando las reglas especificadas en la sección FORMATOS, incluidas las relevantes paratarget-pane
. Con-b
, el comando shell se ejecuta en segundo plano.Si
-F
se proporciona,shell-command
no se ejecuta pero se considera exitoso si no está vacío ni es cero (después de expandir los formatos).
(fuente)
Cualquier comando indicado command
es un comando tmux, no necesita un shell. shell-command
necesita un caparazón a menos que -F
se le dé. No todas las pruebas se pueden realizar, -F
pero 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 -F
no genera procesos adicionales, haga lo siguiente:
- Trabaje dentro de tmux, para que exista el servidor tmux. Necesitará dos paneles; crearlos de antemano.
Almacene el PID del servidor tmux:
pid="$(pgrep 'tmux: server')"
Verifique que la variable no esté vacía, por si acaso:
echo "$pid"
Se utiliza
strace
para saber si el servidor crea nuevos procesos (veresta respuesta):strace -e fork,vfork,clone,execve -fb execve -p "$pid"
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'
Observe lo que
strace
imprimió. No debería haber ningún resultado.* Esto significa que no se generó ningún proceso adicional.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 destrace
.
* 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.