From 767870085be5214e7fe3680d29d625c4d7428262 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 9 Jan 2016 17:52:20 +0200 Subject: [PATCH] include my bash prompt customization optional, can be enabled if you set in your ~/.bashrc: PROMPT_COMMAND=__bash_prompt_command --- shrc.sh | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/shrc.sh b/shrc.sh index a15e0e5..05ec24c 100755 --- a/shrc.sh +++ b/shrc.sh @@ -262,3 +262,72 @@ d() { rpm2spec() { sed -re 's,^(.+)-[^-]+-[^-]+$,\1.spec,' } + + +# +# A colorized bash prompt +# - shows curret branch +# - shows if branch is up to date/ahead/behind +# - shows if last command exited with error (red) +# +# To use it, set $PROMPT_COMMAND env var: +# PROMPT_COMMAND=__bash_prompt_command +# +__bash_prompt_command() { + local previous_return_value=$? + + local RED="\[\033[0;31m\]" + local YELLOW="\[\033[0;33m\]" + local GREEN="\[\033[0;32m\]" + local BLUE="\[\033[0;34m\]" + local LIGHT_RED="\[\033[1;31m\]" + local LIGHT_GREEN="\[\033[1;32m\]" + local WHITE="\[\033[1;37m\]" + local LIGHT_GRAY="\[\033[0;37m\]" + local COLOR_NONE="\[\e[0m\]" + + local prompt="${BLUE}[${RED}\w${GREEN}$(__bash_parse_git_branch)${BLUE}]${COLOR_NONE} " + if [ $previous_return_value -eq 0 ]; then + PS1="${prompt}➔ " + else + PS1="${prompt}${RED}➔${COLOR_NONE} " + fi +} + +# helper for __bash_prompt_command +# command line (git) coloring +# note we use "\" here to avoid any "git" previous alias/func +__bash_parse_git_branch() { + # not in git dir. return early + \git rev-parse --git-dir &> /dev/null || return + + local git_status branch_pattern remote_pattern diverge_pattern + local state remote branch + + git_status=$(\git -c color.ui=no status 2> /dev/null) + branch_pattern="^On branch ([^${IFS}]*)" + remote_pattern="Your branch is (behind|ahead) " + diverge_pattern="Your branch and (.*) have diverged" + + if [[ ! ${git_status} =~ "working directory clean" ]]; then + state="${RED}⚡" + fi + + # add an else if or two here if you want to get more specific + if [[ ${git_status} =~ ${remote_pattern} ]]; then + if [[ ${BASH_REMATCH[1]} == "ahead" ]]; then + remote="${YELLOW}↑" + else + remote="${YELLOW}↓" + fi + fi + + if [[ ${git_status} =~ ${diverge_pattern} ]]; then + remote="${YELLOW}↕" + fi + + if [[ ${git_status} =~ ${branch_pattern} ]]; then + branch=${BASH_REMATCH[1]} + echo " (${branch})${remote}${state}" + fi +} -- 2.44.0