My current replacement for screen, which I use with the following ~/.tmux.conf under iTerm and via SSH on my iPad.

Synchronized Input To Multiple Sessions

Want to send the same commands to multiple sessions/machines? Hit Ctrl+B and toggle that with:

:setw synchronize-panes

Saner Resizing

When having multiple clients connected to the same window, constrain window size only when necessary:

setw -g aggressive-resize on

Peeking at a file (using a bash function)

peek() { tmux split-window -p 33 "$EDITOR" "[email protected]" || exit; }

Re-attaching a “lost” session

Send SIGUSR1 to the process to have it re-create the socket in /tmp:

killall -s SIGUSR1 tmux
tmux attach

Getting the mouse to work

When using iTerm or recent versions of Cygwin, you can set these options in ~/.tmux.conf to have tmux respond to mouse clicks over an SSH session:

# For tmux 2.1 as shipped with Cygwin
set -g mode-mouse
# For tmux 1.8 as shipped with Ubuntu 14.04
set -g mode-mouse on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on

Getting the cursor keys to work “right”

As seen here, the default movement bindings between panes are defined with -r, which causes some confusion when, say, you switch panes “down” and then try to fetch the last command from bash history with the up key but instead end up in the up pane again.

The solution is to redefine those bindings without repeat like so:

bind-key Up    select-pane -U
bind-key Down  select-pane -D
bind-key Left  select-pane -L
bind-key Right select-pane -R

My base config

# make mouse useful in iTerm
set -g mouse-select-pane on

# automatically set window title
setw -g automatic-rename

# act like vim
setw -g mode-keys vi
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind-key -r C-h select-window -t :-
bind-key -r C-l select-window -t :+
bind < resize-pane -L 4
bind > resize-pane -R 4
bind - resize-pane -D 4
bind + resize-pane -U 4

# disable repeat on cursors
bind-key Up    select-pane -U
bind-key Down  select-pane -D
bind-key Left  select-pane -L
bind-key Right select-pane -R

# look good
set -g default-terminal "screen-256color"

# status indicators
#set -g status-right '#(uptime | cut -d, -f 2-)'


# default statusbar colors
set-option -g status-bg colour235 #base02
set-option -g status-fg colour136 #yellow
set-option -g status-attr default

# default window title colors
set-window-option -g window-status-fg colour244
set-window-option -g window-status-bg default
#set-window-option -g window-status-attr dim

# active window title colors
set-window-option -g window-status-current-fg colour166 #orange
set-window-option -g window-status-current-bg default
#set-window-option -g window-status-current-attr bright

# pane border
set-option -g pane-border-fg colour235 #base02
set-option -g pane-active-border-fg colour240 #base01

# message text
set-option -g message-bg colour235 #base02
set-option -g message-fg colour166 #orange

# pane number display
set-option -g display-panes-active-colour colour33 #blue
set-option -g display-panes-colour colour166 #orange

# clock
set-window-option -g clock-mode-colour colour64 #green

Quickie guide for installing it anywhere (like, say, funky Debian servers from last century):

  • Get libevent (2.0.12 at the time of this writing)
  • Get the source (1.4 at the time of this writing)
  • make, shake, but not stir.