# Environment variables: # # PS1_SHOWHOSTNAME # 'auto' (default): Only show hostname over SSH # 'yes': Always show hostname # anything else: Never show hostname __show-hostname () { case "${PS1_SHOWHOSTNAME}" in (''|auto) [ "${SSH_CONNECTION}" ] return $?;; (yes) return 0;; (*) return 1;; esac } __set-title () { local title local git_root=$(git root 2> /dev/null) if [ ${git_root} ] then title=$(basename ${git_root}) else local path=${PWD/~/\~} if __show-hostname then title="${USER}@${HOSTNAME}:${path}" else title="${USER}:${path}" fi fi # Cf. console_codes(4): # # ESC ] 2 ; txt ST Set window title to txt. # # ST is a "string terminator", either "ESC \" or "BEL". echo -ne "\E]2;${title}\a" } # In order to know how much space PS1 takes, Bash needs us to delimit # non-printing characters with \[ and \]. __start-nonprinting () { if [ ${BUILDING_PS1} ] then echo -en '\[' fi } __end-nonprinting () { if [ ${BUILDING_PS1} ] then echo -en '\]' fi } __fontify () { local -A codes codes[red]='31' codes[green]='32' codes[blue]='34' codes[white]='37' codes[bold]='1' codes[dim]='2' codes[clear]='0' local text=$1 shift output=$(__start-nonprinting) output+='\E[' for ((i=1; i<=$#; i++)) do output+=${codes[${!i}]} if ((i<$#)) then output+=';' else output+='m' fi done output+=$(__end-nonprinting) output+="${text}" output+=$(__start-nonprinting) output+='\E[0m' output+=$(__end-nonprinting) echo -en "${output}" } __set-prompt () { local last_status=$1 BUILDING_PS1=t PS1='' if [ ${last_status} -ne 0 ] then PS1+=$(__fontify "${last_status} " bold red) fi PS1+=$(__fontify '\u' green) if __show-hostname then PS1+=$(__fontify '@' dim) PS1+=$(__fontify '\H' bold green) fi PS1+=$(__fontify : dim) PS1+=$(__fontify '\w' bold blue) PS1+=$(__fontify "$(__git_ps1 '(%s)')" red) PS1+=$(__fontify '\$' dim) PS1+=' ' unset BUILDING_PS1 } __current-column () { # Cf. console_codes(4) § ECMA-48 Status Report Commands local position read -sdR -p$'\E[6n' position local pattern='\[[0-9]+;([0-9]+)' if [[ ${position} =~ ${pattern} ]] then echo ${BASH_REMATCH[1]} else echo 0 fi } __draw-rule () { local rule='' local column=$(__current-column) for ((i=column; i<=COLUMNS; i++)) do rule+=— done __fontify ${rule} dim } __refresh-terminal () { local last_status=$? __set-title __set-prompt ${last_status} __draw-rule } . /usr/lib/git-core/git-sh-prompt GIT_PS1_SHOWDIRTYSTATE=t GIT_PS1_SHOWUPSTREAM=auto export PROMPT_COMMAND=__refresh-terminal