Saltar a contenido

Tmux Cheatsheet

Sinopsis

tmux (terminal multiplexer) es una herramienta que permite ejecutar múltiples sesiones de terminal dentro de una sola ventana terminal. Le permite desmontar y reagrupar sesiones, lo que lo hace perfecto para trabajos remotos y procesos de larga duración.

Instalación

Administradores de paquetes

# Ubuntu/Debian
sudo apt install tmux

# macOS
brew install tmux

# CentOS/RHEL
sudo yum install tmux

# Arch Linux
sudo pacman -S tmux

# From source
git clone https://github.com/tmux/tmux.git
cd tmux && ./configure && make && sudo make install

Conceptos básicos

Terminología

Session    # A collection of windows
Window     # A single terminal screen
Pane       # A subdivision of a window
Prefix     # Default Ctrl+b (customizable)

Sesión Jerarquía

Session
├── Window 1
│   ├── Pane 1
│   └── Pane 2
├── Window 2
│   └── Pane 1
└── Window 3
    ├── Pane 1
    ├── Pane 2
    └── Pane 3

Uso básico

Inicio tmux

# Start new session
tmux

# Start named session
tmux new-session -s mysession
tmux new -s mysession

# Start session with specific window name
tmux new -s mysession -n mywindow

# Start detached session
tmux new -d -s mysession

Gestión del período de sesiones

# List sessions
tmux list-sessions
tmux ls

# Attach to session
tmux attach-session -t mysession
tmux attach -t mysession
tmux a -t mysession

# Detach from session
# Inside tmux: Ctrl+b d

# Kill session
tmux kill-session -t mysession

# Kill all sessions
tmux kill-server

Cadenas clave (Prefijo predeterminado: Ctrl+b)

Comandos de sesión

Prefix + d    # Detach from session
Prefix + s    # List sessions
Prefix + $    # Rename session
Prefix + (    # Previous session
Prefix + )    # Next session

Mandos de ventana

Prefix + c    # Create new window
Prefix + n    # Next window
Prefix + p    # Previous window
Prefix + l    # Last window
Prefix + w    # List windows
Prefix + &    # Kill window
Prefix + ,    # Rename window
Prefix + 0-9  # Switch to window by number
Prefix + f    # Find window

Pane Commands

Prefix + %    # Split horizontally
Prefix + "    # Split vertically
Prefix + o    # Switch to next pane
Prefix + ;    # Switch to last pane
Prefix + x    # Kill pane
Prefix + !    # Break pane into window
Prefix + z    # Toggle pane zoom
Prefix + \\\\{    # Move pane left
Prefix + \\\\}    # Move pane right
Prefix + q    # Show pane numbers
Prefix + q 0-9 # Switch to pane by number

Pane Navigation

Prefix + ↑    # Move to pane above
Prefix + ↓    # Move to pane below
Prefix + ←    # Move to pane left
Prefix + →    # Move to pane right

Reforzamiento de los panes

Prefix + Ctrl+↑  # Resize pane up
Prefix + Ctrl+↓  # Resize pane down
Prefix + Ctrl+←  # Resize pane left
Prefix + Ctrl+→  # Resize pane right

# Alternative (hold Prefix)
Prefix + Alt+↑   # Resize pane up (5 lines)
Prefix + Alt+↓   # Resize pane down (5 lines)
Prefix + Alt+←   # Resize pane left (5 columns)
Prefix + Alt+→   # Resize pane right (5 columns)

Modo de copia

Introduzca el modo de copia

Prefix + [    # Enter copy mode

Modo de copia de navegación

h, j, k, l    # Move cursor (vim-style)
Arrow keys    # Move cursor
w             # Next word
b             # Previous word
0             # Beginning of line
$             # End of line
g             # Go to top
G             # Go to bottom
Ctrl+f        # Page down
Ctrl+b        # Page up
/             # Search forward
?             # Search backward
n             # Next search result
N             # Previous search result

Selección del modo de copia

Space         # Start selection
Enter         # Copy selection and exit
Escape        # Exit copy mode
v             # Start selection (vi mode)
y             # Copy selection (vi mode)

Pegado

Prefix + ]    # Paste buffer

