How to create tmux session with a script

If you are a user of tmux, you probably find yourself re-creating the same session structure every time when you start a tmux. Although there are some projects meant to provide a way to write a configuration file & recreate a session base on it, such as:

both of them are Ruby-based, and if you are not a ruby developer it can feel like too much of a hassle to get a language interpreter & a package manager for such a task.

In this article, I will show you how to create a tmux window with tmux CLI commands, so you can enjoy the same window structure without having to create everything yourself manually.

Working example

The example script works like this: asciicast

Code and explanation

First create the tmux-start.sh file & make it executable:

$ touch tmux-start.sh
$ chmod +x tmux-start.sh

Then set the file content as follows:

#!/bin/bash

Make the file executable with bash shell.

session="webpack-ts"

tmux new-session -d -s $session

Creates a new session, and gives it a name. You cannot use spaces here and use the same name twice. Especially with nested sessions name collisions can end up weird - with windows nesting one another in an infinite loop.

window=0
tmux rename-window -t $session:$window 'git'
tmux send-keys -t $session:$window 'git fetch --prune --all' C-m

window 0 is special because it's already created with a session - that's why we rename it, and not create it as all the other windows in the example. The second is sending some command to the window & execute it immediately - thanks to adding C-m after the command.

I call it git, because I like having all the preview git commands on the screen when I run a new one.

window=1
tmux new-window -t $session:$window -n 'vim'
tmux send-keys -t $session:$window 'vim package.json'

Creates a new window called vim, and type the command to start the editor. I don't call it automatically - after getting to the window, I'll have to press enter myself.

window=2
tmux new-window -t $session:$window -n 'run'

window=3
tmux new-window -t $session:$window -n 'serve'
tmux send-keys -t $session:$window 'npm run serve'

just creates two other windows

tmux attach-session -t $session

Attaches the session to the current window.

The complete file ./tmux-start.sh:

#!/bin/bash

session="webpack-ts"

tmux new-session -d -s $session

window=0
tmux rename-window -t $session:$window 'git'
tmux send-keys -t $session:$window 'git fetch --prune --all' C-m

window=1
tmux new-window -t $session:$window -n 'vim'
tmux send-keys -t $session:$window 'vim package.json'

window=2
tmux new-window -t $session:$window -n 'run'

window=3
tmux new-window -t $session:$window -n 'serve'
tmux send-keys -t $session:$window 'npm run serve'

tmux attach-session -t $session

Thanks

Many thanks to the author of Scripting A Tmux Work-space Start-up. The approach I'm presenting here I have it from there, plus I had to tweak it a bit to make sure it's always producing the same results even if I start multiple windows a the same time.

Summary

In this article, we have seen how to create a script that starts a tmux session for us. If you want, you can even chain few scripts like this to create nested windows.