My Tmux Configuration

September 05, 2013

tmux is a terminal multiplexer. It allows you to have multiple virtual consoles open in a single terminal window. Moreover, you can detatch and attach to a tmux session without ending it, allowing you great flexibility when working on remote servers or machines. In many respects it is just like GNU Screen, but is distributed under a BSD license.

Working from tmux: Productive Mouse Free Development from Pragmatic Press I created my initial .tmux.conf file. Over time I have modified my configuration, most recently to improve the status bar information displayed. What follows is a somewhat annotated listing of my tmux configuration.

    # use UTF8
    set -g utf8
    set-window-option -g utf8 on

    # make tmux display things in 256 colors
    set -g default-terminal "screen-256color"

    # set scrollback history to 10000 (10k)
    set -g history-limit 10000

    # set Ctrl-a as the default prefix key combination
    # and unbind C-b to free it up
    set -g prefix C-a
    unbind C-b

    # use send-prefix to pass C-a through to application
    bind C-a send-prefix

    # shorten command delay
    set -sg escape-time 1

    # set window and pane index to 1 (0 by default)
    set-option -g base-index 1
    setw -g pane-base-index 1

    # reload ~/.tmux.conf using PREFIX r
    bind r source-file ~/.tmux.conf \; display "Reloaded!"

    # use PREFIX | to split window horizontally and PREFIX - to split vertically
    bind | split-window -h
    bind - split-window -v

    # Make the current window the first window
    bind T swap-window -t 1

    # map Vi movement keys as pane movement keys
    bind h select-pane -L
    bind j select-pane -D
    bind k select-pane -U
    bind l select-pane -R

    # and use C-h and C-l to cycle thru panes
    bind -r C-h select-window -t :-
    bind -r C-l select-window -t :+

    # resize panes using PREFIX H, J, K, L
    bind H resize-pane -L 5
    bind J resize-pane -D 5
    bind K resize-pane -U 5
    bind L resize-pane -R 5

    # explicitly disable mouse control
    setw -g mode-mouse off
    set -g mouse-select-pane off
    set -g mouse-resize-pane off
    set -g mouse-select-window off

    # ---------------------
    # Copy & Paste
    # ---------------------
    # provide access to the clipboard for pbpaste, pbcopy
    set-option -g default-command "reattach-to-user-namespace -l zsh"
    set-window-option -g automatic-rename on

    # use vim keybindings in copy mode
    setw -g mode-keys vi

    # setup 'v' to begin selection as in Vim
    bind-key -t vi-copy v begin-selection
    bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

    # update default binding of 'Enter' to also use copy-pipe
    unbind -t vi-copy Enter
    bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

    bind y run 'tmux save-buffer - | reattach-to-user-namespace pbcopy '
    bind C-y run 'tmux save-buffer - | reattach-to-user-namespace pbcopy '

    # ----------------------
    # set some pretty colors
    # ----------------------
    # set pane colors - hilight the active pane
    set-option -g pane-border-fg colour235 #base02
    set-option -g pane-active-border-fg colour240 #base01

    # colorize messages in the command line
    set-option -g message-bg black #base02
    set-option -g message-fg brightred #orange

    # ----------------------
    # Status Bar
    # -----------------------
    set-option -g status on                # turn the status bar on
    set -g status-utf8 on                  # set utf-8 for the status bar
    set -g status-interval 5               # set update frequencey (default 15 seconds)
    set -g status-justify centre           # center window list for clarity
    # set-option -g status-position top    # position the status bar at top of screen

    # visual notification of activity in other windows
    setw -g monitor-activity on
    set -g visual-activity on

    # set color for status bar
    set-option -g status-bg colour235 #base02
    set-option -g status-fg yellow #yellow
    set-option -g status-attr dim 

    # set window list colors - red for active and cyan for inactive
    set-window-option -g window-status-fg brightblue #base0
    set-window-option -g window-status-bg colour236 
    set-window-option -g window-status-attr dim

    set-window-option -g window-status-current-fg brightred #orange
    set-window-option -g window-status-current-bg colour236 
    set-window-option -g window-status-current-attr bright

    # show host name and IP address on left side of status bar
    set -g status-left-length 70
    set -g status-left "#[fg=green]: #h : #[fg=brightblue]#(curl #[fg=yellow]#(ifconfig en0 | grep 'inet ' | awk '{print \"en0 \" $2}') #(ifconfig en1 | grep 'inet ' | awk '{print \"en1 \" $2}') #[fg=red]#(ifconfig tun0 | grep 'inet ' | awk '{print \"vpn \" $2}') "

    # show session name, window & pane number, date and time on right side of
    # status bar
    set -g status-right-length 60
    set -g status-right "#[fg=blue]#S #I:#P #[fg=yellow]:: %d %b %Y #[fg=green]:: %l:%M %p :: #(date -u | awk '{print $4}')::"

The copy and paste section comes from Tmux Copy & Paster on OS X: A Better Future.

For a time I used tmux-powerline for my status bar. However this felt like a sledgehammer for peanuts kind of solution. This past weekend I removed tmux-powerline and created the status bar setup shown above. With the potential to show four IP address the left side of the status bar is a bit crowded, but I only ever use tmux in a full screen terminal window so I have real estate to spare.

The right side of the status bar displays the session name, screen and pane numbers, date, and local time, and finally UTC time. The middle of the status bar shows a list of the current windows.

The status bar colors are loosely based on tmux-colors-solarized.

tmux screen shot

You can see my .tmux.conf, along with my entire dotfiles collection by visiting my dotfiles repository on GitHub.

Author's profile picture

Mark H. Nichols

I am a husband, cellist, code prole, nerd, technologist, and all around good guy living and working in fly-over country. You should follow me on Twitter.