Configuración

Archivo de configuración (~/.tmux.conf)

# Basic settings
set -g default-terminal "screen-256color"
set -g history-limit 10000
set -g base-index 1
setw -g pane-base-index 1

# Change prefix key
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Reload config
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

# Mouse support
set -g mouse on

# Vi mode
setw -g mode-keys vi

# Pane splitting
bind|split-window -h
bind - split-window -v
unbind '"'
unbind %

# Pane navigation (vim-style)
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Window navigation
bind -n M-Left previous-window
bind -n M-Right next-window

# Pane resizing
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

# 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]%Y-%m-%d %H:%M'
set -g status-interval 60

# Window status
setw -g window-status-current-style 'fg=black bg=white'
setw -g window-status-style 'fg=white bg=black'

# Pane borders
set -g pane-border-style 'fg=colour238'
set -g pane-active-border-style 'fg=colour51'

Configuración avanzada

# Automatic window renaming
setw -g automatic-rename on
set -g set-titles on

# Activity monitoring
setw -g monitor-activity on
set -g visual-activity on

# Copy mode improvements
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
bind -T copy-mode-vi r send-keys -X rectangle-toggle

# Synchronize panes
bind S setw synchronize-panes

# Quick pane cycling
bind -n M-o select-pane -t :.+

# Session management
bind C-s choose-session
bind C-n new-session

Características avanzadas

Scripting de sesión

# Create session with multiple windows
tmux new-session -d -s development
tmux new-window -t development -n editor 'vim'
tmux new-window -t development -n server 'cd ~/project && npm start'
tmux split-window -t development:server -h 'cd ~/project && npm run watch'
tmux attach-session -t development

Tmux Scripts

#!/bin/bash
# dev-session.sh

SESSION="development"

# Check if session exists
tmux has-session -t $SESSION 2>/dev/null

if [ $? != 0 ]; then
    # Create new session
    tmux new-session -d -s $SESSION

    # Setup windows
    tmux rename-window -t $SESSION:1 'editor'
    tmux send-keys -t $SESSION:1 'cd ~/project && vim' C-m

    tmux new-window -t $SESSION -n 'server'
    tmux send-keys -t $SESSION:2 'cd ~/project && npm start' C-m

    tmux new-window -t $SESSION -n 'git'
    tmux send-keys -t $SESSION:3 'cd ~/project && git status' C-m

    # Split server window
    tmux split-window -t $SESSION:2 -h
    tmux send-keys -t $SESSION:2.2 'cd ~/project && npm run watch' C-m
fi

# Attach to session
tmux attach-session -t $SESSION

Tmuxinator

# Install tmuxinator
gem install tmuxinator

# Create project
tmuxinator new myproject

# Example tmuxinator config (~/.tmuxinator/myproject.yml)
name: myproject
root: ~/projects/myproject

windows:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - guard
  - server: bundle exec rails s
  - logs: tail -f log/development.log

Plugins

TPM (Tmux Plugin Manager)

# Install TPM
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

# Add to ~/.tmux.conf
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

# Initialize TPM (add to bottom of .tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

# Install plugins: Prefix + I
# Update plugins: Prefix + U
# Remove plugins: Prefix + alt + u

Plugins populares

# tmux-resurrect - save/restore sessions
set -g @plugin 'tmux-plugins/tmux-resurrect'
# Save: Prefix + Ctrl+s
# Restore: Prefix + Ctrl+r

# tmux-continuum - automatic save/restore
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @continuum-restore 'on'

# tmux-yank - copy to system clipboard
set -g @plugin 'tmux-plugins/tmux-yank'

# tmux-pain-control - better pane management
set -g @plugin 'tmux-plugins/tmux-pain-control'

# tmux-sidebar - file tree sidebar
set -g @plugin 'tmux-plugins/tmux-sidebar'
# Toggle: Prefix + Tab

Interfaz de línea de mando

Gestión del período de sesiones

# Create session with command
tmux new-session -d -s mysession 'htop'

