148 lines
4.3 KiB
Bash
148 lines
4.3 KiB
Bash
#!/bin/bash
|
|
|
|
########################################################################
|
|
# .bash_prompt
|
|
#
|
|
# Matthew's Git Bash Prompt https://github.com/matthewmccullough/dotfiles
|
|
# +
|
|
# python virtualenv
|
|
# +
|
|
# xterm dynamic title http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#s2
|
|
# +
|
|
# path minimizer https://superuser.com/a/271223
|
|
#
|
|
# define PROMPT_COMMAND to prompt_func
|
|
########################################################################
|
|
RED="\[\033[0;31m\]"
|
|
YELLOW="\[\033[0;33m\]"
|
|
GREEN="\[\033[0;32m\]"
|
|
YELLOW="\[\033[0;33m\]"
|
|
BLUE="\[\033[0;34m\]"
|
|
MAGENTA="\[\033[0;35m\]"
|
|
CYAN="\[\033[0;36m\]"
|
|
LIGHT_RED="\[\033[1;31m\]"
|
|
LIGHT_GREEN="\[\033[1;32m\]"
|
|
LIGHT_YELLOW="\[\033[1;33m\]"
|
|
WHITE="\[\033[1;37m\]"
|
|
LIGHT_GRAY="\[\033[0;37m\]"
|
|
COLOR_NONE="\[\e[0m\]"
|
|
|
|
function _my_parse_git_branch {
|
|
git rev-parse --git-dir &> /dev/null
|
|
local git_status="$(LANG=C git status 2> /dev/null)"
|
|
local branch_pattern="^On branch ([^${IFS}]*)"
|
|
local remote_pattern="Your branch is (.*) '"
|
|
local diverge_pattern="Your branch and (.*) have diverged"
|
|
local state=""
|
|
local remote=""
|
|
local branch=""
|
|
|
|
[[ ${git_status} =~ "Not a git repository" ]] && return
|
|
|
|
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 of" ]]; 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]}
|
|
#branch=$(__git_ps1)
|
|
echo "${BLUE}[${GREEN}(${branch})${remote}${state}${BLUE}]${COLOR_NONE}"
|
|
fi
|
|
# echo "DEBUG[branch:$branch|remote:$remote|state:$state]"
|
|
}
|
|
|
|
function short_path {
|
|
# print first two letters of the path + last dir
|
|
local home=/ho/patrick
|
|
echo $(dirname "$1" | \
|
|
sed -e "s;$HOME;~;" | \
|
|
sed -e "s;\(/[^/]\{1,2\}\)[^/]*;\1;g")/$(basename "$1") | \
|
|
sed -e "s;$home;~;"
|
|
}
|
|
|
|
function nix_func() {
|
|
test -n "$IN_NIX_SHELL" && echo "$IN_NIX_SHELL"
|
|
}
|
|
|
|
function prompt_func() {
|
|
previous_return_value=$?;
|
|
|
|
## BASH : enable shared history
|
|
## DONT DO THAT : DANGEROUS
|
|
#history -a; history -c; history -r
|
|
|
|
# the prompt craft
|
|
local prompt=''
|
|
|
|
#The lowercase w is the full current working directory
|
|
# prompt="${TITLEBAR}${BLUE}[${RED}\w${GREEN}$(_my_parse_git_branch)${BLUE}]${COLOR_NONE}"
|
|
|
|
# newgrp terraform
|
|
local psnewgrp=''
|
|
test "`id -ng`" != "`id -nu`" && psnewgrp="${LIGHT_GREEN}(`id -ng`)"
|
|
|
|
# [user$host]
|
|
prompt="${prompt}${COLOR_NONE}[${YELLOW}\u${COLOR_NONE}@${WHITE}\h${COLOR_NONE}]"
|
|
|
|
# python virtualenv
|
|
test -n "$VIRTUAL_ENV" && prompt="${prompt} (env:${BLUE}$(basename $VIRTUAL_ENV)${COLOR_NONE})"
|
|
|
|
# git status
|
|
test -n "$(_my_parse_git_branch)" && prompt="${prompt}[git:${GREEN}$(_my_parse_git_branch)${COLOR_NONE}]"
|
|
|
|
# nix-shell
|
|
test -n "$(nix_func)" && prompt="${prompt}[nix:${GREEN}$(nix_func)${COLOR_NONE}]"
|
|
|
|
# add -- \w (git branch) if new minute or cd
|
|
# [[ "x$previous_path" != "x$(pwd)" ]] || [[ "$previous_minute" != "$(date +%M)" ]] && prompt="$prompt $(_my_parse_git_branch) -- $(date +%a\ %d\ %B)"
|
|
|
|
# date
|
|
# prompt="$prompt -- $(date +%a\ %d\ %B)"
|
|
|
|
# hour
|
|
prompt="$prompt ${LIGHT_YELLOW}$(date +%R)${COLOR_NONE}"
|
|
# add, at least the time
|
|
# prompt="${prompt} $(date +%X)"
|
|
|
|
# PWD
|
|
# prompt="${prompt} \w"
|
|
prompt="${prompt} $(short_path "$PWD")"
|
|
|
|
# if test $previous_return_value -eq 0
|
|
# then
|
|
# PS1="${prompt} ${GREEN}\$${COLOR_NONE} "
|
|
# else
|
|
# PS1="${prompt} ${RED}(err=${previous_return_value}) \$${COLOR_NONE} "
|
|
# fi
|
|
|
|
# test right align FIXME
|
|
# PS1=$(printf "%${COLUMNS}s \r%s" "${prompt}" "${GREEN}\$${COLOR_NONE} ")
|
|
|
|
# red/green if exit 1/0
|
|
if test $previous_return_value -eq 0
|
|
then
|
|
PS1="${prompt} ${GREEN}\$${COLOR_NONE} "
|
|
else
|
|
PS1="${prompt} ${RED}(err=${previous_return_value}) \$${COLOR_NONE} "
|
|
fi
|
|
|
|
previous_minute="$(date +%M)"
|
|
previous_path=$(pwd)
|
|
|
|
# set xterm -like title
|
|
echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"
|
|
}
|
|
|
|
PROMPT_COMMAND=prompt_func
|
|
# end .bash_prompt
|