tmuxinator em ação — tmuxinator/tmuxinator, licença MIT
1. Fechando a Série
Nas três primeiras partes desta série, cobrimos o que é o tmux, os comandos de navegação entre sessões/janelas/painéis e a personalização via ~/.tmux.conf e plugins. Este último artigo é sobre uso avançado: como automatizar a criação de layouts complexos, integrar o tmux com fluxos de trabalho remotos, sincronizar comandos entre múltiplos servidores e ajustar detalhes de configuração que fazem diferença no uso intenso do dia a dia.
2. Automatizando Sessões com Scripts
Montar manualmente o mesmo layout (editor, servidor, logs) toda vez que um projeto é retomado é repetitivo. A própria CLI do tmux permite montar uma sessão inteira via script, sem interação manual:
#!/bin/bash
# start-project.sh — monta a sessão de trabalho do projeto "blog"
SESSION="blog"
tmux new-session -d -s "$SESSION" -c ~/projects/blog
# Janela 0: editor
tmux rename-window -t "$SESSION:0" "editor"
tmux send-keys -t "$SESSION:editor" "nvim ." C-m
# Janela 1: servidor + logs, dividida em dois painéis
tmux new-window -t "$SESSION" -n "server" -c ~/projects/blog
tmux send-keys -t "$SESSION:server" "npm run dev" C-m
tmux split-window -t "$SESSION:server" -v -c ~/projects/blog
tmux send-keys -t "$SESSION:server" "tail -f logs/app.log" C-m
# Janela 2: terminal solto, sem comando automático
tmux new-window -t "$SESSION" -n "shell" -c ~/projects/blog
tmux select-window -t "$SESSION:editor"
tmux attach -t "$SESSION"
Rodar ./start-project.sh recria o layout inteiro em segundos. Para projetos com estrutura parecida, ferramentas como o tmuxinator ou o tmuxp fazem o mesmo a partir de um arquivo YAML declarativo, o que fica mais legível quando há muitas janelas e painéis envolvidos:
# .tmuxp.yaml
session_name: blog
start_directory: ~/projects/blog
windows:
- window_name: editor
panes:
- nvim .
- window_name: server
layout: even-vertical
panes:
- npm run dev
- tail -f logs/app.log
- window_name: shell
panes:
- ""
tmuxp load .tmuxp.yaml
3. Persistência de Sessões em Servidores Remotos
O caso de uso mais comum em produção é abrir uma sessão nomeada logo após conectar via SSH, sempre reaproveitando a mesma se já existir:
ssh usuario@servidor -t 'tmux new-session -A -s trabalho'
A flag -A faz o tmux anexar à sessão trabalho se ela já existir, ou criá-la se ainda não existir — elimina a necessidade de lembrar se já havia uma sessão aberta antes. Combinado com tmux-resurrect e tmux-continuum (vistos na parte anterior), até uma reinicialização do servidor não é motivo para perder o layout: basta reconectar e rodar prefix + Ctrl+r para restaurar.
4. Sincronizando Painéis Entre Múltiplos Hosts
tmux-resurrect — screencast completo no Vimeo, tmux-plugins/tmux-resurrect, licença MIT
Quando o mesmo comando precisa rodar em vários servidores ao mesmo tempo (por exemplo, checar a versão de um pacote em todos os nós de um cluster), o tmux permite espelhar a digitação em todos os painéis abertos de uma janela:
# Uma janela com um painel por servidor, cada um já conectado via SSH
tmux new-window -n "cluster"
tmux send-keys -t "cluster.0" "ssh node1" C-m
tmux split-window -t "cluster"
tmux send-keys -t "cluster.1" "ssh node2" C-m
tmux split-window -t "cluster"
tmux send-keys -t "cluster.2" "ssh node3" C-m
tmux select-layout -t "cluster" tiled
# Ativa a sincronização: tudo que for digitado vai para todos os painéis
tmux setw synchronize-panes on
Com synchronize-panes on, qualquer comando digitado é replicado em tempo real em todos os painéis da janela — útil para operações repetitivas em múltiplos hosts, mas vale lembrar de desativar (synchronize-panes off) antes de rodar algo destrutivo em apenas um deles por engano.
5. Tmux Dentro de Tmux (Sessões Aninhadas)
Ao conectar via SSH a um servidor remoto que também roda tmux, de dentro de uma sessão tmux local, o prefixo do teclado passa a ser interpretado pela sessão mais externa (a local), não pela remota. A solução mais comum é alternar temporariamente o destino do prefixo com Ctrl+x Ctrl+x (pressionar o prefixo duas vezes envia o segundo diretamente para a sessão interna), ou configurar um prefixo alternativo específico para uso remoto:
# No .tmux.conf da sessão externa (local), o segundo Ctrl+x repassa para a interna
bind-key -n C-x send-prefix
Uma alternativa mais simples no dia a dia é usar Ctrl+b d para desanexar a sessão remota antes de mexer na local, evitando a ambiguidade por completo.
6. Ajustes Finos de Configuração
Alguns parâmetros que fazem diferença perceptível no uso intenso, para adicionar ao ~/.tmux.conf:
# Reduz o delay entre pressionar Esc e o terminal reconhecer (importante para vim/neovim)
set -sg escape-time 0
# Histórico de scroll maior (padrão é só 2000 linhas)
set -g history-limit 50000
# Renumera as janelas automaticamente ao fechar uma no meio
set -g renumber-windows on
# Evita que o tmux renomeie janelas automaticamente com base no comando em execução
set-option -g allow-rename off
# Notificação visual (não sonora) quando outra janela tem atividade
setw -g monitor-activity on
set -g visual-activity on
escape-time 0 em particular resolve um sintoma clássico de quem usa Vim/Neovim dentro do tmux: um pequeno atraso perceptível ao sair do modo de inserção com Esc, causado pelo tmux esperando para diferenciar a tecla Esc isolada de sequências de escape de teclas especiais.
7. Conclusão da Série
Ao longo destes quatro artigos, o tmux saiu de "o que é isso e por que alguém usaria" até scripts de automação de sessão, persistência em servidores remotos e sincronização entre múltiplos hosts. A curva de aprendizado inicial (decorar o prefixo, os atalhos de painel) se paga rápido assim que uma conexão cai no meio de um trabalho importante e tudo continua exatamente de pé ao reconectar. Vale começar pequeno — um .tmux.conf com poucas linhas e um ou dois plugins — e ir incorporando o restante conforme o próprio fluxo de trabalho pedir.
Imagem de capa: Logo do tmux, por Jason Long — Wikimedia Commons
Referências:
Top comments (0)