# Send commands to session
tmux send-keys -t mysession 'ls -la' C-m

# Capture pane content
tmux capture-pane -t mysession -p

# List windows in session
tmux list-windows -t mysession

# List panes in window
tmux list-panes -t mysession:1

Ejemplos de scripting

# Create development environment
create_dev_env() \\\\{
    local session="dev-$(date +%s)"
    tmux new-session -d -s "$session"
    tmux send-keys -t "$session" 'cd ~/project' C-m
    tmux split-window -t "$session" -h
    tmux send-keys -t "$session" 'cd ~/project && npm start' C-m
    tmux select-pane -t "$session":0
    tmux attach-session -t "$session"
\\\\}

# Kill all sessions except current
kill_other_sessions() \\\\{
    local current=$(tmux display-message -p '#S')
    tmux list-sessions -F '#\\\\{session_name\\\\}'|\
    grep -v "^$current$"|\
    xargs -I \\\\{\\\\} tmux kill-session -t \\\\{\\\\}
\\\\}

Consejos y trucos

Consejos de productividad

# Quick session switching
bind -n M-1 switch-client -t session1
bind -n M-2 switch-client -t session2

# Broadcast to all panes
bind a setw synchronize-panes

# Quick layouts
Prefix + Space  # Cycle through layouts
Prefix + Alt+1  # Even horizontal
Prefix + Alt+2  # Even vertical
Prefix + Alt+3  # Main horizontal
Prefix + Alt+4  # Main vertical
Prefix + Alt+5  # Tiled

# Zoom pane
Prefix + z      # Toggle pane zoom

# Break pane to new window
Prefix + !      # Break pane out

# Join pane from another window
bind j command-prompt -p "join pane from:" "join-pane -s '%%'"

Alias útiles

# Add to ~/.bashrc or ~/.zshrc
alias ta='tmux attach'
alias tls='tmux list-sessions'
alias tn='tmux new-session'
alias tk='tmux kill-session'

# Function to create or attach to session
tm() \\\\{
    [[ -n "$TMUX" ]] && change="switch-client"||change="attach-session"
    if [ $1 ]; then
        tmux $change -t "$1" 2>/dev/null||(tmux new-session -d -s $1 && tmux $change -t "$1"); return
    fi
    session=$(tmux list-sessions -F "#\\\\{session_name\\\\}" 2>/dev/null|fzf --exit-0) &&  tmux $change -t "$session"||echo "No sessions found."
\\\\}

Solución de problemas

Cuestiones comunes

# Fix 256 color support
export TERM=screen-256color

# Fix clipboard issues
# Install xclip (Linux) or reattach-to-user-namespace (macOS)

# Reset tmux completely
tmux kill-server

# Check tmux version
tmux -V

# Validate configuration
tmux source-file ~/.tmux.conf

Ejecución

# Reduce escape time
set -sg escape-time 0

# Increase history limit
set -g history-limit 50000

# Refresh status bar less frequently
set -g status-interval 5

Integración

Con Vim/Neovim

# vim-tmux-navigator plugin
# Seamless navigation between vim and tmux panes
bind -n C-h run "(tmux display-message -p '#\\\\{pane_current_command\\\\}'|grep -iq vim && tmux send-keys C-h)||tmux select-pane -L"
bind -n C-j run "(tmux display-message -p '#\\\\{pane_current_command\\\\}'|grep -iq vim && tmux send-keys C-j)||tmux select-pane -D"
bind -n C-k run "(tmux display-message -p '#\\\\{pane_current_command\\\\}'|grep -iq vim && tmux send-keys C-k)||tmux select-pane -U"
bind -n C-l run "(tmux display-message -p '#\\\\{pane_current_command\\\\}'|grep -iq vim && tmux send-keys C-l)||tmux select-pane -R"

Con SSH

# Auto-attach to tmux on SSH
# Add to ~/.bashrc on remote server
if [[ -z "$TMUX" ]] && [ "$SSH_CONNECTION" != "" ]; then
    tmux attach-session -t ssh_tmux||tmux new-session -s ssh_tmux
fi

Recursos