dotfiles/includes/bash_prompt.bash

113 lines
3.3 KiB
Bash
Raw Normal View History

2012-10-12 08:53:13 +00:00
# Inspired by: https://github.com/dreadatour/dotfiles/blob/master/.bash_profile
# Setup color variables
color_is_on=
color_red=
color_green=
color_yellow=
color_blue=
color_white=
color_gray=
color_bg_red=
color_off=
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
color_is_on=true
color_red="\[$(/usr/bin/tput setaf 1)\]"
color_green="\[$(/usr/bin/tput setaf 2)\]"
color_yellow="\[$(/usr/bin/tput setaf 3)\]"
color_blue="\[$(/usr/bin/tput setaf 6)\]"
color_white="\[$(/usr/bin/tput setaf 7)\]"
color_gray="\[$(/usr/bin/tput setaf 8)\]"
color_off="\[$(/usr/bin/tput sgr0)\]"
color_error="$(/usr/bin/tput setab 1)$(/usr/bin/tput setaf 7)"
color_error_off="$(/usr/bin/tput sgr0)"
# Set user color
2012-10-12 08:53:13 +00:00
case `id -u` in
0) color_user=$color_red ;;
*) color_user=$color_green ;;
esac
fi
# Some kind of optimization - check if git installed only on config load
PS1_GIT_BIN=$(which git 2>/dev/null)
function prompt_command {
local PS1_GIT=
local GIT_BRANCH=
local GIT_DIRTY=
2012-10-22 09:10:13 +00:00
local PWDNAME="$PWD"
2012-10-12 08:53:13 +00:00
# Beautify working directory name
2012-10-22 09:10:13 +00:00
if [ "$HOME" == "$PWD" ]; then
2012-10-12 08:53:13 +00:00
PWDNAME="~"
2012-10-22 09:10:13 +00:00
elif [ "$HOME" == "${PWD:0:${#HOME}}" ]; then
2012-10-12 08:53:13 +00:00
PWDNAME="~${PWD:${#HOME}}"
fi
# Parse git status and get git variables
2012-10-22 09:10:13 +00:00
if [[ ! -z "$PS1_GIT_BIN" ]]; then
# Check if we are in git repo
2012-10-22 09:10:13 +00:00
local CUR_DIR="$PWD"
while [[ ! -d "${CUR_DIR}/.git" ]] && [[ ! "${CUR_DIR}" == "/" ]] && [[ ! "${CUR_DIR}" == "~" ]] && [[ ! "${CUR_DIR}" == "" ]]; do CUR_DIR="${CUR_DIR%/*}"; done
2012-10-12 08:53:13 +00:00
if [[ -d "${CUR_DIR}/.git" ]]; then
# Get git branch
GIT_BRANCH="$($PS1_GIT_BIN symbolic-ref HEAD 2>/dev/null)"
if [[ ! -z "$GIT_BRANCH" ]]; then
GIT_BRANCH="${GIT_BRANCH#refs/heads/}"
# Get git status
local GIT_STATUS="$($PS1_GIT_BIN status --porcelain 2>/dev/null)"
[[ -n "$GIT_STATUS" ]] && GIT_DIRTY=1
2012-10-12 08:53:13 +00:00
fi
fi
fi
# Build B&W prompt for git
2012-10-22 09:10:13 +00:00
[[ ! -z "$GIT_BRANCH" ]] && PS1_GIT=" #${GIT_BRANCH}"
2012-10-12 08:53:13 +00:00
# Calculate prompt length
local PS1_length=$((${#USER}+${#HOSTNAME}+${#PWDNAME}+${#PS1_GIT}+3))
local FILL=
# If length is greater, than terminal width
2012-10-12 08:53:13 +00:00
if [[ $PS1_length -gt $COLUMNS ]]; then
# Strip working directory name
2012-10-12 08:53:13 +00:00
PWDNAME="...${PWDNAME:$(($PS1_length-$COLUMNS+3))}"
else
# Else calculate fillsize
2012-10-12 08:53:13 +00:00
local fillsize=$(($COLUMNS-$PS1_length))
2012-10-22 09:10:13 +00:00
FILL="$color_gray"
2012-10-12 08:53:13 +00:00
while [[ $fillsize -gt 0 ]]; do FILL="${FILL}"; fillsize=$(($fillsize-1)); done
FILL="${FILL}${color_off}"
fi
if $color_is_on; then
# Git status for prompt
2012-10-22 09:10:13 +00:00
if [ ! -z "$GIT_BRANCH" ]; then
if [ -z "$GIT_DIRTY" ]; then
2012-10-12 08:53:13 +00:00
PS1_GIT=" #${color_green}${GIT_BRANCH}${color_off}"
else
PS1_GIT=" #${color_red}${GIT_BRANCH}${color_off}"
fi
fi
fi
# Set new color prompt
2012-10-12 08:53:13 +00:00
PS1="${color_user}${USER}${color_off}@${color_yellow}${HOSTNAME}${color_off}:${color_white}${PWDNAME}${color_off}${PS1_GIT} ${FILL}\n→ "
# Get cursor position and add new line if we're not in first column
2012-10-12 08:53:13 +00:00
echo -en "\033[6n" && read -sdR CURPOS
2012-10-22 09:10:13 +00:00
[[ "${CURPOS##*;}" -gt 1 ]] && echo "${color_error}${color_error_off}"
2012-10-12 08:53:13 +00:00
# Terminal title
TITLE=`basename ${PWDNAME}`
[ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] && TITLE="${TITLE} \xE2\x80\x94 ${HOSTNAME}"
echo -ne "\033]0;${TITLE}"; echo -ne "\007"
2012-10-12 08:53:13 +00:00
}
# Set prompt command (title update and color prompt)
PROMPT_COMMAND=prompt_command
# Set new B&W prompt (will be overwritten in `prompt_command` later with color prompt)
PS1='\u@\h:\w\$ '