Tmux
El multiplexor de terminal que salva vidas de desarrolladores. Si alguna vez perdiste trabajo por cerrar accidentalmente la terminal, o necesitas múltiples shells simultáneos, Tmux es tu salvador.
¿Qué Es Tmux?
Tmux = Terminal Multiplexer
Te permite:
- ✅ Múltiples shells en una ventana
- ✅ Sesiones persistentes (sobreviven a desconexiones)
- ✅ Split panes (divide pantalla como iTerm)
- ✅ Windows tabs dentro de una sesión
- ✅ Scripting para setups complejos
- ✅ Copy/paste avanzado entre panes
Cuándo Lo Necesitas
Escenario típico: Desarrollas una app web con:
- Backend server corriendo
- Frontend dev server
- Tests ejecutándose
- Logs monitoreándose
- Git operations
Sin Tmux: 5+ terminals abiertas, caos organizacional.
Con Tmux: Una ventana organizada con todo dividido eficientemente.
Instalación y Setup Básico
Instalar Tmux
# macOS
brew install tmux
# Ubuntu/Debian
sudo apt install tmux
# Verificar
tmux -V # 3.3a o superior recomendado
Configuración Básica
# Crear config directory
mkdir -p ~/.config/tmux
# Archivo de configuración
touch ~/.config/tmux/tmux.conf
Configuración esencial:
# ~/.config/tmux/tmux.conf
# Cambiar prefix de Ctrl-b a Ctrl-a (más cómodo)
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix
# Mouse support
set -g mouse on
# Mejor colors
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"
# Vi mode keys
setw -g mode-keys vi
# Reload config
bind r source-file ~/.config/tmux/tmux.conf \; display "Config reloaded!"
# Start windows and panes at 1, not 0
set -g base-index 1
setw -g pane-base-index 1
# Renumber windows when one is closed
set -g renumber-windows on
# Status bar
set -g status-bg black
set -g status-fg white
set -g status-left "#[fg=green]#S "
set -g status-right "#[fg=yellow]%H:%M %d-%b-%y"
Iniciar Tmux
# Nueva sesión
tmux
# Sesión nombrada
tmux new -s desarrollo
# Listar sesiones
tmux ls
# Conectar a sesión existente
tmux attach -t desarrollo
Conceptos Fundamentales
Arquitectura Jerárquica
Tmux Server
├── Session "desarrollo"
│ ├── Window 1 "editor"
│ │ ├── Pane 1: nvim
│ │ └── Pane 2: git status
│ ├── Window 2 "servidores"
│ │ ├── Pane 1: npm run dev
│ │ ├── Pane 2: npm run test:watch
│ │ └── Pane 3: tail -f logs/app.log
│ └── Window 3 "database"
│ └── Pane 1: psql
└── Session "produccion"
└── Window 1 "monitoring"
├── Pane 1: htop
└── Pane 2: journalctl -f
Sessions: Contenedores de Trabajo
Sesión = Grupo de windows relacionadas
# Crear sesión
tmux new -s mi-proyecto
# Dentro de tmux:
:new-session -s otro-proyecto # Nueva sesión desde dentro
:sessions # Listar sesiones
:switch-client -t mi-proyecto # Cambiar sesión
:detach # Salir pero dejar corriendo
Windows: Pestañas
Window = Una pantalla completa dividida en panes
# Dentro de tmux (prefix = Ctrl-a):
c # Nueva window
n # Siguiente window
p # Anterior window
, # Renombrar window actual
& # Cerrar window
Panes: Divisiones de Pantalla
Pane = Terminal individual dentro de un window
# Crear panes
% # Split vertical
" # Split horizontal
# Navegar panes
h/j/k/l # Vi-like navigation (izq/abajo/arriba/derecha)
o # Siguiente pane
; # Último pane usado
# Redimensionar panes
:resize-pane -D 10 # Abajo 10 líneas
:resize-pane -U 10 # Arriba 10 líneas
:resize-pane -L 10 # Izquierda 10 columnas
:resize-pane -R 10 # Derecha 10 columnas
# Cerrar pane
x # Confirmar cierre
Keybindings Esenciales
Prefix Commands (Ctrl-a + letra)
# Sesiones
:new # Nueva sesión
:s # Lista sesiones para elegir
# Windows
c # Nueva window
w # Lista windows
n/p # Siguiente/anterior window
, # Renombrar window
& # Cerrar window
# Panes
% # Split vertical
" # Split horizontal
o # Siguiente pane
; # Último pane usado
x # Cerrar pane
z # Zoom pane (fullscreen toggle)
# Navegación Vi-mode
h/j/k/l # Mover entre panes
# Copy mode (para copiar texto)
[ # Entrar copy mode
space # Start selection
enter # Copy selection
] # Paste
Copy/Paste Avanzado
# Entrar copy mode
Ctrl-a [
# Navegar (vi keys)
h/j/k/l # Mover cursor
w/b # Siguiente/anterior palabra
/ # Buscar hacia adelante
? # Buscar hacia atrás
# Seleccionar y copiar
Space # Start selection
Enter # Copy y salir copy mode
# Pegar
Ctrl-a ]
Workflows Prácticos
Setup de Desarrollo Web
# Crear nueva sesión
tmux new -s web-dev
# Dentro de tmux:
# Window 1: Editor + Terminal
Ctrl-a % # Split vertical
Ctrl-a :rename-window "editor"
# Pane izquierdo: Editor
vim
# Pane derecho: Git status + comandos
git status
# Ctrl-a o para cambiar panes
# Window 2: Servidores
Ctrl-a c
Ctrl-a :rename-window "servidores"
Ctrl-a % # Split vertical
Ctrl-a " # Split horizontal del pane derecho
# Pane superior izquierdo: Backend
cd backend && npm run dev
# Pane inferior izquierdo: Frontend
cd frontend && npm run dev
# Pane derecho: Tests
npm run test:watch
# Window 3: Monitoring
Ctrl-a c
Ctrl-a :rename-window "logs"
tail -f backend/logs/app.log
Desarrollo con Microservicios
# Sesión para microservicios
tmux new -s microservices
# Window por servicio
Ctrl-a c && Ctrl-a :rename-window "auth-service"
cd auth && docker-compose up
Ctrl-a c && Ctrl-a :rename-window "user-service"
cd user && npm run dev
Ctrl-a c && Ctrl-a :rename-window "api-gateway"
cd gateway && go run main.go
# Window de monitoring
Ctrl-a c && Ctrl-a :rename-window "monitoring"
Ctrl-a % # Split vertical
htop # Izquierdo: recursos
docker stats # Derecho: containers
Scripting y Automatización
Crear Layouts Complejos
# Script para setup de desarrollo
#!/bin/bash
SESSION="dev"
# Crear sesión si no existe
tmux has-session -t $SESSION 2>/dev/null
if [ $? != 0 ]; then
# Nueva sesión
tmux new-session -d -s $SESSION
# Window 1: Editor
tmux rename-window -t $SESSION:1 "editor"
tmux send-keys -t $SESSION:1 "cd ~/projects/my-app && nvim" C-m
# Window 2: Servidores
tmux new-window -t $SESSION:2 -n "servidores"
tmux split-window -h -t $SESSION:2
tmux split-window -v -t $SESSION:2.1
tmux send-keys -t $SESSION:2.1 "cd ~/projects/my-app/backend && npm run dev" C-m
tmux send-keys -t $SESSION:2.2 "cd ~/projects/my-app/frontend && npm start" C-m
tmux send-keys -t $SESSION:2.3 "cd ~/projects/my-app && npm run test:watch" C-m
# Window 3: Database
tmux new-window -t $SESSION:3 -n "database"
tmux send-keys -t $SESSION:3 "cd ~/projects/my-app && docker-compose up db" C-m
fi
# Conectar
tmux attach -t $SESSION
Alias Útiles
# ~/.zshrc o ~/.bashrc
alias tdev="~/.scripts/tmux-dev.sh"
alias tkill="tmux kill-session -t"
alias tls="tmux ls"
alias ta="tmux attach -t"
Persistencia y Recuperación
Sesiones Sobreviven Desconexiones
# Detach (salir pero dejar corriendo)
Ctrl-a d
# Reattach desde cualquier terminal
tmux attach -t desarrollo
# En otro computador (si usas SSH)
ssh user@server -t tmux attach -t desarrollo
Respawn Commands
# Si un comando muere, tmux puede respawnearlo
# Configurar en tmux.conf:
set -g remain-on-exit on # No cerrar pane cuando comando termina
# Respawn manual
Ctrl-a :respawn-pane -k # Mata y reinicia último comando
Backup/Restore Sesiones
# Instalar tmux-resurrect
git clone https://github.com/tmux-plugins/tmux-resurrect ~/.tmux/plugins/resurrect
# Añadir a tmux.conf:
run-shell ~/.tmux/plugins/resurrect/resurrect.tmux
# Keybindings:
Ctrl-a Ctrl-s # Save sesión
Ctrl-a Ctrl-r # Restore sesión
Integración con Herramientas
Con Vim/Neovim
" ~/.config/nvim/init.vim
" Navegación seamless entre tmux panes y vim splits
let g:tmux_navigator_no_mappings = 1
nnoremap <silent> <C-h> :TmuxNavigateLeft<cr>
nnoremap <silent> <C-j> :TmuxNavigateDown<cr>
nnoremap <silent> <C-k> :TmuxNavigateUp<cr>
nnoremap <silent> <C-l> :TmuxNavigateRight<cr>
Con Zsh
# ~/.zshrc
# Auto-start tmux
if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then
tmux attach -t default || tmux new -s default
fi
Troubleshooting
Problemas Comunes
# Colors no funcionan
# En tmux.conf:
set -g default-terminal "screen-256color"
# Mouse no funciona
# En tmux.conf:
set -g mouse on
# Vi keys no funcionan en copy mode
# Verificar: setw -g mode-keys vi
# Sesión no se encuentra
tmux ls # Listar sesiones disponibles
Comandos Útiles
# Debug
tmux info # Información del servidor
tmux display-message "#S #W #P" # Mostrar sesión/window/pane actual
# Kill everything
tmux kill-server # Mata todas las sesiones
tmux kill-session -t nombre # Mata sesión específica
# Config reload
tmux source ~/.config/tmux/tmux.conf
Alternativas Modernas
Zellij es una alternativa más moderna a Tmux:
- ✅ Layouts como código
- ✅ UI más intuitiva
- ✅ Plugins en Rust
- ❌ Menos madura que Tmux
Comparativa:
- Tmux: Estable, probado, scripting poderoso
- Zellij: Moderno, UX mejor, pero menos features
Conclusión
Tmux no es solo una herramienta, es una filosofía de trabajo. Te enseña a pensar en términos de sesiones organizadas, workflows reproducibles, y persistencia.
Principio: Si lo haces más de una vez, scriptéalo en Tmux.
Resultado: Desarrollo más eficiente, menos context switching, y nunca más perder trabajo por terminal cerrada.
"Tmux es como git para tu terminal: guarda estados, permite branching, y te rescata de desastres."
Próximo: Zellij - la alternativa moderna a Tmux con mejor UX. 🔄