Created
April 27, 2015 12:57
-
-
Save klinkin/13d67c1de234b2cc5301 to your computer and use it in GitHub Desktop.
bash_profile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# don't put duplicate lines in the history | |
export HISTCONTROL=ignoreboth:erasedups | |
# set history length | |
HISTFILESIZE=1000000000 | |
HISTSIZE=1000000 | |
# append to the history file, don't overwrite it | |
shopt -s histappend | |
# check the window size after each command and, if necessary, update the values of LINES and COLUMNS. | |
shopt -s checkwinsize | |
# correct minor errors in the spelling of a directory component in a cd command | |
shopt -s cdspell | |
# save all lines of a multiple-line command in the same history entry (allows easy re-editing of multi-line commands) | |
shopt -s cmdhist | |
# setup color variables | |
color_is_on= | |
color_red= | |
color_green= | |
color_yellow= | |
color_blue= | |
color_white= | |
color_gray= | |
color_bg_red= | |
color_off= | |
color_user= | |
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 | |
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 PS1_VENV= | |
local GIT_BRANCH= | |
local GIT_DIRTY= | |
local PWDNAME=$PWD | |
# beautify working directory name | |
if [[ "${HOME}" == "${PWD}" ]]; then | |
PWDNAME="~" | |
elif [[ "${HOME}" == "${PWD:0:${#HOME}}" ]]; then | |
PWDNAME="~${PWD:${#HOME}}" | |
fi | |
# parse git status and get git variables | |
if [[ ! -z $PS1_GIT_BIN ]]; then | |
# check we are in git repo | |
local CUR_DIR=$PWD | |
while [[ ! -d "${CUR_DIR}/.git" ]] && [[ ! "${CUR_DIR}" == "/" ]] && [[ ! "${CUR_DIR}" == "~" ]] && [[ ! "${CUR_DIR}" == "" ]]; do CUR_DIR=${CUR_DIR%/*}; done | |
if [[ -d "${CUR_DIR}/.git" ]]; then | |
# 'git repo for dotfiles' fix: show git status only in home dir and other git repos | |
if [[ "${CUR_DIR}" != "${HOME}" ]] || [[ "${PWD}" == "${HOME}" ]]; 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 | |
fi | |
fi | |
fi | |
fi | |
# build b/w prompt for git and virtual env | |
[[ ! -z $GIT_BRANCH ]] && PS1_GIT=" (git: ${GIT_BRANCH})" | |
[[ ! -z $VIRTUAL_ENV ]] && PS1_VENV=" (venv: ${VIRTUAL_ENV#$WORKON_HOME})" | |
# calculate prompt length | |
local PS1_length=$((${#USER}+${#HOSTNAME}+${#PWDNAME}+${#PS1_GIT}+${#PS1_VENV}+3)) | |
local FILL= | |
# if length is greater, than terminal width | |
if [[ $PS1_length -gt $COLUMNS ]]; then | |
# strip working directory name | |
PWDNAME="...${PWDNAME:$(($PS1_length-$COLUMNS+3))}" | |
else | |
# else calculate fillsize | |
local fillsize=$(($COLUMNS-$PS1_length)) | |
FILL=$color_gray | |
while [[ $fillsize -gt 0 ]]; do FILL="${FILL}─"; fillsize=$(($fillsize-1)); done | |
FILL="${FILL}${color_off}" | |
fi | |
if $color_is_on; then | |
# build git status for prompt | |
if [[ ! -z $GIT_BRANCH ]]; then | |
if [[ -z $GIT_DIRTY ]]; then | |
PS1_GIT=" (git: ${color_green}${GIT_BRANCH}${color_off})" | |
else | |
PS1_GIT=" (git: ${color_red}${GIT_BRANCH}${color_off})" | |
fi | |
fi | |
# build python venv status for prompt | |
[[ ! -z $VIRTUAL_ENV ]] && PS1_VENV=" (venv: ${color_blue}${VIRTUAL_ENV#$WORKON_HOME}${color_off})" | |
fi | |
# set new color prompt | |
PS1="${color_user}${USER}${color_off}@${color_yellow}${HOSTNAME}${color_off}:${color_white}${PWDNAME}${color_off}${PS1_GIT}${PS1_VENV} ${FILL}\n➜ " | |
echo -en "\033[6n" && read -sdR CURPOS | |
[[ ${CURPOS##*;} -gt 1 ]] && echo "${color_error}↵${color_error_off}" | |
# set title | |
echo -ne "\033]0;${USER}@${HOSTNAME}:${PWDNAME}"; echo -ne "\007" | |
} | |
# set prompt command (title update and color prompt) | |
PROMPT_COMMAND=prompt_command | |
# set new b/w prompt (will be overwritten in 'prompt_command' later for color prompt) | |
PS1='\u@\h:\w\$ ' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment