Created
May 3, 2015 00:56
-
-
Save boovius/555e7907d60139dd470d to your computer and use it in GitHub Desktop.
base bash prompt
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
#!/usr/bin/env bash | |
THEME_PROMPT_HOST='\H' | |
SCM_CHECK=${SCM_CHECK:=true} | |
SCM_THEME_PROMPT_DIRTY=' ✗' | |
SCM_THEME_PROMPT_CLEAN=' ✓' | |
SCM_THEME_PROMPT_PREFIX=' |' | |
SCM_THEME_PROMPT_SUFFIX='|' | |
SCM_THEME_BRANCH_PREFIX='' | |
SCM_THEME_TAG_PREFIX='tag:' | |
SCM_THEME_COMMIT_PREFIX='commit:' | |
SCM_THEME_REMOTE_PREFIX='' | |
SCM_GIT_SHOW_DETAILS=${SCM_GIT_SHOW_DETAILS:=true} | |
SCM_GIT='git' | |
SCM_GIT_CHAR='±' | |
SCM_GIT_AHEAD_CHAR="↑" | |
SCM_GIT_BEHIND_CHAR="↓" | |
SCM_GIT_UNTRACKED_CHAR="?:" | |
SCM_GIT_UNSTAGED_CHAR="U:" | |
SCM_GIT_STAGED_CHAR="S:" | |
SCM_HG='hg' | |
SCM_HG_CHAR='☿' | |
SCM_SVN='svn' | |
SCM_SVN_CHAR='⑆' | |
SCM_NONE='NONE' | |
SCM_NONE_CHAR='○' | |
RVM_THEME_PROMPT_PREFIX=' |' | |
RVM_THEME_PROMPT_SUFFIX='|' | |
VIRTUALENV_THEME_PROMPT_PREFIX=' |' | |
VIRTUALENV_THEME_PROMPT_SUFFIX='|' | |
RBENV_THEME_PROMPT_PREFIX=' |' | |
RBENV_THEME_PROMPT_SUFFIX='|' | |
function scm { | |
if [[ "$SCM_CHECK" = false ]]; then SCM=$SCM_NONE | |
elif [[ -f .git/HEAD ]]; then SCM=$SCM_GIT | |
elif which git &> /dev/null && [[ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]]; then SCM=$SCM_GIT | |
elif [[ -d .hg ]]; then SCM=$SCM_HG | |
elif which hg &> /dev/null && [[ -n "$(hg root 2> /dev/null)" ]]; then SCM=$SCM_HG | |
elif [[ -d .svn ]]; then SCM=$SCM_SVN | |
else SCM=$SCM_NONE | |
fi | |
} | |
function scm_prompt_char { | |
if [[ -z $SCM ]]; then scm; fi | |
if [[ $SCM == $SCM_GIT ]]; then SCM_CHAR=$SCM_GIT_CHAR | |
elif [[ $SCM == $SCM_HG ]]; then SCM_CHAR=$SCM_HG_CHAR | |
elif [[ $SCM == $SCM_SVN ]]; then SCM_CHAR=$SCM_SVN_CHAR | |
else SCM_CHAR=$SCM_NONE_CHAR | |
fi | |
} | |
function scm_prompt_vars { | |
scm | |
scm_prompt_char | |
SCM_DIRTY=0 | |
SCM_STATE='' | |
[[ $SCM == $SCM_GIT ]] && git_prompt_vars && return | |
[[ $SCM == $SCM_HG ]] && hg_prompt_vars && return | |
[[ $SCM == $SCM_SVN ]] && svn_prompt_vars && return | |
} | |
function scm_prompt_info { | |
scm | |
scm_prompt_char | |
SCM_DIRTY=0 | |
SCM_STATE='' | |
[[ $SCM == $SCM_GIT ]] && git_prompt_info && return | |
[[ $SCM == $SCM_HG ]] && hg_prompt_info && return | |
[[ $SCM == $SCM_SVN ]] && svn_prompt_info && return | |
} | |
function git_prompt_vars { | |
local details='' | |
SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} | |
if [[ "$(git config --get bash-it.hide-status)" != "1" ]]; then | |
local status="$(git status -b --porcelain 2> /dev/null || git status --porcelain 2> /dev/null)" | |
if [[ -n "${status}" ]] && [[ "${status}" != "\n" ]] && [[ -n "$(grep -v ^# <<< "${status}")" ]]; then | |
SCM_DIRTY=1 | |
if [[ "${SCM_GIT_SHOW_DETAILS}" = "true" ]]; then | |
local untracked_count="$(egrep -c '^\?\? .+' <<< "${status}")" | |
local unstaged_count="$(egrep -c '^.[^ ?#] .+' <<< "${status}")" | |
local staged_count="$(egrep -c '^[^ ?#]. .+' <<< "${status}")" | |
[[ "${staged_count}" -gt 0 ]] && details+=" ${SCM_GIT_STAGED_CHAR}${staged_count}" && SCM_DIRTY=3 | |
[[ "${unstaged_count}" -gt 0 ]] && details+=" ${SCM_GIT_UNSTAGED_CHAR}${unstaged_count}" && SCM_DIRTY=2 | |
[[ "${untracked_count}" -gt 0 ]] && details+=" ${SCM_GIT_UNTRACKED_CHAR}${untracked_count}" && SCM_DIRTY=1 | |
fi | |
SCM_STATE=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} | |
fi | |
fi | |
local ref=$(git symbolic-ref -q HEAD 2> /dev/null) | |
if [[ -n "$ref" ]]; then | |
SCM_BRANCH=${SCM_THEME_BRANCH_PREFIX}${ref#refs/heads/} | |
else | |
ref=$(git describe --tags --exact-match 2> /dev/null) | |
if [[ -n "$ref" ]]; then | |
SCM_BRANCH=${SCM_THEME_TAG_PREFIX}${ref} | |
else | |
local commit_re='(^remotes/)?(.+-g[a-zA-Z0-9]+)$' | |
local remote_re='^remotes/(.+)$' | |
ref=$(git describe --tags --all --always 2> /dev/null) | |
if [[ "$ref" =~ ${commit_re} ]]; then | |
SCM_BRANCH=${SCM_THEME_COMMIT_PREFIX}${BASH_REMATCH[2]} | |
elif [[ "$ref" =~ ${remote_re} ]]; then | |
SCM_BRANCH=${SCM_THEME_REMOTE_PREFIX}${BASH_REMATCH[1]} | |
fi | |
fi | |
fi | |
local ahead_re='.+ahead ([0-9]+).+' | |
local behind_re='.+behind ([0-9]+).+' | |
[[ "${status}" =~ ${ahead_re} ]] && SCM_BRANCH+=" ${SCM_GIT_AHEAD_CHAR}${BASH_REMATCH[1]}" | |
[[ "${status}" =~ ${behind_re} ]] && SCM_BRANCH+=" ${SCM_GIT_BEHIND_CHAR}${BASH_REMATCH[1]}" | |
local stash_count="$(git stash list 2> /dev/null | wc -l | tr -d ' ')" | |
[[ "${stash_count}" -gt 0 ]] && SCM_BRANCH+=" {${stash_count}}" | |
SCM_BRANCH+=${details} | |
SCM_PREFIX=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} | |
SCM_SUFFIX=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} | |
SCM_CHANGE=$(git rev-parse HEAD 2>/dev/null) | |
} | |
# this functions returns absolute location of .hg directory if one exists | |
# It starts in the current directory and moves its way up until it hits /. | |
# If we get to / then no Mercurial repository was found. | |
# Example: | |
# - lets say we cd into ~/Projects/Foo/Bar | |
# - .hg is located in ~/Projects/Foo/.hg | |
# - get_hg_root starts at ~/Projects/Foo/Bar and sees that there is no .hg directory, so then it goes into ~/Projects/Foo | |
function get_hg_root { | |
local CURRENT_DIR=$(pwd) | |
while [ "$CURRENT_DIR" != "/" ]; do | |
if [ -d "$CURRENT_DIR/.hg" ]; then | |
echo "$CURRENT_DIR/.hg" | |
return | |
fi | |
CURRENT_DIR=$(dirname $CURRENT_DIR) | |
done | |
} | |
function hg_prompt_vars { | |
if [[ -n $(hg status 2> /dev/null) ]]; then | |
SCM_DIRTY=1 | |
SCM_STATE=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY} | |
else | |
SCM_DIRTY=0 | |
SCM_STATE=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN} | |
fi | |
SCM_PREFIX=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX} | |
SCM_SUFFIX=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX} | |
HG_ROOT=$(get_hg_root) | |
if [ -f $HG_ROOT/branch ]; then | |
# Mercurial holds it's current branch in .hg/branch file | |
SCM_BRANCH=$(cat $HG_ROOT/branch) | |
else | |
SCM_BRANCH=$(hg summary 2> /dev/null | grep branch: | awk '{print $2}') | |
fi | |
if [ -f $HG_ROOT/dirstate ]; then | |
# Mercurial holds various information about the working directory in .hg/dirstate file. More on http://mercurial.selenic.com/wiki/DirState | |
SCM_CHANGE=$(hexdump -n 10 -e '1/1 "%02x"' $HG_ROOT/dirstate | cut -c-12) | |
else | |
SCM_CHANGE=$(hg summary 2> /dev/null | grep parent: | awk '{print $2}') | |
fi | |
} | |
function rvm_version_prompt { | |
if which rvm &> /dev/null; then | |
rvm=$(rvm tools identifier) || return | |
if [ $rvm != "system" ]; then | |
echo -e "$RVM_THEME_PROMPT_PREFIX$rvm$RVM_THEME_PROMPT_SUFFIX" | |
fi | |
fi | |
} | |
function rbenv_version_prompt { | |
if which rbenv &> /dev/null; then | |
rbenv=$(rbenv version-name) || return | |
$(rbenv commands | grep -q gemset) && gemset=$(rbenv gemset active 2> /dev/null) && rbenv="$rbenv@${gemset%% *}" | |
if [ $rbenv != "system" ]; then | |
echo -e "$RBENV_THEME_PROMPT_PREFIX$rbenv$RBENV_THEME_PROMPT_SUFFIX" | |
fi | |
fi | |
} | |
function ruby_version_prompt { | |
echo -e "$(rbenv_version_prompt)$(rvm_version_prompt)" | |
} | |
function virtualenv_prompt { | |
if [[ -n "$VIRTUAL_ENV" ]]; then | |
virtualenv=`basename "$VIRTUAL_ENV"` | |
echo -e "$VIRTUALENV_THEME_PROMPT_PREFIX$virtualenv$VIRTUALENV_THEME_PROMPT_SUFFIX" | |
fi | |
} | |
# backwards-compatibility | |
function git_prompt_info { | |
git_prompt_vars | |
echo -e "$SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_SUFFIX" | |
} | |
function svn_prompt_info { | |
svn_prompt_vars | |
echo -e "$SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_SUFFIX" | |
} | |
function hg_prompt_info() { | |
hg_prompt_vars | |
echo -e "$SCM_PREFIX$SCM_BRANCH:${SCM_CHANGE#*:}$SCM_STATE$SCM_SUFFIX" | |
} | |
function scm_char { | |
scm_prompt_char | |
echo -e "$SCM_CHAR" | |
} | |
function prompt_char { | |
scm_char | |
} | |
if [ ! -e $BASH_IT/plugins/enabled/battery.plugin.bash ]; then | |
# if user has installed battery plugin, skip this... | |
function battery_charge (){ | |
# no op | |
echo -n | |
} | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment