Switching to tmux

Some time ago I was fighting my .screenrc again. I wanted to change the status line, but it was hardly possible to read and understand what I typed hardly half a year ago. The screen config file is not exactly poetry.

While searching the web to find how to change the status line I ran into tmux and I thought: “Let’s give it a try”. And after the very simple compile I started configuring it. What a surprise I was in for. This config file could be read, understood and changed. Man, this is good.

One of the first things I changed was the default Prefix key Ctrl-B. I changed it to Alt-A, so I can still use all the control keys with Vim and in the terminal.

I also installed it on my Macbook and configured iTerm2 to use the “option” key to send meta-chars and that was all. Working in a single shot.

Things I like

  • Horizontal and vertical screen split actually work
  • Good and readable config file
  • Fast
  • Easy to script

Things I don’t like

  • I’m missing the serial connection possibility. This is not a show stopper, I can always use screen for that.
  • The default Esc delay. But again no show stopper. Easy to configure.

Scripting with tmux

I created a little script (as a demo) to show how easy it is to script with tmux.

tmux new-session -d -s session_name

tmux new-window -t session_name:1 -n 'local'
tmux new-window -t session_name:2 -n 'login'  'ssh login'
tmux new-window -t session_name:3 -n 'backup' 'ssh backup'
tmux new-window -t session_name:4 -n 'devel'  'ssh devel'

tmux select-window -t session_name:1
tmux attach-session -t session_name

Setting the hostname in the status bar

In my ~/.zshrc I do have the following code to set the hostname of the window in the tmux status bar

	if [[ ( ${-} == *i* ) && ( ${TERM} == screen* ) ]]
	    echo -n "\ek$(hostname -s)\e\\"

My ~/.tmux.conf

# vi: set sw=4 ts=4 ai:                            ("set modeline" in ~/.exrc) #
# Config file  : ~/.tmux.conf                                                  #
#                                                                              #
# Author       : Ton Kersten                                   The Netherlands #

# I use all Alt-Keys instead of Ctrl. This because I use a lot of Ctrl in
# Vim and so on and I don't like to use the Prefix all the time.
# And.... this also works on OSX with iTerm2

# Set that stupid Esc-Wait off, so VI works again
set-option -sg	escape-time 0

# Set the prefix to Alt-A
set-option -g	prefix M-a
bind-key M-a	send-prefix

# All kind of nice options
set-option -g	bell-action any
set-option -g	default-terminal screen
set-option -g	display-panes-colour red
set-option -g	history-limit 100000
set-option -g	message-bg red
set-option -g	message-fg white
set-option -g	mouse-select-pane off
set-option -g	pane-active-border-bg default
set-option -g	pane-active-border-fg red
set-option -g	pane-border-bg default
set-option -g	pane-border-fg cyan
set-option -g	repeat-time 500
set-option -g	visual-activity off
set-option -g	visual-bell on
set-option -g	set-titles on
set-option -g	set-titles-string ' #I-#W '
set-option -g	terminal-overrides 'xterm*:smcup@:rmcup@'
set-option -g	base-index 1
set-option -g	default-path ""

# Screen lock
bind-key C-x	lock-server
bind-key x		lock-server
bind-key -n M-x	lock-server
set-option -g	lock-after-time 0
set-option -g	lock-server on
set-option -g	lock-command "vlock"

# statusbar
set-option -g	status-utf8 on
set-option -g	status-interval 5
set-option -g	status-justify left
set-option -g	status-left-length 15
set-option -g	status-left ' #h |'
set-option -g	status-right ' | %Y-%m-%d %H:%M #[default]'

# default statusbar colors
set-option -g	status-fg white
set-option -g	status-bg blue
set-option -g	status-attr bright
set-option -g	status-keys emacs

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

# active window title colors
set-window-option -g window-status-current-fg yellow
set-window-option -g window-status-current-bg red
set-window-option -g window-status-current-attr bright
set-window-option -g mode-fg white
set-window-option -g mode-bg red
set-window-option -g mode-attr bright

# Window options
set-window-option -g utf8 on
set-window-option -g clock-mode-colour blue
set-window-option -g clock-mode-style 24
set-window-option -g monitor-activity on
set-window-option -g xterm-keys on
set-window-option -g automatic-rename on
set-window-option -g aggressive-resize off
set-window-option -g window-status-format ' #I-#W '
set-window-option -g window-status-current-format ' #I-#W '

# Remap keys to my settings
unbind-key M-d		; bind-key -n M-d	detach-client
unbind-key d		; bind-key d		detach-client

