Saltar al contenido principal

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
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)

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

  1. Crea una sesión llamada "practica"
  2. Crea 3 ventanas: "editor", "terminal", "monitoring"
  3. En la ventana "editor", divide en 2 paneles verticales
  4. En la ventana "monitoring", crea 4 paneles en cuadrícula
  5. Practica navegación entre todo

Ejercicio 2: Workflow de desarrollo

  1. Crea una sesión para un proyecto
  2. 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)
  3. Popula cada panel con comandos apropiados

Ejercicio 3: Script de automatización

  1. 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

  1. Practica mover ventanas entre sesiones
  2. Usa el comando join-pane para reorganizar paneles
  3. Experimenta con diferentes layouts
  4. 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!