#!/bin/bash # bash_prompt; adapted from # https://github.com/necolas/dotfiles/blob/master/shell/bash_prompt and # http://vitus-wagner.livejournal.com/1176589.html?thread=40146189#t40146189 prompt_git() { local s="" local branchName="" # check if the current directory is in a git repository if [ $(git rev-parse --is-inside-work-tree &>/dev/null; printf "%s" $?) == 0 ]; then # check if the current directory is in .git before running git checks if [ "$(git rev-parse --is-inside-git-dir 2> /dev/null)" == "false" ]; then # ensure index is up to date #git update-index --really-refresh -q &>/dev/null # check for uncommitted changes in the index if ! $(git diff --quiet --ignore-submodules --cached); then s="$s+"; fi # check for unstaged changes if ! $(git diff-files --quiet --ignore-submodules --); then s="$s!"; fi # check for untracked files if [ -n "$(git ls-files --others --exclude-standard)" ]; then s="$s?"; fi # check for stashed files if $(git rev-parse --verify refs/stash &>/dev/null); then s="$s$"; fi fi # get the short symbolic ref # if HEAD isn't a symbolic ref, get the short SHA # otherwise, just give up branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \ git rev-parse --short HEAD 2> /dev/null || \ printf "(unknown)")" [ -n "$s" ] && s=" [$s]" printf "%s" "$1$branchName$s" else return fi } set_prompts() { local black="" local blue="" local bold="" local cyan="" local dim="" local green="" local orange="" local magenta="" local red="" local reset="" local white="" local yellow="" local dim_black="" local dim_blue="" local dim_bold="" local dim_cyan="" local dim_green="" local dim_orange="" local dim_magenta="" local dim_red="" local dim_white="" local dim_yellow="" local charStyle="" local gitStyle="" local hostStyle="" local userStyle="" local wdirStyle="" if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then tput sgr0 # reset colors bold=$(tput bold) dim=$(tput dim) reset=$(tput sgr0) black=$(tput setaf 0) blue=$(tput setaf 4) cyan=$(tput setaf 6) green=$(tput setaf 2) orange=$(tput setaf 3) magenta=$(tput setaf 5) red=$(tput setaf 1) white=$bold$(tput setaf 7) yellow=$(tput setaf 3) dim_black=$dim$black dim_blue=$dim$blue dim_cyan=$dim$cyan dim_green=$dim$green dim_orange=$dim$orange dim_magenta=$dim$magenta dim_red=$dim$red dim_white=$dim$white dim_yellow=$dim$yellow else bold="" dim="" reset="\e[0m" black="\e[0;30m" blue="\e[0;34m" cyan="\e[0;36m" green="\e[0;32m" orange="\e[0;33m" magenta="\e[0;35m" red="\e[0;31m" white="\e[0;37m" yellow="\e[0;33m" dim_black="\e[1;30m" dim_blue="\e[1;34m" dim_cyan="\e[1;36m" dim_green="\e[1;32m" dim_orange="\e[1;33m" dim_magenta="\e[1;35m" dim_red="\e[1;31m" dim_white="\e[1;37m" dim_yellow="\e[1;33m" fi charStyle="$reset$bold$black" gitStyle="\[$white\]on \[$magenta\]" case "$BACKGROUND" in DARK|dark) hostStyle="$reset$cyan" ;; LIGHT|light) hostStyle="$reset$blue" ;; esac wdirStyle="$reset$green" # logged in as root if [[ "$USER" == "root" ]]; then userStyle="$bold$red" else userStyle="$orange" fi # build the prompt # display the user, host and current working directory in the terminal title case "$TERM" in *rxvt*|screen*|*term*|vt100) PS1="\[\033]0;\u@\h:\w\007\]" case "$TERM" in screen*) PS1+"\[\033k\u@\h:\w\033\\\]" # Set screen/tmux caption ;; esac ;; *) PS1="" ;; esac #PS1+="\n" # newline PS1+="\[$userStyle\]\u" # username PS1+="\[$charStyle\]@" PS1+="\[$hostStyle\]\h " # host #PS1+="\[$charStyle\]: " PS1+="\[$wdirStyle\]\W " # working directory PS1+='`erco=$?; [ $erco == 0 ] && echo -n ":)" || echo -n '"\"\[$red\]:(\[$reset\] $\""'?=$erco` ' PS1+="\$(prompt_git \"$gitStyle\")" # git repository details #PS1+="\n" PS1+="\[$charStyle\]\$ \[$reset\]" # $ (and reset color) export PS1 } set_prompts unset set_prompts