The Elegant Useless Clock Prompt

Bash Prompt HOWTO:
Prev | Chapter 12. Example Prompts | Next

# 12.9. The Elegant Useless Clock Prompt

This is one of the more attractive (and useless) prompts I've made. Because many X terminal emulators don't implement cursor position save and restore, the alternative when putting a clock in the upper right corner is to anchor the cursor at the bottom of the terminal. This builds on the idea of the "termwide" prompt above, drawing a line up the right side of the screen from the prompt to the clock. A VGA font is required.

Note: There is an odd substitution in here, that may not print properly being translated from SGML to other formats: I had to substitute the screen character for \304 - I would normally have just included the sequence "\304", but it was necessary to make this substitution in this case.

    #!/bin/bash

    #   This prompt requires a VGA font.  The prompt is anchored at the bottom
    #   of the terminal, fills the width of the terminal, and draws a line up
    #   the right side of the terminal to attach itself to a clock in the upper
    #   right corner of the terminal.

    function prompt_command {
    #   Calculate the width of the prompt:
    hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//")
    #   "whoami" and "pwd" include a trailing newline
    usernam=$(whoami)
    newPWD="${PWD}"
    #   Add all the accessories below ...
    let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})-----" \
                     | wc -c | tr -d " ")
    #   Figure out how much to add between user@host and PWD (or how much to
    #   remove from PWD)
    let fillsize=${COLUMNS}-${promptsize}
    fill=""
    #   Make the filler if prompt isn't as wide as the terminal:
    while [ "$fillsize" -gt "0" ]
    do
       fill="${fill}Ä"
       # The A with the umlaut over it (it will appear as a long dash if
       # you're using a VGA font) is \304, but I cut and pasted it in
       # because Bash will only do one substitution - which in this case is
       # putting $fill in the prompt.
       let fillsize=${fillsize}-1
    done
    #   Right-truncate PWD if the prompt is going to be wider than the terminal:
    if [ "$fillsize" -lt "0" ]
    then
       let cutt=3-${fillsize}
       newPWD="...$(echo -n $PWD | sed -e "s/\(^.\{$cutt\}\)\(.*\)/\2/")"
    fi
    #
    #   Create the clock and the bar that runs up the right side of the term
    #
    local LIGHT_BLUE="\033[1;34m"
    local     YELLOW="\033[1;33m"
    #   Position the cursor to print the clock:
    echo -en "\033[2;$((${COLUMNS}-9))H"
    echo -en "$LIGHT_BLUE($YELLOW$(date +%H%M)$LIGHT_BLUE)\304$YELLOW\304\304\277"
    local i=${LINES}
    echo -en "\033[2;${COLUMNS}H"
    #   Print vertical dashes down the side of the terminal:
    while [ $i -ge 4 ]
    do
       echo -en "\033[$(($i-1));${COLUMNS}H\263"
       let i=$i-1
    done

    let prompt_line=${LINES}-1
    #   This is needed because doing \${LINES} inside a Bash mathematical
    #   expression (ie. $(())) doesn't seem to work.
    }

    PROMPT_COMMAND=prompt_command

    function clock3 {
    local LIGHT_BLUE="\[\033[1;34m\]"
    local     YELLOW="\[\033[1;33m\]"
    local      WHITE="\[\033[1;37m\]"
    local LIGHT_GRAY="\[\033[0;37m\]"
    local  NO_COLOUR="\[\033[0m\]"

    case $TERM in
        xterm*)
            TITLEBAR='\[\033]0;\u@\h:\w\007\]'
            ;;
        *)
            TITLEBAR=""
            ;;
    esac

    PS1="$TITLEBAR\
    \[\033[\${prompt_line};0H\]
    $YELLOW\332$LIGHT_BLUE\304(\
    $YELLOW\${usernam}$LIGHT_BLUE@$YELLOW\${hostnam}\
    ${LIGHT_BLUE})\304${YELLOW}\304\${fill}${LIGHT_BLUE}\304(\
    $YELLOW\${newPWD}\
    $LIGHT_BLUE)\304$YELLOW\304\304\304\331\
    \n\
    $YELLOW\300$LIGHT_BLUE\304(\
    $YELLOW\$(date \"+%a,%d %b %y\")\
    $LIGHT_BLUE:$WHITE\$$LIGHT_BLUE)\304\
    $YELLOW\304\
    $LIGHT_GRAY "

    PS2="$LIGHT_BLUE\304$YELLOW\304$YELLOW\304$NO_COLOUR "

    }

Prev | Home | Next
The Floating Clock Prompt | Up | GNU Free Documentation License