219 lines
6.3 KiB
Bash
219 lines
6.3 KiB
Bash
#!/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_GIT='git'
|
|
SCM_GIT_CHAR='±'
|
|
|
|
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='|'
|
|
|
|
RBFU_THEME_PROMPT_PREFIX=' |'
|
|
RBFU_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 {
|
|
SCM_GIT_AHEAD=''
|
|
SCM_GIT_BEHIND=''
|
|
SCM_GIT_STASH=''
|
|
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
|
|
SCM_STATE=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
|
|
else
|
|
SCM_DIRTY=0
|
|
SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
|
|
fi
|
|
else
|
|
SCM_DIRTY=0
|
|
SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
|
|
fi
|
|
SCM_PREFIX=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
|
|
SCM_SUFFIX=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
|
|
|
|
local ref=$(git symbolic-ref -q HEAD 2> /dev/null)
|
|
if [[ -n "$ref" ]]; then
|
|
SCM_BRANCH=${ref#refs/heads/}
|
|
SCM_IS_BRANCH=1
|
|
SCM_IS_TAG=0
|
|
else
|
|
SCM_BRANCH=$(git describe --tags --exact-match 2> /dev/null)
|
|
SCM_IS_TAG=1
|
|
SCM_IS_BRANCH=0
|
|
fi
|
|
SCM_CHANGE=$(git rev-parse HEAD 2>/dev/null)
|
|
local ahead_re='.+ahead ([0-9]+).+'
|
|
local behind_re='.+behind ([0-9]+).+'
|
|
[[ "${status}" =~ ${ahead_re} ]] && SCM_GIT_AHEAD=" ${SCM_GIT_AHEAD_CHAR}${BASH_REMATCH[1]}"
|
|
[[ "${status}" =~ ${behind_re} ]] && SCM_GIT_BEHIND=" ${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_GIT_STASH=" {${stash_count}}"
|
|
}
|
|
|
|
function svn_prompt_vars {
|
|
if [[ -n $(svn status 2> /dev/null) ]]; then
|
|
SCM_DIRTY=1
|
|
SCM_STATE=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
|
|
else
|
|
SCM_DIRTY=0
|
|
SCM_STATE=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
|
|
fi
|
|
SCM_PREFIX=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
|
|
SCM_SUFFIX=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
|
|
SCM_BRANCH=$(svn info 2> /dev/null | awk -F/ '/^URL:/ { for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return
|
|
SCM_CHANGE=$(svn info 2> /dev/null | sed -ne 's#^Revision: ##p' )
|
|
}
|
|
|
|
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}
|
|
SCM_BRANCH=$(hg summary 2> /dev/null | grep branch: | awk '{print $2}')
|
|
SCM_CHANGE=$(hg summary 2> /dev/null | grep parent: | awk '{print $2}')
|
|
}
|
|
|
|
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 rbfu_version_prompt {
|
|
if [[ $RBFU_RUBY_VERSION ]]; then
|
|
echo -e "${RBFU_THEME_PROMPT_PREFIX}${RBFU_RUBY_VERSION}${RBFU_THEME_PROMPT_SUFFIX}"
|
|
fi
|
|
}
|
|
|
|
function chruby_version_prompt {
|
|
if declare -f -F chruby &> /dev/null; then
|
|
if declare -f -F chruby_auto &> /dev/null; then
|
|
chruby_auto
|
|
fi
|
|
|
|
ruby_version=$(ruby --version | awk '{print $1, $2;}') || return
|
|
|
|
if [[ ! $(chruby | grep '*') ]]; then
|
|
ruby_version="${ruby_version} (system)"
|
|
fi
|
|
echo -e "${CHRUBY_THEME_PROMPT_PREFIX}${ruby_version}${CHRUBY_THEME_PROMPT_SUFFIX}"
|
|
fi
|
|
}
|
|
|
|
function ruby_version_prompt {
|
|
echo -e "$(rbfu_version_prompt)$(rbenv_version_prompt)$(rvm_version_prompt)$(chruby_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
|
|
}
|