DEV Community

Cover image for Tmux Avançado - Exemplos Reais e Configurações para Produtividade
Rafael Dutra for apsis-cc

Posted on • Edited on

Tmux Avançado - Exemplos Reais e Configurações para Produtividade

Demo do tmuxinator criando uma sessão com múltiplas janelas via script 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"
Enter fullscreen mode Exit fullscreen mode

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:
      - ""
Enter fullscreen mode Exit fullscreen mode
tmuxp load .tmuxp.yaml
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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

Miniatura do screencast do tmux-resurrect, mostrando o estado de uma sessão sendo restaurado 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. tmuxinator
  2. tmuxp
  3. tmux GitHub Wiki

Top comments (0)