This isn’t really magic, but arguable how tmux is designed to be used.
When I started using tmux, I was coming from iTerm. In iTerm, splits and
tabs open a new shell, so naturally when I started using tmux this is
how I used it. It didn’t help that the built-in bindings for tmux do
encourage this (e.g.
prefix + c to open a new window). After a while
of using tmux this way, I felt like there must be a better way thank
opening new shells all the time. My sessions were littered with
abandoned splits and windows called
It began with this binding:
bind -n C-Space command-prompt -p ":new-window" "new-window %%"
Using control and space in tmux, it would open up a command prompt which
I’d use to type in the command I wanted to run in a new window. This is
quite reminiscent of Alfred if you’ve used it. This was great for
a while. I used it for running quick commands in the background like
git pull or
git commit -p or install dependencies or running
database migrations or opening the manual for a command. You can even
-d flag to not focus the new window. Or the
-n flag to name
the window. This is helpful for windows that run a persistent command
-dn watch yarn watch).
There are two big benefits to a command first approach to tmux windows:
- The windows/splits close when the program exits.
- You can respawn the pane by running the
respawn-pane -ktmux command. This is very helpful if you’ve just reinstall deps and you need to restart a watch command. I bound this to control and r:
bind r respawn-pane -k
I realized after some time that
split-window is just as desirable to
use. I bound these to alt + the arrow keys:
bind -n M-Right command-prompt -p ":split-window -h" "split-window -h %%" bind -n M-Left command-prompt -p ":split-window -bh" "split-window -bh %%" bind -n M-Up command-prompt -p ":split-window -b" "split-window -b %%" bind -n M-Down command-prompt -p ":split-window" "split-window %%"