Skip to content

Instantly share code, notes, and snippets.

@dubglan
Forked from wolever/profile
Last active April 18, 2017 19:06
Show Gist options
  • Save dubglan/82ba038f05869df8c4f2 to your computer and use it in GitHub Desktop.
Save dubglan/82ba038f05869df8c4f2 to your computer and use it in GitHub Desktop.
Fixed colored prompt that works under tmux.
# prompt examples:
# [3 jobs master virtualenv] ~/code/myproject/foo
# [1 job my-branch virtualenv] ~/code/bar/
# [virtualenv] ~/code/
# ~
# Very, very fast, only requiring a couple of fork()s (and no forking at all to determine the current git branch)
if [[ "$USER" == "root" ]]
then
export PS1="\[\e[1;31m\]\u \[\e[1;33m\]\w\[\e[0m\] ";
else
export PS1="\[\e[1;33m\]\w\[\e[0m\] ";
fi
# 100% pure Bash (no forking) function to determine the name of the current git branch
gitbranch() {
export GITBRANCH=""
local repo="${_GITBRANCH_LAST_REPO-}"
local gitdir=""
[[ ! -z "$repo" ]] && gitdir="$repo/.git"
# If we don't have a last seen git repo, or we are in a different directory
if [[ -z "$repo" || "$PWD/" != "$repo/"* || ! -e "$gitdir" ]]; then
local cur="$PWD"
gitdir=""
repo=""
while [[ ! -z "$cur" ]]; do
if [[ -e "$cur/.git" ]]; then
repo="$cur"
gitdir="$cur/.git"
break
fi
cur="${cur%/*}"
done
fi
if [[ -z "$gitdir" ]]; then
unset _GITBRANCH_LAST_REPO
return 0
fi
export _GITBRANCH_LAST_REPO="${repo}"
local head=""
local branch=""
read head < "$gitdir/HEAD"
case "$head" in
ref:*)
branch="${head##*/}"
;;
"")
branch=""
;;
*)
branch="d:${head:0:7}"
;;
esac
if [[ -z "$branch" ]]; then
return 0
fi
export GITBRANCH="$branch"
}
PS1_green='\[\e[32m\]'
PS1_blue='\[\e[34m\]'
PS1_reset='\[\e[0m\]'
_mk_prompt() {
# Change the window title of X terminals
case $TERM in
xterm*|rxvt*|Eterm)
local tilde="~"
if [ $USER == "root" ];
then
echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/$tilde}\007"
else
echo -ne "\033]0;${HOSTNAME%%.*}:${PWD/$HOME/$tilde}\007"
fi
;;
screen)
echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/$HOME/$tilde}\033\\"
;;
esac
# Un-screw virtualenv stuff
if [[ ! -z "${_OLD_VIRTUAL_PS1-}" ]]; then
export PS1="$_OLD_VIRTUAL_PS1"
unset _OLD_VIRTUAL_PS1
fi
if [[ -z "${_MK_PROMPT_ORIG_PS1-}" ]]; then
export _MK_PROMPT_ORIG_PS1="$PS1"
fi
local prefix=()
local jobcount="$(jobs -p | wc -l)"
if [[ "$jobcount" -gt 0 ]]; then
local job="${jobcount##* } job"
[[ "$jobcount" -gt 1 ]] && job="${job}s"
prefix+=("$job")
fi
gitbranch
if [[ ! -z "$GITBRANCH" ]]; then
prefix+=("${PS1_green}$GITBRANCH${PS1_reset}")
fi
local virtualenv="${VIRTUAL_ENV##*/}"
if [[ ! -z "$virtualenv" ]]; then
prefix+=("${PS1_blue}$virtualenv${PS1_reset}")
fi
PS1="$_MK_PROMPT_ORIG_PS1"
if [[ ! -z "$prefix" ]]; then
PS1="[${prefix[@]}] $PS1"
fi
export PS1
}
export PROMPT_COMMAND=_mk_prompt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment