Execute o comando tmux se a janela atual não estiver ampliada usando% if

Execute o comando tmux se a janela atual não estiver ampliada usando% if

De acordo com a página de manual do tmux, é possível usar %ifpara executar condicionalmente seus comandos. Então, estou tentando usá-lo para ampliar o painel atual, se ele ainda não estiver ampliado (caso contrário, o zoom seria cancelado).

Eu tentei algumas variações de

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

sem sucesso. Alguma ideia?

Tenho alguns exemplos para conseguir o que estou tentando fazer usando if-shell, mas gostaria de fazer isso apenas com comandos tmux 'nativos'. Por 'nativo' quero dizer não gerar outro processo.

Responder1

Tenho alguns exemplos para conseguir o que estou tentando fazer usando if-shell, mas gostaria de fazer isso apenas com comandos tmux 'nativos'. Por 'nativo' quero dizer não gerar outro processo.

if-shellpode ou não gerar um shell. Veja a descrição:

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

(alias if:)

Execute o primeiro commandse shell-commandretornar sucesso ou o segundo comando caso contrário. Antes de ser executado, shell-commandé expandido usando as regras especificadas na seção FORMATS, incluindo aquelas relevantes para target-pane. Com -b, o comando shell é executado em segundo plano.

Se -Ffor fornecido, shell-commandnão será executado, mas será considerado um sucesso se não estiver vazio nem zero (após a expansão dos formatos).

(fonte)

Qualquer comando indicado commandé um comando tmux, não precisa de um shell. shell-commandprecisa de um shell, a menos que -Fseja fornecido. Nem todos os testes podem ser realizados, -Fmas no seu caso é fácil. Isso não gerará outro processo:

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

Para confirmar que if-shell -Fnão gera processos adicionais, faça o seguinte:

  1. Trabalhe dentro do tmux, então o servidor tmux existe. Você precisará de dois painéis; criá-los de antemão.
  2. Armazene o PID do servidor tmux:

    pid="$(pgrep 'tmux: server')"
    
  3. Verifique se a variável não está vazia, apenas para garantir:

    echo "$pid"
    
  4. Use stracepara saber se o servidor cria novos processos (vejaesta resposta):

    strace -e fork,vfork,clone,execve -fb execve -p "$pid"
    
  5. Selecione o outro painel 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 o que stracefoi impresso. Não deve haver saída.* Isso significa que nenhum processo adicional foi gerado.

  7. Para efeito de comparação, estes são comandos equivalentes sem -F, eles geram 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", …na saída de strace.


* A menos que você use um gancho acionado por um painel sendo ampliado ou redimensionado, e o gancho gere outro processo. Remova temporariamente o gancho para que não interfira no teste.

informação relacionada