uniprompt.sh
projectsuniprompt.sh

icon

In the early 90ies I used ansi.sys under DOS to get a colored prompt. With that it got much easier to spot where the last command was executed. Ten years later I switched to Linux and hardly missed that. The configuration of PS1 was one of the first more advanced configurations I ever did and I reworked my prompt every now and then and made it better every time. This version is a slightly modified version of it, which I was using for the last five years. It has proven to work under different operating systems, is easy to understand and much faster than powerline. I know, that it looks a lot like powerline, but it was not really inspired by that. There are simply not many characters compatible with the linux console and virtual terminals.

Usage #

source uniprompt.sh

Installation #

Put the above command into your ~/.bashrc and install and configure your terminal emulator to use a nerdfont.

The Script #

Well. I will have to rethink how I deploy it, because a repository would definitly be better, but there it is and as I said: It changes so rarely nowadays. Have fun.

#!/usr/bin/bash

# sanity checks first: decide, when NOT to run...
[ -z "$PS1" ] && return

# to begin with: a random background color for each shell makes them easier to
# distinguish. Most virtual terminal emulators support TRUECOLOR today.
COLOR_BG_R=$((RANDOM % 255))
COLOR_BG_G=$((RANDOM % 255))
COLOR_BG_B=$((RANDOM % 255))

COLOR_BACKGROUND="\e[38;2;$COLOR_BG_R;$COLOR_BG_G;$COLOR_BG_B"m
COLOR_FOREGROUND="\e[48;0m"

# Here comes the approximation of the perceived brightness of colors: To allow
# the foreground to stand out it has to be considered. 0.2126R + 0.7152G +
# 0.0722B would be correct for relative luminance, but this approximation is
# close enough to determine either white or black as text color.
if [ $(expr $COLOR_BG_R / 3 + $COLOR_BG_G / 1 + $COLOR_BG_B / 8) -gt 240 ]; then
  COLOR_FOREGROUND="\e[48;2;0;0;0m"
else
  COLOR_FOREGROUND="\e[48;2;255;255;255m"
fi

# set window title according to exit status
function setWindowTitle() {
  local exit_status="$1"
  if [[ $? != $exit_status ]]; then # in case of an error
    echo -ne "]0; ${PWD}"  # window title
    printf "%*s%s" $(($(tput cols)-6)) "" "  $exit_status"
  else
    echo -ne "]0; ${PWD}"  # window title
  fi
}

function getClockSymbol() {
  # intential space  v123456789... you get the point :)
  local CLK_SYMBOLS=" "
  local HOUR=$(date +%I | sed -e 's/^0//')
  test $HOUR -ge 12 && HOUR=$(expr $HOUR - 12) # middach
  test $(date +%M) -gt 30 && HOUR=$(expr $HOUR + 1) # floor
  echo -ne ${CLK_SYMBOLS:HOUR:1}
}

function getUserSymbol() {
  case "$USER" in
    root)  echo "⚙️ " ;;
    *)     echo " " ;;
  esac
}

function getGitBranch() {
  GIT_BRANCH=""
  GIT_SUMMARY=""
  if git rev-parse --git-dir 1>/dev/null 2>/dev/null; then
    GIT_BRANCH=$(git branch 2>/dev/null | grep '^*' | colrm 1 2)
    GIT_SUMMARY=$(git log --oneline -1 --pretty=format:%s)
    GIT_BRANCH_DESCRIPTION=$(git config branch.$GIT_BRANCH.description 2>/dev/null)
  fi
  echo -ne "${GIT_BRANCH:+  │    $GIT_BRANCH}"
  echo -ne "${GIT_BRANCH_DESCRIPTION:+ - $GIT_BRANCH_DESCRIPTION}"
  # echo -ne "${GIT_SUMMARY:+ - $GIT_SUMMARY}"
}

function prompt() {
  setWindowTitle $?
  echo -e "\n" $( # make this write as atomic as possible to avoid flickering
  tput cuf $(($(tput cols)-15))
  echo -ne $COLOR_BACKGROUND
  echo -ne "" # reset background
  echo -ne "" # inverse revert
  echo -ne ""
  echo -ne ""
  echo -ne $COLOR_FOREGROUND
  echo -ne " "
  getClockSymbol
  echo -ne " "
  date +%H:%M:%S
  echo -ne " "
  echo -ne "░"
  echo -ne "
"
  echo -ne "░"
  echo -ne " "
  getUserSymbol
  echo -ne $USER@$HOSTNAME
  echo -ne " "
  echo -ne " "
  getGitBranch
  echo -ne " "
  echo -ne "" # reset background
  echo -ne "" # inverse revert
  echo -ne ""
  echo -ne ""
  echo ""
  echo ""
  ) "\n"
}

export PS1=" \[\033[38;2;210;160;50m\]  \[\033[0m\]\w  "
trap 'echo -ne "]0; ${BASH_COMMAND}"' DEBUG
export PROMPT_COMMAND=prompt

# vim: shiftwidth=2 tabstop=2 softtabstop=2 expandtab
top