# The following function generates a two-line PS1 prompt.  It uses two new
# array variables, abovePS1 and aboveRPS1, either of which may be empty or
# unset.  Each of these is a series of prompt segments that should appear,
# obviously, above the regular PS1 and RPS1 prompts.  (I generally prefer to
# put the extra info in the xterm title bar, but when not using an xterm
# this can be handy.)
#
# To use the two-line prompt:
#
# 	  function precmd() {
# 	    two_line_prompt
# 	  }
abovePS1=(%m %n %~)
aboveRPS1=(%W %@ tty%l)	# Remember, display is reversed to tty%l %@ %W.

realPS1=$PS1		# Save the original PS1 for later use

two_line_prompt() {
    local fakePS1="" fakeRPS1="" p P

    for p in $abovePS1
    do
	# Compute the width of each abovePS1 segment.  If the total
	# width so far is wider than the screen, omit the segment.
	P=$(print -nP $p)
	if [[ $[$#fakePS1+$#P] -lt $[$COLUMNS-1] ]]
	then fakePS1="${fakePS1:+$fakePS1 }$P"
	fi
    done

    for p in $aboveRPS1
    do
	# Add in the width of each aboveRPS1 segment.  If the total
	# width so far is wider than the screen, omit the segment.
	P=$(print -nP $p)
	if [[ $[$#fakePS1+$#fakeRPS1+$#P] -lt $COLUMNS-1 ]]
	then fakeRPS1="$P${fakeRPS1:+ $fakeRPS1}"
	fi
    done

    if [[ $[$#fakePS1+$#fakeRPS1] -gt 0 ]]
    then
        # Reset fakeRPS1 to use right-justified display (typeset -R) at
        # the correct width to push it to the right edge of the screen.
        local -R $[$COLUMNS-$#fakePS1-1] fakeRPS1="$fakeRPS1"

        # Prefix PS1 with the first line of the two-line prompt.
        PS1="$fakePS1$fakeRPS1
$realPS1"
    else PS1=$realPS1
    fi
}
