Skip to content

Instantly share code, notes, and snippets.

@dac73
Last active December 6, 2020 17:11
Show Gist options
  • Save dac73/d2940234686ace6228256c1f549b2ed8 to your computer and use it in GitHub Desktop.
Save dac73/d2940234686ace6228256c1f549b2ed8 to your computer and use it in GitHub Desktop.
Fancy PS1 (bash) prompt with git, python venv, background jobs and exit code, multiline
# paste this code in ~/.bashrc
# example --> https://i.imgur.com/EJvWE5Y.png
# lets create functions for PS1 segments
GITCOLOR=34
VENVCOLOR=5
function segment_git_branch() {
BRANCH=`git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
if [ ! "${BRANCH}" == "" ]
then
STAT=`parse_git_dirty`
#SHORT_BRANCH=`awk 'length > 14{$0 = substr($0, 1, 14) "..."} {printf "%-14s", $0}' <<< "$BRANCH"`
echo "$(tput setaf ${GITCOLOR})${BRANCH}${STAT}"
else
echo ""
fi
}
# get current status of git repo
function parse_git_dirty() {
status=`git status 2>&1 | tee`
dirty=`echo -n "${status}" 2> /dev/null | grep "modified:" &> /dev/null; echo "$?"`
untracked=`echo -n "${status}" 2> /dev/null | grep "Untracked files" &> /dev/null; echo "$?"`
ahead=`echo -n "${status}" 2> /dev/null | grep "Your branch is ahead of" &> /dev/null; echo "$?"`
newfile=`echo -n "${status}" 2> /dev/null | grep "new file:" &> /dev/null; echo "$?"`
renamed=`echo -n "${status}" 2> /dev/null | grep "renamed:" &> /dev/null; echo "$?"`
deleted=`echo -n "${status}" 2> /dev/null | grep "deleted:" &> /dev/null; echo "$?"`
bits=''
if [ "${renamed}" == "0" ]; then
bits="${bits}"
fi
if [ "${ahead}" == "0" ]; then
bits="${bits}"
fi
if [ "${newfile}" == "0" ]; then
bits="${bits}"
fi
if [ "${untracked}" == "0" ]; then
bits="${bits}"
fi
if [ "${deleted}" == "0" ]; then
bits="${bits}"
fi
if [ "${dirty}" == "0" ]; then
bits="${bits}"
fi
if [ ! "${bits}" == "" ]; then
echo " ${bits}"
fi
}
# get venv
function segment_venv() {
if [[ -n $VIRTUAL_ENV ]]; then
VENV_NAME=`basename $(dirname $VIRTUAL_ENV)`
echo " 🐍$(tput setaf ${VENVCOLOR})${VENV_NAME}"
fi
}
# get exit code and background jobs
RES=""
function segment_invis() {
if [ "$?" != "0" ]; then
RES="💩 "
fi
if [ $(jobs -r | wc -l) -gt 0 ]; then
# WO to trim bad exit code whitespace
RES=${RES:0:1}""
fi
echo "$RES"
}
export PS1="\$(segment_invis)\$(tput setaf 4)\w\$(segment_git_branch)\$(segment_venv)\$(tput sgr0)\n⏩ "
@dac73
Copy link
Author

dac73 commented Sep 13, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment