Created
September 1, 2020 17:24
-
-
Save muendelezaji/6fabd4dca2c6df254540fc9a568e45aa to your computer and use it in GitHub Desktop.
Customize Bash PS1 prompt to show current status of active Git branch
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
# Customize Bash PS1 prompt to show current status of active Git branch. | |
# Adapted from and inspired by http://mediadoneright.com/content/ultimate-git-ps1-bash-prompt | |
# Slightly faster prompt, as measured on my machine (TM) | |
# | |
# By @muendelezaji, Oct 2015 | |
# Skip if in zsh | |
[ "$ZSH" ] && return 0 | |
# SETUP CONSTANTS | |
# Bunch-o-predefined colors. Makes reading code easier than escape sequences. | |
# I don't remember where I found this. o_O | |
# 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 | |
# See: more: http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html | |
Time12hms="\T" | |
Time12ap="\@" | |
PathShort="\W" | |
PathFull="\w" | |
NewLine="\n" | |
Jobs="\j" | |
Time24hm="\A" | |
Time24hms="\t" | |
HostShort="\h" | |
HostFull="\H" | |
# Shorten path to first character of folder e.g. ref logs for git repo: ~/r/.g/l/refs | |
# See: http://unix.stackexchange.com/a/275016 | |
PathShorter='$(sed -- "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})' | |
# Extra config options to indicate branch status, see: | |
# https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh | |
# Note: Might slow down the prompt! | |
# Show unstaged (*) and staged (+) changes | |
GIT_PS1_SHOWDIRTYSTATE=1 | |
# Show if something is stashed '$' | |
GIT_PS1_SHOWSTASHSTATE=1 | |
# Show if there are untracked files '%' | |
GIT_PS1_SHOWUNTRACKEDFILES=1 | |
# Set to "auto" to show difference between HEAD and its upstream. | |
# A "<" indicates you are behind, ">" indicates you are ahead, | |
# "<>" indicates you have diverged and "=" indicates that there is no difference. | |
# You can also append "verbose" to show number of commits ahead/behind (+/-). | |
# GIT_PS1_SHOWUPSTREAM="auto" | |
# * = modified | |
# + = staged | |
# $ = stashed | |
# % = untracked | |
export PS1='$(if git symbolic-ref HEAD &>/dev/null; then\ | |
ps1=$(__git_ps1 "(%s)");\ | |
[[ $ps1 =~ [%*+] ]] && Color_On="'$IRed'" || Color_On="'$Green'";\ | |
fi;\ | |
echo "$Color_On$ps1'$Color_Off$Cyan[$PathShorter]\$$Color_Off'") ' | |
# Alternative algo - use grep instead of bash's =~ (arguably more portable?) | |
# export PS1='$(if git symbolic-ref HEAD &>/dev/null; then\ | |
# echo $(__git_ps1 "(%s)") | grep -E [%*+] &>/dev/null;\ | |
# [ $? == 0 ] && Color_On="'$IRed'" || Color_On="'$Green'";\ | |
# fi;\ | |
# echo "$Color_On$ps1'$Color_Off$Cyan[$PathShort]\$$Color_Off'") ' | |
# Can also replace 'symbolic-ref HEAD' with 'rev-parse --is-inside-work-tree' (likely slower) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment