Customizing screen and screenrc.
While my professional development has moved to VSCode (and don’t get me wrong, I write effectively zero code as a CTO), I still do my personal work in a combination of Screen, Emacs and shell commands. I recently bought a new home computer to replace my aging iMac, and decdied to try something different: what if I left auto-update enabled instead of clicking “Remind me tomorrow” every day until this computer, too, is replaced?
This has been going well, except that I usually have two to three projects that
I work on once or twice a month each (for example staffeng,
this blog, etc), and the screen
sessions were getting blown away each time
a software update forced a reboot.
Today I decided that I was done manually setting up these screen windows after each reboot, and spent some time poking around to find a way to automate the setup after reboot.
First version
For my first pass I focused on finding something that worked no matter how terrible or inelegant it was. I ended up creating two files:
~/config/staffeng.rc
escape ^Pp
startup_message off
vbell off
screen -t dev 1 zsh -c "gatsby develop"
screen -t write 2 zsh
screen -t cli 3 zsh
~/config/staffeng.sh
ORIG=`pwd`
cd ~/git/staff-eng && screen -d -R staffeng -c $ORIG/staffeng.rc
Then (after making staffeng.sh
executable with chmod +x
) I was able
to start my desired configuration via:
cd ~/config
./staffeng.sh
These work surprisingly well! It lets me setup my working environment, and also reattaches to the existing setup if one’s already open thanks to the -d -R flags.
Second version
However, I have a bunch of different projects, so I wanted to avoid repeating
the contents of my ~/.screenrc
in each one of these, fortunately there’s
a source
option for Screen configs, so I simplified ~/config/staffeng.rc
down to:
source ~/.screenrc
screen -t dev 1 zsh -c "gatsby develop"
screen -t write 2 zsh
screen -t cli 3 zsh
This makes the staffeng.rc
about as simple as it can get,
but the runner script still feels a bit messier than necessary.
Third version
Looking at the staffeng.sh
file:
ORIG=`pwd`
cd ~/git/staff-eng && screen -d -R staffeng -c $ORIG/staffeng.rc
I decided to try a different pattern of dropping a .screenrc
into
the different repositories I was working on and then having a generalized
command I would run within that directory to spin up the project’s screen
settings.
For example, I would create:
~/git/staff-eng/.screenrc
~/git/irrational_exuberance/.screenrc
And then ideally I’d just:
cd ~/git/staff-eng
setup-screen
Implementing setup-screen
turns out to be pretty simple:
PWD=`pwd`
NAME=`basename $PWD`
screen -d -R $NAME -c ./.screenrc
Then I copied staffeng.rc
into ~/git/staff-eng/.screenrc
and invoked the new setup-screen
.
cd ~/git/staff-eng
setup-screen
This picks up the basename of the repository as the name and rejoins any existing screen with the same name:
willl@Mac-mini staff-eng % screen -ls
There is a screen on:
1435.staff-eng (Attached)
Altogether, pretty excited for how well this works.
The only issue at this point is that if started processes exit,
for example running gatsby develop
,
then it doesn’t exit to the shell,
but rather it closes that window entirely.
Hopefully I can figure out a way to exit to zsh
instead of closing.