Image of the glider from the Game of Life by John Conway
Skip to content

My ZSH Prompt Improved

I've been meaning to get to this for some time, but haven't gotten around to it until today. In a previous post, I shared with the world my zsh PS1 variable. Well, I extended it a bit this morning making it more informative. First, I need to setup a scenario:

I'm running screen locally on my laptop (we'll refer to it as SCREEN_L), and remotely on my server (we'll refer to this one as SCREEN_R). For SCREEN_L, there is a ~/.screenrc that I use to show what screen window buffer I'm using via the "hardstatus" directive. My ~/.screenrc is thus:

aaron@kratos:~ 2609 % cat .screenrc 
screen -t python 0
screen -t irssi 1
screen -t shell 2
screen -t notify 3
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]' 

That puts a nice status line at the bottom of my terminal, letting me know what screen buffer I'm in, as well as it's title. However, I don't want to run a ~/.screenrc under SCREEN_R. This just means yet another hardstatus line that I really don't want (I value my pixels). Rather, I would like to be notified what screen window I'm under, if any, in my prompt. After a bit of digging, I came up with the solution.

First, the environment variable $WINDOW is keeping track of this automatically for me. For example:

aaron@kratos:~ 2610 % echo "\"$WINDOW\""
""
aaron@kratos:~ 2611 % screen
aaron@kratos:~ 2612 % echo "\"$WINDOW\""
"0"

Perfect! Now, to get it into my prompt. This is easy with adding a little if logic to our ~/.zshrc:

1
2
3
4
5
6
if [ x"$WINDOW" = x ]; then
    SCREEN="($WINDOW)"
else
    SCREEN=""
fi
PS1="%n@%m$SCREEN:%~%(?..[%?]) %h %# "

What am I doing here? Well, first off I'm checking to see if the $WINDOW variable is blank. I'm using x"$WINDOW" != x for a simple reason. Zsh is expecting a valid condition after '!='. Unfortunately, an empty string isn't satisfying it. So, I prepend the letter x to the $WINDOW variable, and test to make sure it doesn't equal just 'x'. Second, if $WINDOW equals anything other than 'x', a SCREEN variable is defined with the $WINDOW variable contents wrapped in parenthesis. This $SCREEN variable is then added to the prompt.

Now, I add this to my ~/.zshrc for my SCREEN_R, and I can see where I'm at in my screen session remotely without the need for a remote ~/.screenrc. Here's the results, also showing off exit code:

aaron@kratos:~ 2614 % screen
aaron@kratos(0):~ 2615 % ping foo
ping: unknown host foo
aaron@kratos(0):~[2] 2616 % 

Cheers!

{ 3 } Comments