Created
August 6, 2019 10:33
-
-
Save jpbochi/83c787fd84a741e63b1cf2ce9d9eeb2a to your computer and use it in GitHub Desktop.
bash PROMPT_COMMAND + PS1 for git status
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# copied from http://mediadoneright.com/content/ultimate-git-ps1-bash-prompt | |
# Customize BASH PS1 prompt to show current GIT repository and branch. | |
# by Mike Stewart - http://MediaDoneRight.com | |
# TODO: scope the following env vars to this file only. They can be seen with `declare -p` | |
# Reset | |
Color_Off="\[\033[0m\]" # Text Reset | |
# Regular Colors | |
Black="\[\033[0;30m\]" # Black | |
Red="\[\033[0;31m\]" # Red | |
Green="\[\033[0;32m\]" # Green | |
Yellow="\[\033[0;33m\]" # Yellow | |
Blue="\[\033[0;34m\]" # Blue | |
Purple="\[\033[0;35m\]" # Purple | |
Cyan="\[\033[0;36m\]" # Cyan | |
White="\[\033[0;37m\]" # White | |
# Bold | |
# BBlack="\[\033[1;30m\]" # Black | |
# BRed="\[\033[1;31m\]" # Red | |
# BGreen="\[\033[1;32m\]" # Green | |
# BYellow="\[\033[1;33m\]" # Yellow | |
# BBlue="\[\033[1;34m\]" # Blue | |
# BPurple="\[\033[1;35m\]" # Purple | |
# BCyan="\[\033[1;36m\]" # Cyan | |
# BWhite="\[\033[1;37m\]" # White | |
# # Underline | |
# UBlack="\[\033[4;30m\]" # Black | |
# URed="\[\033[4;31m\]" # Red | |
# UGreen="\[\033[4;32m\]" # Green | |
# UYellow="\[\033[4;33m\]" # Yellow | |
# UBlue="\[\033[4;34m\]" # Blue | |
# UPurple="\[\033[4;35m\]" # Purple | |
# UCyan="\[\033[4;36m\]" # Cyan | |
# UWhite="\[\033[4;37m\]" # White | |
# # Background | |
# On_Black="\[\033[40m\]" # Black | |
# On_Red="\[\033[41m\]" # Red | |
# On_Green="\[\033[42m\]" # Green | |
# On_Yellow="\[\033[43m\]" # Yellow | |
# On_Blue="\[\033[44m\]" # Blue | |
# On_Purple="\[\033[45m\]" # Purple | |
# On_Cyan="\[\033[46m\]" # Cyan | |
# On_White="\[\033[47m\]" # White | |
# # High Intensty | |
# IBlack="\[\033[0;90m\]" # Black | |
# IRed="\[\033[0;91m\]" # Red | |
# IGreen="\[\033[0;92m\]" # Green | |
# IYellow="\[\033[0;93m\]" # Yellow | |
# IBlue="\[\033[0;94m\]" # Blue | |
# IPurple="\[\033[0;95m\]" # Purple | |
# ICyan="\[\033[0;96m\]" # Cyan | |
# IWhite="\[\033[0;97m\]" # White | |
# # Bold High Intensty | |
# BIBlack="\[\033[1;90m\]" # Black | |
# BIRed="\[\033[1;91m\]" # Red | |
# BIGreen="\[\033[1;92m\]" # Green | |
# BIYellow="\[\033[1;93m\]" # Yellow | |
# BIBlue="\[\033[1;94m\]" # Blue | |
# BIPurple="\[\033[1;95m\]" # Purple | |
# BICyan="\[\033[1;96m\]" # Cyan | |
# BIWhite="\[\033[1;97m\]" # White | |
# # High Intensty backgrounds | |
# On_IBlack="\[\033[0;100m\]" # Black | |
# On_IRed="\[\033[0;101m\]" # Red | |
# On_IGreen="\[\033[0;102m\]" # Green | |
# On_IYellow="\[\033[0;103m\]" # Yellow | |
# On_IBlue="\[\033[0;104m\]" # Blue | |
# On_IPurple="\[\033[10;95m\]" # Purple | |
# On_ICyan="\[\033[0;106m\]" # Cyan | |
# On_IWhite="\[\033[0;107m\]" # White | |
# Various variables you might want for your PS1 prompt instead | |
# Time12h="\T" | |
# Time12a="\@" | |
Time24h="\t" | |
# Time24hShort="\A" | |
PathShort="\w" | |
# PathFull="\W" | |
# NewLine="\n" | |
# Jobs="\j" | |
function __ps1_exit_indicator() { | |
local EXIT="$1" | |
if [[ $EXIT != "0" ]] && [[ $EXIT != "" ]]; then | |
echo " [$EXIT]" | |
fi | |
} | |
function gst_color() { | |
if [ -z "$1" ]; then | |
PS_GST_END='' # no git status | |
elif ! \grep -o '^[^#]' <<< "$1" --quiet; then | |
printf "${Green} (" # git status is clean | |
PS_GST_END=')' | |
# elif ! \grep -e '^[12#] [.][^.]' -e '^?' --quiet <<< "$1"; then | |
# printf "${Yellow} <" # all changes are staged | |
# PS_GST_END='>' | |
else | |
printf "${Red} [" # there are non-staged and/or untracked files, or unmerged changes | |
PS_GST_END=']' | |
fi | |
} | |
function gst_branch() { | |
# `<<<` is a Here String (see http://www.tldp.org/LDP/abs/html/x17837.html) | |
local branch=$(\grep '^# branch.head' <<< "$1" | cut -d' ' -f3 &) | |
printf "$branch" | |
} | |
function gst_staged() { | |
[ "$1" ] && local count=$(\grep -e '^[^#?] .[.]' --count <<< "$1" &) && [ "$count" != '0' ] && printf " +$count" | |
} | |
function gst_not_staged() { | |
[ "$1" ] && local count=$(\grep -e '^[^#?] .[^.]' --count <<< "$1" &) && [ "$count" != '0' ] && printf " ~$count" | |
} | |
function gst_not_tracked() { | |
[ "$1" ] && local count=$(\grep -e '^?' --count <<< "$1" &) && [ "$count" != '0' ] && printf " …$count" | |
} | |
function gst_any() { | |
[ "$1" ] && ( ! \grep -e '^[^#]' --quiet <<< "$1" ) && printf ' ✓' | |
} | |
function gst_to_ps1() { | |
local gst="$1" | |
PS_GST_END='' | |
# https://bashitout.com/2013/05/18/Ampersands-on-the-command-line.html | |
gst_color "$gst" | |
gst_branch "$gst" & \ | |
gst_staged "$gst" & \ | |
gst_not_staged "$gst" & \ | |
gst_not_tracked "$gst" & \ | |
gst_any "$gst" | |
wait && echo "${PS_GST_END}" | |
} | |
function __prompt_command() { | |
PS1=$Cyan$Time24h$Color_Off"\${_cmd_[\#]-$Purple\$(__ps1_exit_indicator \$?)}\${_cmd_[\#]=}"$Color_Off | |
PS1+='/ \h:'$Blue$PathShort | |
local gst=$(git status --porcelain=2 --branch 2> /dev/null) | |
if [ "$gst" != "$PS_GST_CACHE" ]; then | |
PS_GST_CACHE_GITPS1="$(gst_to_ps1 "$gst")" | |
fi | |
PS_GST_CACHE="$gst" | |
PS1+="${PS_GST_CACHE_GITPS1}${Color_Off}" | |
PS1+="\n🜚 " | |
} | |
function __prompt_command_no_cache() { | |
PS_GST_CACHE='' | |
__prompt_command | |
} | |
function __light_prompt_command() { | |
PS1=$Cyan$Time24h$Color_Off"\${_cmd_[\#]-$Purple\$(__ps1_exit_indicator \$?)}\${_cmd_[\#]=}"$Color_Off | |
PS1+='/ \h:'$Blue$PathShort$Color_Off'\n🜚 ' | |
} | |
export PS_GST_CACHE='' | |
export PS_GST_CACHE_GITPS1='' | |
export PROMPT_COMMAND=__prompt_command |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment