#!/bin/bash format_modified_detailed() { local txtrst='\e[m' local txtred='\e[0;31m' local txtgrn='\e[0;32m' local txtyel='\e[0;33m' # Modified, staged and untracked # A added (new file) M modified, D deleted, R renamed, T typechange stat="$(git status --porcelain 2>/dev/null)" n_sta="" n_mod="" for i in A M D R T; do c=$(echo "$stat" | grep "^[$i]" | wc -l) [ "$c" != "0" ] && n_sta="$n_sta$i$c" c=$(echo "$stat" | grep "^ [$i]" | wc -l) [ "$c" != "0" ] && n_mod="$n_mod$i$c" done n_unt=$(echo "$stat" | grep "??" | wc -l) out="" [ ! -z "$n_sta" ] && out+="\[$txtgrn\]+$n_sta\[$txtrst\]" [ ! -z "$n_mod" ] && out+="\[$txtred\]*$n_mod\[$txtrst\]" [ ! -z "$n_unt" ] && out+="\[$txtyel\]^$n_unt\[$txtrst\]" echo "$out" } format_modified() { local txtrst='\e[m' local txtred='\e[0;31m' local txtgrn='\e[0;32m' local txtyel='\e[0;33m' # Modified, staged and untracked # A added (new file) M modified, D deleted, R renamed, T typechange stat="$(git status --porcelain 2>/dev/null)" n_sta=$(echo "$stat" | grep "^[AMDRT]" | wc -l) n_mod=$(echo "$stat" | grep "^ [AMDRT]" | wc -l) n_unt=$(echo "$stat" | grep "??" | wc -l) out="" [ "$n_sta" != 0 ] && out+="\[$txtgrn\]+$n_sta\[$txtrst\]" [ "$n_mod" != 0 ] && out+="\[$txtred\]*$n_mod\[$txtrst\]" [ "$n_unt" != 0 ] && out+="\[$txtyel\]^$n_unt\[$txtrst\]" echo "$out" } set_prompt_fancy() { local is_git="$(git rev-parse --is-inside-work-tree 2>/dev/null)" local last_cmd=$? local txtrst='\e[m' local txtbold='\e[1m' local txtblk='\e[30m' local txtred='\e[31m' local txtgrn='\e[32m' local txtyel='\e[33m' local txtblu='\e[34m' local txtpur='\e[35m' local txtcyn='\e[36m' local txtwht='\e[37m' # unicode "✗" local fancyx='\342\234\227' # unicode "✓" local checkmark='\342\234\223' # Line 1: Full date + full time (24h) # Line 2: current path PS1="\[$txtbold\]\[$txtwht\]\n\D{%A %d %B %Y %H:%M:%S}\n\[$txtgrn\]\w\n" # Line 3: Git repo + path in repo if [ "$is_git" ]; then local git_repo=$(basename `git rev-parse --show-toplevel` 2>/dev/null) local git_rel_path=$(git rev-parse --show-prefix 2>/dev/null) PS1+="$txtcyn$git_repo $txtpur$git_rel_path$txtrst\n" fi # User color: red for root, yel for others if [[ $EUID == 0 ]]; then PS1+="\[$txtred\]" else PS1+="\[$txtyel\]" fi # Line 3: user@host PS1+="\u\[$txtwht\]@\h\n" # Line 4: a red "✗" or a grn "✓" and the error number if [[ $last_cmd == 0 ]]; then PS1+="\[$txtgrn\]$checkmark \[$txtwht\](0)" else PS1+="\[$txtred\]$fancyx \[$txtwht\]($last_cmd)" fi # Line 4: grn git branch PS1+="\[$txtgrn\]$(__git_ps1 '(%s')\[$txtwht\]" PS1+="$(format_modified_detailed)\[$txtgrn\])\[$txtrst\] " # Line 4: good old prompt, $ for user, # for root PS1+=" \\$ " } set_prompt() { local is_git="$(git rev-parse --is-inside-work-tree 2>/dev/null)" local txtrst='\e[m' local txtbold='\e[1m' local txtblk='\e[30m' local txtred='\e[31m' local txtgrn='\e[32m' local txtyel='\e[33m' local txtblu='\e[34m' local txtpur='\e[35m' local txtcyn='\e[36m' local txtwht='\e[37m' # User color: red for root, yel for others if [[ $EUID == 0 ]]; then PS1+="\[$txtred\]" else PS1+="\[$txtyel\]" fi # user@host PS1="\u\[$txtwht\]@\h" # Git repo + path in repo if [ "$is_git" ]; then local git_repo=$(basename `git rev-parse --show-toplevel` 2>/dev/null) local git_rel_path=$(git rev-parse --show-prefix 2>/dev/null) PS1+="\[$txtcyn\][$git_repo] \[$txtpur\]$git_rel_path\[$txtrst\]" # Green git branch PS1+="\[$txtgrn\]$(__git_ps1 '(%s')\[$txtwht\]" PS1+="$(format_modified)\[$txtgrn\])\[$txtrst\] " else # Current path PS1+="\[$txtgrn\]\w " fi # Good old prompt, $ for user, # for root PS1+="\[$txtrst\]\\$ " } f() { case $PROMPT_COMMAND in set_prompt ) export PROMPT_COMMAND='set_prompt_fancy' ;; set_prompt_fancy ) export PROMPT_COMMAND='set_prompt' ;; esac } export PROMPT_COMMAND='set_prompt'