I work on a lot of projects.
$ ls ~/Projects/ | wc -l
29
$ ls ~/Projects/work/ | wc -l
67
And that’s just what I have checked out at the moment. 😇
Anywyas, working on security and operations type tasks, I end up switching between repos/projects/languages quite often. It doesn’t take long to switch to a new folder, start up an IDE (VSCode at the moment), and start up a tmux session (so I can keep multiple terminals confined to one tab in iTerm). But it could be quicker!
I probably actually do this often enough that I’m on the left side of the chart, even if it dosn’t actually save that much time. Still, it’s fun!
So let’s right a quick script to do that all:
#!/bin/bash
paths="~/Projects ~/Projects/work ~"
for path in $paths
do
eval fullpath="$path/$@"
if [[ -d $fullpath ]]
then
cd $fullpath
code .
tmux new -A -s $(basename $(pwd) | tr -cd '[a-zA-Z0-9]_-')
exit 0
fi
done
echo "No directories found named $@ in: $paths"
Most of the magic comes in looping through a series of folders where I keep projects I work on, checking for a folder name passed on the command line. If the folder exists, we’ll open VSCode with code .
and start tmux
with the -A
flag to re-attach (if we already had a session for that folder) and -s
to name the session. The $(basename $(pwd))
gives us the name of the folder (although I could just use "$@"
I guess…) and tr -cd '[a-zA-Z0-9]_-'
strips out fancy characters that tmux
doesn’t like using in session names.
One funny bit that you might wonder about: eval fullpath="$path/$@"
All that does is expand the ~
in the path names. Without the eval
, it leaves the ~
as a literal character, which isn’t actually the name of the path. Oops.
So in the end, we get one each of a VSCode and tmux session for this project (if I already had either one, it will bring that to focus instead of creating a new one). Pretty cool and pretty quick. If the folder can’t be found, I can even print out a message. Fun times.
Full source (it’s the same as above) in my dotfiles repo: work-on