Master tmux: Essential Techniques to Maximize Your Terminal Productivity
Have you ever lost a running process because your SSH connection dropped while working on a server? Or found yourself with dozens of terminal windows open while juggling multiple projects? tmux (terminal multiplexer) is the powerful tool that solves all these problems.
In this guide, we'll cover everything from tmux fundamentals to advanced workflows you can apply immediately in your daily work.
1. What is tmux?
tmux is a terminal multiplexer that lets you manage multiple sessions, windows, and panes within a single terminal window. Its core value proposition comes down to three key features:
- Session Persistence: Sessions remain active even when you close your terminal or lose your SSH connection
- Screen Multiplexing: Run multiple workspaces simultaneously within one terminal
- Remote Collaboration: Multiple users can connect to the same session for real-time collaborative work
Basic Structure
tmux server
└── Session - Project-level unit
└── Window - Similar to tabs
└── Pane - Split screen regions
Installation
# macOS
brew install tmux
# Ubuntu/Debian
sudo apt install tmux
# CentOS/RHEL
sudo yum install tmux
2. Essential Key Bindings
All tmux commands use a prefix key (default: Ctrl+b) followed by the corresponding key.
Session Management
| Action | Command |
|---|---|
| Create new session | tmux new -s session_name |
| Detach from session | Ctrl+b → d |
| List sessions | tmux ls |
| Reattach to session | tmux attach -t session_name |
| Switch sessions | Ctrl+b → s |
| Kill session | tmux kill-session -t session_name |
Window Management
| Action | Command |
|---|---|
| New window | Ctrl+b → c |
| Next/Previous window | Ctrl+b → n / p |
| Go to window by number | Ctrl+b → 0-9 |
| Rename window | Ctrl+b → , |
| Close window | Ctrl+b → & |
Pane Management
| Action | Command |
|---|---|
| Split horizontally | Ctrl+b → % |
| Split vertically | Ctrl+b → " |
| Move between panes | Ctrl+b → Arrow keys |
| Resize pane | Ctrl+b → Ctrl+Arrow keys |
| Close pane | Ctrl+b → x |
| Maximize/Restore pane | Ctrl+b → z |
| Change pane layout | Ctrl+b → Space |
3. Practical Use Cases: Setting Up Your Development Environment
3-1. IDE-Style Layout
Create an IDE-like environment with Vim/Neovim + terminal using tmux.
# Editor on left 80%, terminal on right 20%
tmux new-session -s dev \; \
send-keys 'nvim .' Enter \; \
split-window -h -p 20 \; \
split-window -v \; \
send-keys 'npm run dev' Enter \; \
select-pane -t 0
This gives you: - Left: Code editor (Neovim) - Top right: Empty terminal (for git, running tests) - Bottom right: Development server running
3-2. Per-Project Session Management
Create separate sessions for each project to reduce context switching overhead.
# Backend project
tmux new -s backend -d
tmux send-keys -t backend 'cd ~/projects/api-server' Enter
# Frontend project
tmux new -s frontend -d
tmux send-keys -t frontend 'cd ~/projects/web-app' Enter
# Infrastructure management
tmux new -s infra -d
tmux send-keys -t infra 'cd ~/infrastructure' Enter
Use Ctrl+b → s to open the session list and instantly switch between projects.
3-3. Auto-Attach on Terminal Start
Add this to your shell configuration file (.bashrc, .zshrc) to automatically reattach to your existing session when opening a terminal:
# Attach to existing session, or create new one if none exists
if command -v tmux &>/dev/null && [ -z "$TMUX" ]; then
tmux attach -t main || tmux new -s main
fi
4. DevOps and Server Management
4-1. Server Monitoring Dashboard
Build a comprehensive dashboard to monitor system status at a glance from a single terminal.
tmux new-session -s monitor \; \
send-keys 'htop' Enter \; \
split-window -h \; \
send-keys 'tail -f /var/log/syslog' Enter \; \
split-window -v \; \
send-keys 'watch -n 2 df -h' Enter \; \
select-pane -t 0 \; \
split-window -v \; \
send-keys 'iftop' Enter
Result layout:
+-------------------+-------------------+
| htop | syslog tail |
| (CPU/Memory) | (Log monitor) |
+-------------------+-------------------+
| iftop | df -h watch |
| (Network) | (Disk usage) |
+-------------------+-------------------+
4-2. Multi-Server Control with synchronize-panes
When you need to execute the same command across multiple servers simultaneously, synchronize-panes is invaluable.
# Create panes for 4 server connections
tmux new-session -s servers \; \
send-keys 'ssh web-01' Enter \; \
split-window -h \; \
send-keys 'ssh web-02' Enter \; \
split-window -v \; \
send-keys 'ssh web-03' Enter \; \
select-pane -t 0 \; \
split-window -v \; \
send-keys 'ssh web-04' Enter
Then enable synchronization mode:
Ctrl+b → :setw synchronize-panes on
Now typing in one pane simultaneously inputs to all panes. You can perform package updates, config file deployments, service restarts, and more across all servers at once.
# Runs on all 4 servers simultaneously
sudo apt update && sudo apt upgrade -y
sudo systemctl restart nginx
To disable synchronization:
Ctrl+b → :setw synchronize-panes off
4-3. Safe Execution of Long-Running Tasks
For time-consuming tasks like deployments, migrations, or large data processing, running them inside a tmux session ensures safety even if your SSH connection drops.
# Start deployment session
tmux new -s deploy
# Run deployment script
./deploy-production.sh
# Detach for other work (deployment continues)
# Ctrl+b → d
# Check status later
tmux attach -t deploy
5. Pair Programming and Remote Collaboration
Leveraging tmux's client-server architecture enables real-time pair programming without separate screen sharing tools.
Basic Setup
# Host: Create session
tmux new -s pair
# Guest: SSH to same server, then attach to session
tmux attach -t pair
When both users connect to the same session, all input and screen changes sync in real-time. This has lower latency than video conference-based screen sharing, and both parties can edit code directly.
Independent Views (Same Session, Different Windows)
To allow each user to view different windows while sharing the same session:
# Guest connects as new client (independent view)
tmux new-session -t pair -s pair-guest
This approach lets you share the same session's windows while each user can freely navigate to different windows.
tmate: Easier Remote Sharing
tmate is a tmux-based instant sharing tool that lets you share sessions via a single URL without additional server setup:
# Installation
brew install tmate # macOS
# Start session → automatically generates share URL
tmate
# SSH URL is displayed → share with your partner
6. tmux Automation: tmuxinator and tmuxp
Manually configuring sessions every time is tedious. tmuxinator or tmuxp let you instantly restore complex workspaces with a single YAML file.
tmuxinator
A Ruby-based tmux session manager and the most widely used option.
# Installation
gem install tmuxinator
# or
brew install tmuxinator
Create project configuration file:
tmuxinator new myproject
~/.config/tmuxinator/myproject.yml:
name: myproject
root: ~/projects/myproject
windows:
- editor:
layout: main-vertical
panes:
- nvim
- git status
- server:
panes:
- npm run dev
- database:
panes:
- docker-compose up db
- pgcli mydb
- logs:
layout: even-horizontal
panes:
- tail -f logs/app.log
- tail -f logs/error.log
Launch your entire environment with one command:
tmuxinator start myproject
# or abbreviated
mux start myproject
tmuxp
A Python-based alternative with the strength of being able to "freeze" existing tmux sessions to YAML.
# Installation
pip install tmuxp
# Save current session to config file
tmuxp freeze myproject
# Restore session from config file
tmuxp load myproject.yaml
Example myproject.yaml:
session_name: myproject
start_directory: ~/projects/myproject
windows:
- window_name: code
layout: main-vertical
panes:
- shell_command:
- nvim .
- shell_command:
- npm test -- --watch
- window_name: services
panes:
- shell_command:
- docker-compose up
7. Essential Plugin Guide
TPM (Tmux Plugin Manager)
The core of the tmux plugin ecosystem. After installation, manage plugins declaratively in your .tmux.conf.
# Installation
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
Add to .tmux.conf:
# Plugin list
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'
set -g @plugin 'tmux-plugins/tmux-yank'
# TPM initialization (always at the bottom of .tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
Install: Ctrl+b → I (uppercase)
tmux-resurrect: Persistent Session Saving
Restores tmux sessions (windows, pane layouts, running commands) even after system restarts.
# Save session
Ctrl+b → Ctrl+s
# Restore session
Ctrl+b → Ctrl+r
tmux-continuum: Automatic Save/Restore
Automates tmux-resurrect. When configured, it saves every 15 minutes and automatically restores when tmux starts.
# .tmux.conf
set -g @continuum-restore 'on'
set -g @continuum-save-interval '15' # Auto-save every 15 minutes
tmux-yank: System Clipboard Integration
Directly copies selected text in tmux copy mode to the OS clipboard.
set -g @plugin 'tmux-plugins/tmux-yank'
tmux-fzf: Fuzzy Finder Integration
Integrates fzf with tmux for quick searching and switching between sessions, windows, and panes.
set -g @plugin 'sainnhe/tmux-fzf'
# Usage: Ctrl+b → F (uppercase)
8. Recommended Configuration: .tmux.conf
A collection of battle-tested configurations for production use.
# ─── Basic Settings ─────────────────────────────────
# Change prefix to Ctrl+a (screen-style, easier to press)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# 256 color support
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"
# Enable mouse support
set -g mouse on
# History buffer size
set -g history-limit 50000
# Start indexing from 1 (0 is at the far left of keyboard, inconvenient)
set -g base-index 1
setw -g pane-base-index 1
# Auto-renumber windows
set -g renumber-windows on
# Remove ESC delay (essential for Vim users)
set -sg escape-time 0
# Forward focus events (needed for Vim autoread, etc.)
set -g focus-events on
# ─── Key Bindings ──────────────────────────────────
# Reload config
bind r source-file ~/.tmux.conf \; display "Config reloaded!"
# Intuitive splits (| horizontal, - vertical)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# Open new window in current directory
bind c new-window -c "#{pane_current_path}"
# Vim-style pane navigation
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Alt+Arrow keys for pane navigation (no prefix)
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
# Resize panes (uppercase HJKL)
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
# Vim-style copy mode
setw -g mode-keys vi
bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi y send -X copy-selection-and-cancel
# ─── Status Bar ───────────────────────────────────
set -g status-position top
set -g status-interval 5
set -g status-style 'bg=#1e1e2e fg=#cdd6f4'
set -g status-left '#[bg=#89b4fa,fg=#1e1e2e,bold] #S #[default] '
set -g status-left-length 30
set -g status-right '#[fg=#a6adc8] %Y-%m-%d %H:%M #[default]'
setw -g window-status-format ' #I:#W '
setw -g window-status-current-format '#[bg=#cba6f7,fg=#1e1e2e,bold] #I:#W #[default]'
# ─── Plugins ──────────────────────────────────
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'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g @continuum-restore 'on'
run '~/.tmux/plugins/tpm/tpm'
9. Advanced Usage: Scripting and Automation
Automation with send-keys
send-keys is the core command for tmux scripting. It programmatically sends key inputs to panes.
#!/bin/bash
# dev-start.sh - Development environment auto-start script
SESSION="dev"
tmux has-session -t $SESSION 2>/dev/null
if [ $? != 0 ]; then
# Create new session (first window: editor)
tmux new-session -d -s $SESSION -n editor
tmux send-keys -t $SESSION:editor 'cd ~/project && nvim .' Enter
# Second window: server
tmux new-window -t $SESSION -n server
tmux send-keys -t $SESSION:server 'cd ~/project && npm run dev' Enter
# Third window: tests
tmux new-window -t $SESSION -n test
tmux send-keys -t $SESSION:test 'cd ~/project && npm test -- --watch' Enter
# Fourth window: Docker
tmux new-window -t $SESSION -n docker
tmux send-keys -t $SESSION:docker 'docker-compose up' Enter
# Move focus to editor window
tmux select-window -t $SESSION:editor
fi
tmux attach -t $SESSION
Managing Scheduled Tasks with tmux + cron
Combining cron with tmux lets you monitor long-running scheduled tasks.
# Add to crontab
0 2 * * * tmux new-session -d -s backup \; send-keys './backup.sh' Enter
Conditional Command Execution
# Create session only if it doesn't exist
tmux has-session -t work 2>/dev/null || tmux new-session -d -s work
# Create window only if it doesn't exist
tmux list-windows -t work | grep -q 'logs' || \
tmux new-window -t work -n logs 'tail -f /var/log/app.log'
10. Practical Tips Collection
Break/Merge Panes into New Windows
# Break current pane into independent window
Ctrl+b → !
# Join pane from another window to current window
Ctrl+b → :join-pane -s window_number
Scroll Command Output (Copy Mode)
# Enter copy mode
Ctrl+b → [
# Scroll with arrow keys or PageUp/PageDown
# vi mode: j/k, Ctrl+d/Ctrl+u
# Press q to exit
Using Separate tmux Servers
You can run independent tmux servers for each project:
# Create servers with separate sockets
tmux -L project-a new -s main
tmux -L project-b new -s main
# Connect to specific server
tmux -L project-a attach
Update Environment Variables
Solves the issue where environment variables like SSH_AUTH_SOCK retain stale values after SSH reconnection:
# .tmux.conf
set -g update-environment "SSH_AUTH_SOCK SSH_CONNECTION DISPLAY"
Notification Settings
Get notified when background tasks complete:
# .tmux.conf
setw -g monitor-activity on
set -g visual-activity on
Conclusion
tmux is more than just a terminal splitting tool. It covers almost every aspect of terminal-based work: development environment setup, server management, remote collaboration, and automation.
Here's a summary of key use cases:
| Use Case | Key Features |
|---|---|
| Development Environment | IDE-style layouts, per-project sessions |
| Server Management | Monitoring dashboards, synchronize-panes |
| Remote Work | Session persistence, SSH connection recovery |
| Collaboration | Session sharing, pair programming |
| Automation | tmuxinator/tmuxp, scripting |
| Reliability | Persistent sessions with tmux-resurrect/continuum |
I recommend starting with basic session creation and screen splitting, then gradually expanding with automation and plugins. Don't try to perfect your .tmux.conf all at once—the best approach is to add configurations one by one as you discover what you need during actual use.
References: - tmux GitHub Wiki - Advanced Use - The Tao of tmux - Tips and Tricks - tmux Workflows for Developers & DevOps - Remote Pair Programming With SSH & tmux - Tmuxinator GitHub - tmux-plugins/tpm - tmux-plugins/tmux-resurrect
댓글
댓글 쓰기