unbind-key M-c		; bind-key -n M-c	command-prompt -p "tmux:"
unbind-key M-m		; bind-key -n M-m	command-prompt -p "Man:" "split-window 'man %%'"
unbind-key Tab		; bind-key Tab		choose-window
unbind-key M-w		; bind-key -n M-w	choose-window
unbind-key M-e		; bind-key -n M-e	choose-session
unbind-key M-t		; bind-key -n M-t	new-window
unbind-key t		; bind-key t		new-window
unbind-key M-`		; bind-key -n M-`	last-window
unbind-key n		; bind-key n		next-window
unbind-key p		; bind-key p		previous-window
unbind-key M-n		; bind-key -n M-n	next-window
unbind-key M-p		; bind-key -n M-p	previous-window
unbind-key M-right	; bind-key -n M-right	next-window
unbind-key M-left	; bind-key -n M-left	previous-window

# Window selection
unbind-key 1		; bind-key 1		select-window -t 1
unbind-key 2 		; bind-key 2		select-window -t 2
unbind-key 3		; bind-key 3		select-window -t 3
unbind-key 4		; bind-key 4		select-window -t 4
unbind-key 5		; bind-key 5		select-window -t 5
unbind-key 6		; bind-key 6		select-window -t 6
unbind-key 7		; bind-key 7		select-window -t 7
unbind-key 8		; bind-key 8		select-window -t 8
unbind-key 9		; bind-key 9		select-window -t 9
unbind-key 0		; bind-key 0		select-window -t 10
unbind-key M-1		; bind-key -n M-1	select-window -t 1
unbind-key M-2		; bind-key -n M-2	select-window -t 2
unbind-key M-3		; bind-key -n M-3	select-window -t 3
unbind-key M-4		; bind-key -n M-4	select-window -t 4
unbind-key M-5		; bind-key -n M-5	select-window -t 5
unbind-key M-6		; bind-key -n M-6	select-window -t 6
unbind-key M-7		; bind-key -n M-7	select-window -t 7
unbind-key M-8		; bind-key -n M-8	select-window -t 8
unbind-key M-9		; bind-key -n M-9	select-window -t 9
unbind-key M-0		; bind-key -n M-0	select-window -t 10

# Window splitting
unbind-key M--		; bind-key -n M--	split-window -v
unbind-key M-\		; bind-key -n M-\	split-window -h
unbind-key \		; bind-key \		split-window -h
unbind-key |		; bind-key |		split-window -h
unbind-key -		; bind-key -		split-window -v

# Pane selection and resizing
unbind-key left		; bind-key left		select-pane -L
unbind-key up		; bind-key up		select-pane -U
unbind-key down		; bind-key down		select-pane -D
unbind-key right	; bind-key right	select-pane -R
unbind-key C-h		; bind-key C-h		select-pane -L
unbind-key C-k		; bind-key C-k		select-pane -U
unbind-key C-j		; bind-key C-j		select-pane -D
unbind-key C-l		; bind-key C-l		select-pane -R
unbind-key j		; bind-key -r j		resize-pane -D 5
unbind-key k		; bind-key -r k		resize-pane -U 5
unbind-key h		; bind-key -r h		resize-pane -L 5
unbind-key l		; bind-key -r l		resize-pane -R 5
unbind-key C-left	; bind-key -r C-left	resize-pane -L 1
unbind-key C-right	; bind-key -r C-right	resize-pane -R 1
unbind-key C-up		; bind-key -r C-up	resize-pane -U 1
unbind-key C-down	; bind-key -r C-down	resize-pane -D 1

unbind-key @		; bind-key @		confirm-before kill-window
unbind-key M-r		; bind-key -n M-r	source-file ~/.tmux.conf
unbind-key q		; bind-key q		list-keys
unbind-key M-q		; bind-key -n M-q	list-keys

# Copy mode
set-window-option -g mode-keys vi
set-window-option -g mode-mouse off
set-option buffer-limit 10
unbind-key M-NPage		; bind-key -n M-NPage		copy-mode
unbind-key M-PPage		; bind-key -n M-PPage		copy-mode
unbind-key M-i			; bind-key -n M-i		paste-buffer
unbind-key -t vi-copy M-{	; bind-key -t vi-copy M-{	begin-selection
unbind-key -t vi-copy M-}	; bind-key -t vi-copy M-}	copy-selection
unbind-key -t vi-copy Home	; bind-key -t vi-copy Home	start-of-line
unbind-key -t vi-copy End	; bind-key -t vi-copy End	end-of-line
unbind-key -t vi-copy b		; bind-key -t vi-copy b		rectangle-toggle

See also