Last active
December 6, 2020 17:11
-
-
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
This file contains 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
# 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⏩ " |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
example --> https://i.imgur.com/EJvWE5Y.png