summaryrefslogtreecommitdiffstats
path: root/bashrc/common/prompt.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bashrc/common/prompt.sh')
-rw-r--r--bashrc/common/prompt.sh100
1 files changed, 100 insertions, 0 deletions
diff --git a/bashrc/common/prompt.sh b/bashrc/common/prompt.sh
new file mode 100644
index 0000000..0d16f1d
--- /dev/null
+++ b/bashrc/common/prompt.sh
@@ -0,0 +1,100 @@
+# command prompt
+
+_load group prompt
+_load node prompt
+
+returncolor() {
+ rc=$?
+
+ if [[ $1 -eq 0 ]]; then
+ [[ $rc -eq 0 ]] && echo 0
+ else
+ [[ $rc -ne 0 ]] && echo $rc
+ fi
+
+ return $rc
+}
+
+# username + nodename
+if [[ $(id -u) -eq 0 ]]; then
+ PS1UH="$(pcolor lred)$\h$(pcolor)"
+else
+ PS1UH="$(pcolor lgreen)\u@\h$(pcolor)"
+fi
+
+# working directory
+PS1D="$(pcolor lblue)\w$(pcolor)"
+
+# return code
+PS1R="$(pcolor red)\$(returncolor 1)$(pcolor lgreen)\$(returncolor 0)$(pcolor)"
+
+# environment flags
+[[ "${TERM}" == "screen" ]] && PS1F="${PS1F}$(pcolor lblue)s$(pcolor)"
+
+# prompt character
+PS1P="$(pcolor lblue)\$ $(pcolor)"
+
+# open/closing brackets
+PS1BO="$(pcolor lgray)[$(pcolor)"
+PS1BC="$(pcolor lgray)]$(pcolor)"
+
+# git/svn magic
+ps_scm_f() {
+ local s=
+
+ if [[ -d ".svn" ]] ; then
+ local r=$(svn info | sed -n -e '/^Revision: \([0-9]*\).*$/s//\1/p' )
+ s="$(color yellow)r$r$(color red)$(svn status | grep -q -v '^?' && echo -n "*" )"
+ else
+ local d=$(git rev-parse --git-dir 2>/dev/null ) b= r= a=
+ if [[ -n "${d}" && ! -f "${d}/../.promptignore" ]] ; then
+ if [[ -d "${d}/../.dotest" ]] ; then
+ if [[ -f "${d}/../.dotest/rebase" ]] ; then
+ r="rebase"
+ elif [[ -f "${d}/../.dotest/applying" ]] ; then
+ r="am"
+ else
+ r="???"
+ fi
+ b=$(git symbolic-ref HEAD 2>/dev/null )
+ elif [[ -f "${d}/.dotest-merge/interactive" ]] ; then
+ r="rebase-i"
+ b=$(<${d}/.dotest-merge/head-name)
+ elif [[ -d "${d}/../.dotest-merge" ]] ; then
+ r="rebase-m"
+ b=$(<${d}/.dotest-merge/head-name)
+ elif [[ -f "${d}/MERGE_HEAD" ]] ; then
+ r="merge"
+ b=$(git symbolic-ref HEAD 2>/dev/null )
+ elif [[ -f "${d}/BISECT_LOG" ]] ; then
+ r="bisect"
+ b=$(git symbolic-ref HEAD 2>/dev/null )"???"
+ else
+ r=""
+ b=$(git symbolic-ref HEAD 2>/dev/null )
+ fi
+
+ if git status | grep -q '^# Changed but not updated:' ; then
+ a="${a}*"
+ fi
+
+ if git status | grep -q '^# Changes to be committed:' ; then
+ a="${a}+"
+ fi
+
+ if git status | grep -q '^# Untracked files:' ; then
+ a="${a}?"
+ fi
+
+ b=${b#refs/heads/}
+ b=${b// }
+ [[ -n "${r}${b}${a}" ]] && s="$(color lgreen)${r:+${r}:}$(color yellow)${b}$(color red)${a}"
+ fi
+ fi
+
+ echo -n "${s:+${s} }"
+}
+
+export PS1="${PS1UH} ${PS1BO}${PS1R}${PS1F}${PS1BC} ${PS1D} \$(ps_scm_f)${PS1P}"
+
+unset PS1UH PS1D PS1R PS1F PS1P PS1BO PS1BC