De acordo com a página de manual do tmux, é possível usar %if
para 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-shell
pode 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
command
seshell-command
retornar 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 paratarget-pane
. Com-b
, o comando shell é executado em segundo plano.Se
-F
for fornecido,shell-command
nã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-command
precisa de um shell, a menos que -F
seja fornecido. Nem todos os testes podem ser realizados, -F
mas 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 -F
não gera processos adicionais, faça o seguinte:
- Trabalhe dentro do tmux, então o servidor tmux existe. Você precisará de dois painéis; criá-los de antemão.
Armazene o PID do servidor tmux:
pid="$(pgrep 'tmux: server')"
Verifique se a variável não está vazia, apenas para garantir:
echo "$pid"
Use
strace
para saber se o servidor cria novos processos (vejaesta resposta):strace -e fork,vfork,clone,execve -fb execve -p "$pid"
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'
Observe o que
strace
foi impresso. Não deve haver saída.* Isso significa que nenhum processo adicional foi gerado.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 destrace
.
* 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.