If you live in the terminal—if tools like Vim, Git, and SSH are your bread and butter—then tmux
isn’t just another utility. It’s the final piece of the puzzle, the force multiplier that ties your entire workflow together.
Many guides will throw a hundred commands at you. This one is different. We’re going to build a mental model, craft a powerful, ergonomic configuration from scratch, and automate our workflow until it feels like magic. By the end, you won’t just know tmux; you’ll wonder how you ever lived without it.
Before typing a single command, we need to understand the problem tmux solves.
Think about your development workflow. You have a text editor, a running dev server, a git process, maybe another shell for running tests. This is a mess of terminal tabs or windows. If you accidentally close one, the process dies. If you get disconnected from a remote server, your entire session is gone.
Tmux solves this by acting as a “window manager” for your terminal. But a better analogy is that tmux organizes your brain. It keeps the entire context of a project—all the shells, processes, and layouts—in one persistent, organized space.
To grasp this, you only need to understand one concept: The Tmux Hierarchy.
project-api
, dotfiles
). This is the most important level. You can detach from a session, leaving it running, and re-attach later.That’s it. Server -> Session -> Window -> Pane. Understand this, and the rest will click into place.
Let’s get our hands dirty.
macOS (with Homebrew):
brew install tmux
EndeavourOS / Arch Linux:
sudo pacman -S tmux
This is the golden rule. Always name your sessions after the project you’re working on.
Start a new, named session:
tmux new -s my-project
Your terminal will change. You’ll see a status bar at the bottom. You are now inside a tmux session.
Detach from the session: Press Ctrl-b
then d
. (This is the default “prefix” key followed by the detach key).
You’re back in your normal shell, but the my-project
session is still running in the background.
List running sessions:
tmux ls
Attach to the session:
tmux attach -t my-project
And you’re right back where you were, with all your processes still running. This is the core magic of tmux.
Once inside a session, you’ll want to organize your workspace. All commands are preceded by the prefix key (Ctrl-b
by default).
Ctrl-b
then %
Ctrl-b
then "
Ctrl-b
then Arrow Keys
Ctrl-b
then x
(or just type exit
in the shell)Ctrl-b
then c
Ctrl-b
then n
Ctrl-b
then p
Ctrl-b
then ,
(super useful for organization!)Ctrl-b
then z
..tmux.conf
The default tmux experience is… clumsy. Ctrl-b
is awkward. The split commands are weird. We can do better. Let’s build our configuration file: ~/.tmux.conf
.
Create the file: touch ~/.tmux.conf
. Now, add the following blocks of code to it, one by one.
These changes fix the biggest annoyances and make tmux feel like an extension of your hands.
# ~/.tmux.conf
#-- Base Configuration --#
# Set Ctrl-a as the prefix key, which is more ergonomic than Ctrl-b
# Unbind the default C-b
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix
# Enable mouse mode for scrolling, pane selection, and resizing
set -g mouse on
# Start window and pane numbering from 1, not 0
set -g base-index 1
setw -g pane-base-index 1
#-- Keybindings for a more intuitive experience --#
# Reload the config file with Prefix + r
bind r source-file ~/.tmux.conf \; display "Config Reloaded!"
# Split panes using | for vertical and - for horizontal, which are visual
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %
# Navigate panes with vim keys
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
Save the file. To apply the changes, either restart tmux or, if you’re inside a session, use our new keybinding: Ctrl-a
then r
. Your prefix is now Ctrl-a
!
A couple more tweaks to make things pleasant.
# ~/.tmux.conf (add to the end)
#-- Quality of Life --#
# Increase the scrollback history limit
set -g history-limit 10000
# Set a longer duration for display messages
set -g display-time 1500
# Set the title of the terminal window
set -g set-titles on
set -g set-titles-string '#S' # Session name
Reload again (Ctrl-a
then r
). Now we have a solid, usable foundation.
This is where we go from proficient to unstoppable. We’ll use the Tmux Plugin Manager (TPM) to add incredible features.
1. Install TPM
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
2. Configure TPM in .tmux.conf
Add this block to the very bottom of your ~/.tmux.conf
. This is where you will list the plugins you want to use.
# ~/.tmux.conf
#-- Plugin Manager (TPM) --#
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible' # Sensible defaults
# Our essential power-user plugins
set -g @plugin 'tmux-plugins/tmux-resurrect' # Persist sessions across reboots
set -g @plugin 'tmux-plugins/tmux-yank' # System clipboard integration
set -g @plugin 'christoomey/vim-tmux-navigator' # Seamless vim/tmux navigation
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'```
**3. Install the Plugins**
1. Reload your config: `Ctrl-a` then `r`.
2. Launch a tmux session.
3. Install the plugins by pressing: **`Ctrl-a` then `Shift-i`** (as in "Install").
You should see TPM cloning the repositories and finishing with "DONE!".
Now, let's look at the superpowers we just installed:
* **`vim-tmux-navigator`**: You can now navigate from a tmux pane directly into a neovim split (and back out) using the same `Ctrl-h/j/k/l` keys. No more context switching. It just works.
* **`tmux-yank`**: This solves the biggest frustration with tmux. Now, when you enter copy mode (`Ctrl-a` then `[`), select text with Vim keys (`v`, `y`), and press `y`... **it copies to your system clipboard.** You can paste it into your browser. This is a game-changer.
* **`tmux-resurrect`**: The ultimate persistence tool.
* Save your entire tmux environment (sessions, windows, panes): `Ctrl-a` then `Ctrl-s` (save).
* After a reboot, start tmux and press: `Ctrl-a` then `Ctrl-r` (restore).
* Your entire workspace is restored.
### The Final Boss: Workflow Automation
We're not done yet. The true mark of a power user is automation. Why manually `cd` into your project, start a tmux session, create windows, and split panes every time? Let's write a script to do it for us.
Let's say you have a project at `~/dev/my-cool-app`. Create a script there:
`~/dev/my-cool-app/start.sh`
```bash
#!/bin/bash
SESSION_NAME="my-cool-app"
# Check if the session already exists
tmux has-session -t $SESSION_NAME 2>/dev/null
# $? is a special variable that holds the exit code of the last command.
# 0 means the command was successful (the session exists).
# Anything else means it failed (the session does not exist).
if [ $? != 0 ]; then
# Create a new detached session
tmux new-session -d -s $SESSION_NAME -c ~/dev/my-cool-app
# Name the first window "Editor" and open neovim
tmux rename-window -t $SESSION_NAME:1 'Editor'
tmux send-keys -t $SESSION_NAME:1 'nvim' C-m # C-m is the Enter key
# Create a second window named "Services"
tmux new-window -t $SESSION_NAME -n 'Services' -c ~/dev/my-cool-app
# Split this window vertically
tmux split-window -v -t $SESSION_NAME:2 -c ~/dev/my-cool-app
# Run the dev server in the top pane
tmux send-keys -t $SESSION_NAME:2.1 'npm run dev' C-m
# Leave the bottom pane for git or other commands
tmux select-pane -t $SESSION_NAME:2.2
fi
# Attach to the session
tmux attach-session -t $SESSION_NAME
Make it executable: chmod +x ~/dev/my-cool-app/start.sh
.
Now, instead of a dozen steps, you just run ./start.sh
. If the session exists, it attaches. If not, it builds your entire development environment and then attaches. This is the pinnacle of tmux workflow.
You’ve come a long way. You’ve gone from an empty terminal to a fully configured, persistent, and automated development environment. You’ve built a setup that understands your workflow and actively works to make it faster.
Here is your personalized cheatsheet based on the configuration we built. Print it out. It’s all you need.
Action | Keybinding |
---|---|
Prefix Key | Ctrl-a |
Reload Config | Prefix + r |
--- Panes --- | |
Split Vertically | Prefix + ` |
Split Horizontally | Prefix + - |
Navigate (Vim Keys) | Prefix + h/j/k/l |
Zoom/Un-zoom Pane | Prefix + z |
Close Pane | Prefix + x |
--- Windows --- | |
New Window | Prefix + c |
Next Window | Prefix + n |
Previous Window | Prefix + p |
Rename Window | Prefix + , |
--- Plugins --- | |
Install Plugins | Prefix + Shift-i |
Save Session (Resurrect) | Prefix + Ctrl-s |
Restore Session (Resurrect) | Prefix + Ctrl-r |
--- Copy/Paste --- | |
Enter Copy Mode | Prefix + [ |
Copy to System Clipboard | y (in copy mode) |
Welcome to the next level of your command-line journey. Enjoy your new superpowers.
Enjoyed the article? I write about 1-2 a month. Subscribe via email or RSS feed.