Sesiones, Ventanas y Paneles en Tmux
Tmux organiza el trabajo en una jerarquía de tres niveles: sesiones, ventanas y paneles. Dominar esta estructura es fundamental para aprovechar al máximo Tmux y crear workflows eficientes.
🏗️ Jerarquía de Tmux
Sesión (Session)
├── Ventana 1 (Window)
│ ├── Panel 1 (Pane)
│ ├── Panel 2 (Pane)
│ └── Panel 3 (Pane)
├── Ventana 2 (Window)
│ ├── Panel 1 (Pane)
│ └── Panel 2 (Pane)
└── Ventana 3 (Window)
└── Panel 1 (Pane)
📱 Sesiones (Sessions)
Las sesiones son el nivel más alto de organización. Cada sesión es independiente y puede contener múltiples ventanas. Las sesiones persisten incluso después de desconectarse.
Gestión de sesiones desde terminal
Crear sesiones
tmux new-session -d -s desarrollo # Crear sesión "desarrollo"
tmux new -d -s backend # Versión corta
tmux new -s frontend -d # Crear detachada
Listar sesiones
tmux list-sessions # Listar todas las sesiones
tmux ls # Versión corta
Adjuntar y desadjuntar
tmux attach-session -t desarrollo # Adjuntar a sesión
tmux attach -t desarrollo # Versión corta
tmux a -t desarrollo # Más corta
tmux detach # Desadjuntar (desde dentro)
Eliminar sesiones
tmux kill-session -t desarrollo # Eliminar sesión específica
tmux kill-server # Eliminar todas las sesiones
Gestión desde dentro de Tmux
Comandos con prefix (default: Ctrl-b)
Prefix + s " Listar y seleccionar sesiones
Prefix + $ " Renombrar sesión actual
Prefix + d " Desadjuntar de la sesión
Prefix + D " Elegir cliente para desadjuntar
Comando tmux interno
Prefix + : " Entrar en modo comando
:new-session -d -s nueva " Crear nueva sesión
:kill-session -t vieja " Eliminar sesión
:rename-session nuevo " Renombrar sesión actual
🪟 Ventanas (Windows)
Las ventanas son tabs dentro de una sesión. Cada ventana puede tener múltiples paneles.
Gestión de ventanas
Crear y cerrar ventanas
Prefix + c " Crear nueva ventana
Prefix + & " Cerrar ventana actual (con confirmación)
Prefix + x " Cerrar panel/ventana actual
Navegación entre ventanas
Prefix + n " Siguiente ventana
Prefix + p " Ventana anterior
Prefix + l " Última ventana visitada
Prefix + 0-9 " Ir a ventana específica (0-9)
Prefix + ' " Ir a ventana por número (prompt)
Prefix + w " Listar y seleccionar ventanas
Organización de ventanas
Prefix + , " Renombrar ventana actual
Prefix + . " Mover ventana (cambiar número)
Prefix + f " Buscar ventana por nombre
Intercambio de ventanas
:swap-window -s 2 -t 1 " Intercambiar ventana 2 con 1
:move-window -t 0 " Mover ventana actual a posición 0
🔲 Paneles (Panes)
Los paneles son divisiones de una ventana. Aquí es donde realmente trabajas.
División de paneles
Crear divisiones
Prefix + % " División vertical (lado a lado)
Prefix + " " División horizontal (arriba/abajo)
Cerrar paneles
Prefix + x " Cerrar panel actual (con confirmación)
exit " Cerrar panel (desde shell)
Ctrl+d " Cerrar panel (EOF al shell)
Navegación entre paneles
Básica
Prefix + ←→↑↓ " Navegar con flechas
Prefix + h j k l " Navegar estilo Vim (requiere configuración)
Prefix + q " Mostrar números de panel
Prefix + q + número " Ir a panel específico
Avanzada
Prefix + o " Ir al siguiente panel
Prefix + ; " Ir al panel anterior
Prefix + { " Intercambiar con panel anterior
Prefix + } " Intercambiar con panel siguiente
Redimensionado de paneles
Manual
Prefix + Ctrl+←→↑↓ " Redimensionar con flechas
Prefix + Alt+←→↑↓ " Redimensionar en pasos grandes
Automático
Prefix + z " Hacer zoom del panel (toggle fullscreen)
Prefix + Space " Rotar entre layouts predefinidos
Layouts predefinidos
even-horizontal " Paneles horizontales iguales
even-vertical " Paneles verticales iguales
main-horizontal " Panel principal arriba, resto abajo
main-vertical " Panel principal izquierda, resto derecha
tiled " Distribución en cuadrícula
🎯 Workflows Prácticos
Workflow 1: Desarrollo Web
# Crear sesión para proyecto web
tmux new-session -d -s webapp
# Ventana 1: Editor (Vim)
tmux rename-window -t webapp:1 'editor'
tmux send-keys -t webapp:editor 'cd ~/proyecto && vim' C-m
# Ventana 2: Servidor de desarrollo
tmux new-window -t webapp -n 'server'
tmux send-keys -t webapp:server 'cd ~/proyecto && npm start' C-m
# Ventana 3: Logs y monitoring
tmux new-window -t webapp -n 'logs'
tmux split-window -t webapp:logs -h
tmux send-keys -t webapp:logs.1 'tail -f logs/app.log' C-m
tmux send-keys -t webapp:logs.2 'htop' C-m
# Adjuntar a la sesión
tmux attach -t webapp
Workflow 2: DevOps y monitoring
# Sesión para infraestructura
tmux new-session -d -s infra
# Panel principal con dashboard
tmux rename-window -t infra:1 'dashboard'
tmux send-keys -t infra:dashboard 'k9s' C-m
# División para logs
tmux split-window -t infra:dashboard -v -p 30
tmux send-keys -t infra:dashboard.2 'kubectl logs -f deployment/app' C-m
# División para métricas
tmux split-window -t infra:dashboard.2 -h
tmux send-keys -t infra:dashboard.3 'watch kubectl get pods' C-m
Workflow 3: Múltiples proyectos
# Script para setup rápido
#!/bin/bash
create_dev_session() {
local session_name=$1
local project_path=$2
tmux new-session -d -s "$session_name"
tmux rename-window -t "$session_name:1" 'code'
tmux send-keys -t "$session_name:code" "cd $project_path && vim" C-m
tmux new-window -t "$session_name" -n 'terminal'
tmux send-keys -t "$session_name:terminal" "cd $project_path" C-m
tmux new-window -t "$session_name" -n 'git'
tmux send-keys -t "$session_name:git" "cd $project_path && git status" C-m
}
create_dev_session "frontend" "~/projects/frontend"
create_dev_session "backend" "~/projects/backend"
create_dev_session "mobile" "~/projects/mobile"
⚙️ Configuración Personalizada
Configuración en ~/.tmux.conf
# Cambiar prefix key
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix
# Navegación estilo Vim
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# División de paneles más intuitiva
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %
# Redimensionado de paneles
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
# Recarga rápida de configuración
bind r source-file ~/.tmux.conf \; display-message "Config reloaded!"
# Numeración desde 1
set -g base-index 1
setw -g pane-base-index 1
# Renumeración automática
set -g renumber-windows on
# Mantener nombres de ventana
set-option -g allow-rename off
📝 Ejercicios Prácticos
Ejercicio 1: Setup básico
- Crea una sesión llamada "practica"
- Crea 3 ventanas: "editor", "terminal", "monitoring"
- En la ventana "editor", divide en 2 paneles verticales
- En la ventana "monitoring", crea 4 paneles en cuadrícula
- Practica navegación entre todo
Ejercicio 2: Workflow de desarrollo
- Crea una sesión para un proyecto
- Configura ventanas para diferentes tareas:
- Ventana 1: Editor de código
- Ventana 2: Servidor de desarrollo (2 paneles)
- Ventana 3: Git y logs (3 paneles)
- Popula cada panel con comandos apropiados
Ejercicio 3: Script de automatización
- Crea un script bash que:
- Cree múltiples sesiones
- Configure layouts automáticamente
- Lance comandos en paneles específicos
- Te adjunte a la sesión principal
Ejercicio 4: Gestión avanzada
- Practica mover ventanas entre sesiones
- Usa el comando
join-pane
para reorganizar paneles - Experimenta con diferentes layouts
- Configura nombres personalizados para todo
🏆 Tips Pro
1. Comandos de una línea
# Crear sesión completa en una línea
tmux new-session -d -s dev \; new-window -n code \; new-window -n test \; select-window -t 1
# Ejecutar comando en panel específico
tmux send-keys -t dev:code 'vim app.js' Enter
2. Plantillas de sesiones
# Función para sesiones estándar
create_project_session() {
tmux new-session -d -s "$1"
tmux new-window -t "$1" -n 'code'
tmux new-window -t "$1" -n 'server'
tmux new-window -t "$1" -n 'git'
tmux select-window -t "$1:code"
tmux attach -t "$1"
}
3. Debugging de sesiones
# Ver información detallada
tmux list-sessions -F "#{session_name}: #{session_windows} windows"
tmux list-windows -t session_name
tmux list-panes -t session_name:window_name
4. Backup y restore
# Guardar layout
tmux list-windows -t session_name -F "#{window_layout}"
# Aplicar layout
tmux select-layout -t session_name:window_name "layout_string"
🔗 Integración con Scripts
Script de inicio de proyecto
#!/bin/bash
# start-project.sh
PROJECT_NAME=${1:-default}
PROJECT_PATH=${2:-$(pwd)}
# Verificar si la sesión ya existe
tmux has-session -t "$PROJECT_NAME" 2>/dev/null
if [ $? != 0 ]; then
# Crear nueva sesión
tmux new-session -d -s "$PROJECT_NAME" -c "$PROJECT_PATH"
# Configurar ventanas
tmux rename-window -t "$PROJECT_NAME:1" 'main'
tmux new-window -t "$PROJECT_NAME" -n 'server' -c "$PROJECT_PATH"
tmux new-window -t "$PROJECT_NAME" -n 'git' -c "$PROJECT_PATH"
# Volver a la primera ventana
tmux select-window -t "$PROJECT_NAME:main"
fi
# Adjuntar a la sesión
tmux attach -t "$PROJECT_NAME"
¡Dominar sesiones, ventanas y paneles te permitirá organizar cualquier workflow complejo de manera eficiente!