tmux
or how to organize your terminal sessions
tmux
Terminal Multiplexer
Multiplexer?
[...] access multiple separate login sessions inside a single terminal window, or detach and reattach sessions from a terminal.
It is a wrapper that allows multiple text programs to run at the same time, and provides features that allow the user to use the programs within a single interface productively.
But why?
But why?
But why?
But why?
But why?
What's wrong with that?
- Hard to find the exact project you want inside of multiple terminal processes with same process name
- Can't hide / close terminal process without killing all processes within it
- Multiple long running processes needed for a project (e.g. server, console, sidekiq, weback) need to be started manually
How does TMux help?
- Organize your projects into named sessions, windows and panes that run in the same parent process
- Script tmux to bootstrap your projects
- Run long-living processes in the background with sessions
- Excellent integration with Vim, if you're using it
Terminology
- Sessions
- Windows <=> Tabs
- Panes <=> Splits
Terminology
- Prefix key - C-b (default), C-a (alternative)
- Shortcut example: prefix-c
- Mentally replace all occurences of 'prefix' with C-b, C-a or whatever you'd like to use as the prefix key
Session
- A named collection of terminals under the management of tmux
- Keep completely seperated working environments
- Easily create new and destroy existing sessions
- Processes continue to run in the background when a session is not in focus
Working with sessions
- prefix :new -t session_name<CR> - New named session
- prefix-s - List all sessions
- prefix :kill-session [-t session_name]<CR> - Kill current session or target session
- prefix-$ - Rename current session
Tmux Sessionist
- Provides convenient shortcuts for managing tmux sessions
- prefix-C - Create new named session
- prefix-S - Jump to previous session
- prefix-X - Kill attached session
- And a couple of more things...
Attaching and detaching sessions
- You can detach from a session at any time, and the sesssion continues to run in the background
- prefix-d - detach session
- tmux attach -t session-name
Tmux sessions and SSH
- Doing your work in a tmux session on a remote server will ensure you don't lose it your connection drops
- Multiple clients can attach to the same session, so you can do easy remote pair programming!
Windows
- Equivalent to tabs in terminal emulators
- Useful for organizing processes within the same project
Working with windows
- prefix-c - Create new window
- prefix-p / prefix-n - Previous and next window
- prefix-, - Rename current window
- prefix-& - Kill current window
Panes
- Equivalent to splits in terminal emulators
- Useful for running processes that require the same context (e.g. rails server and rails console)
Working with panes
- prefix-% - Vertical split
- prefix-" - Horizontal split
- prefix-x / Ctrl-d - Kill current pane
Zoom pane
- Expands the pane to fill the full size of your tmux window
- Incredibly useful if you want to focus on something temporarily
- prefix-z
Configuring tmux
- ~/.tmux.conf
# Set prefix to C-a
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# Bind prefix-R to reload configuration
bind R source-file '~/.tmux.conf' \; display-message "Tmux reloaded!"
# Enable mouse
set-option -g -q mouse on
# Use C-h/j/k/l to switch panes
is_vim='echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?)(diff)?$"'
bind -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
bind -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
bind -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
bind -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
Scripting Tmux
- You can target sessions, windows and even panes through the terminal
- Enables automation of starting up project environments
Scripting Tmux
# Caveat: guaranteed not to work...
tmux new-session -A -d -s bmx-api -n editor -c /home/marko/source/butterflymx/bmx-api/
tmux send-keys -t bmx-api 'vim' C-m
tmux new-window -n shell -t bmx-api -c /home/marko/source/butterflymx/bmx-api/
tmux new-window -n webpack -t bmx-api -c /home/marko/source/butterflymx/bmx-api/
tmux split-window -v -t bmx-api:1
tmux split-window -h -t bmx-api:1.1
tmux send-keys -t bmx-api:1.1 'rails s' C-m
tmux send-keys -t bmx-api:1.2 'rails c' C-m
tmux select-window -t bmx-api:0
tmux attach -t bmx-api
Your project bash script
Tmuxinator
- Ruby gem that enables you to intuitively build sessions from YAML configuration files
- gem install tmuxinator
Tmuxinator
name: bmx-api
root: /home/marko/source/butterflymx/api-rails4
# startup_window: 0
windows:
- editor: vim
- shell:
layout: 4a73,271x70,0,0{135x70,0,0,1,135x70,136,0[135x35,136,0,3,135x34,136,36,5]}
panes:
-
- rails s
- rails c
- webpack:
Fetching the scary layout thingy
- Arrange your panes in the way you like them
- Run prefix :list-windows<CR> to display a list of windows in the current session
- Hold shift to select the layout string and copy it over to your YAML file
Plugins - TPM
- Tmux plugin manager enables easy plugin installation and management
- https://github.com/tmux-plugins/tpm
Sensible
- Provides sensible tmux configurations
- https://github.com/tmux-plugins/tmux-sensible
Sessionist
- Adds convenient shortcuts for working with sessions
- https://github.com/tmux-plugins/tmux-sessionist
Resurrect
- Persist session between system restarts
- https://github.com/tmux-plugins/tmux-resurrect
Continuum
- Continous saving of tmux environment and automatic restore on tmux start
- Depends on resurrect plugin
- https://github.com/tmux-plugins/tmux-continuum
Conclusion
- We learned ~80% of what there is to know about tmux
- Leverage tmux's sessions to seperate your project workspaces, and windows and panes to organize them
Thanks!
Marko Ivanek
Rails Engineer @ ButterflyMX
Occasional consultant
markoivanek@gmail.com
Managing projects with TMux
By mivanek
Managing projects with TMux
- 1,121