Every tmux user eventually encounters this nightmare scenario: you accidentally pipe binary data or GPG output directly into your terminal, and suddenly your pristine tmux session turns into a garbled mess. The borders display garbage characters, window titles show escape sequences, and even simple cursor movements corrupt adjacent panes.
Typical terminal recovery methods like reset
or sending literal control characters (echo ^V^C
) often prove ineffective in tmux because:
- tmux maintains its own virtual terminal state for each pane
- Control sequences affect the entire session, not just individual panes
- The damage propagates through window splits and tab switches
Instead of killing your session, try these tmux-native solutions:
# Method 1: Full pane reset
tmux send-keys -t pane_id C-l 'eval "$(resize)"' Enter
# Method 2: Forced redraw
tmux refresh-client -S
# Method 3: Terminal emulator reset
tmux send-keys -t pane_id C-c 'tput reset' Enter
# Method 4: Hard reset sequence
tmux send-keys -R
tmux clear-history
Add these to your .bashrc
for quick recovery:
alias fix-tmux='tmux send-keys -R Enter && tmux clear-history && tmux refresh-client'
alias nuke-tmux='tmux list-panes -F "#{pane_id}" | xargs -I {} tmux send-keys -t {} C-l "reset" Enter'
Stop problems before they start:
# Always inspect before piping to terminal
alias gpg='gpg 2>/dev/null | cat -v'
# Filter control characters
function safe_cat() {
cat "$@" | perl -pe 's/[^[:print:]\t\n]//g'
}
# Use tmux buffers for binary data
bind-key P paste-buffer -p
For persistent corruption, this nuclear option preserves your session:
# 1. Capture window layouts
tmux list-windows -F "#{window_id} #{window_layout}" > tmux-backup.txt
# 2. Create new session with same windows
tmux new-session -d -s recovery
while read -r wid layout; do
tmux new-window -t recovery -n "$wid"
tmux select-layout -t recovery "$layout"
done < tmux-backup.txt
# 3. Attach to new session
tmux attach -t recovery
We've all been there - you're working in tmux when suddenly your terminal display turns into a garbled mess. Maybe you accidentally piped binary output to stdout, or perhaps a misbehaving script dumped raw control sequences. The telltale signs include:
- Window borders displaying raw escape sequences like
^[[38;5;231m
- Text rendering incorrectly across panes
- Terminal state persisting incorrectly when switching between windows
- Standard
reset
commands failing to fully restore functionality
The usual terminal recovery methods don't work because tmux maintains its own internal terminal state for each pane. When you run reset
, it only affects the current pane's virtual terminal, not tmux's internal buffers.
Here are several approaches to recover without killing your session:
1. The Nuclear Reset
This completely refreshes all panes by resetting both the terminal and tmux's display:
# In the affected pane:
printf '\033k%s\033\\\033]2;%s\007\033[0m' "$(hostname -s)" "$(hostname -s)"
tmux refresh-client -S
2. Pane-Specific Reset
For targeted pane recovery:
# Get pane ID
tmux list-panes -F '#{pane_id}'
# Reset specific pane
tmux send-keys -t %1 C-c 'eval $(tmux show-environment -s)' Enter
tmux send-keys -t %1 'stty sane' Enter
tmux send-keys -t %1 'reset' Enter
3. Window-Level Reset
To refresh an entire window:
tmux new-window -n temp
tmux kill-window -t 1 # replace with your corrupted window number
Add these to your .tmux.conf
to minimize future issues:
# Automatically reset unknown control sequences
set -g allow-passthrough on
set -g assume-paste-time 1
# Watch for binary output patterns
set-hook -g pane-mode-changed 'if-shell -F "#{||:#{pane_in_mode},#{mouse_any_flag}}" "send-keys C-c"'
When things go wrong, inspect the damage:
# Show current terminal state
infocmp -L
# Dump tmux pane contents for analysis
tmux capture-pane -p -S - -E - > pane_dump.txt