Skip to content

Instantly share code, notes, and snippets.

@rustoceans
Last active January 19, 2018 11:18
Show Gist options
  • Select an option

  • Save rustoceans/6b2ea31f2dd0cb26c2f70b6c1822d9b6 to your computer and use it in GitHub Desktop.

Select an option

Save rustoceans/6b2ea31f2dd0cb26c2f70b6c1822d9b6 to your computer and use it in GitHub Desktop.
my bash prompt
#!/bin/bash
source "$(dirname $(readlink $BASH_SOURCE))/../os/utils.sh"
# ----------------------------------------------------------------------
# | Colors |
# ----------------------------------------------------------------------
enable_color_support() {
declare OS="$(get_os)"
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if [[ $COLORTERM == gnome-* && $TERM == xterm ]] \
&& infocmp xterm-256color &> /dev/null; then
export TERM='xterm-256color'
elif infocmp xterm-256color &> /dev/null; then
export TERM='xterm-256color'
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if [ "$OS" == 'osx' ]; then
alias ls='ls -G' # or CLICOLOR=1
elif [ "$OS" == 'ubuntu' ]; then
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors \
&& eval "$(dircolors -b ~/.dircolors)" \
|| eval "$(dircolors -b)"
alias dir='dir --color=auto'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias ls='ls -F --color=auto'
alias vdir='vdir --color=auto'
fi
fi
}
set_ls_colors() {
declare OS="$(get_os)"
# There are several different implementations of color for ls:
# ------------------------------------------------------------------
# | FreeBSD / OS X |
# ------------------------------------------------------------------
# - `ls` displays colors if the `-G` option is passed or if
# the `CLICOLOR` environment variable is set
#
# - the actual colors are configured through the `LSCOLORS`
# environment variable (built-in defaults are used if this
# variable is not set)
if [ "$OS" == 'osx' ]; then
LSCOLORS=''
LSCOLORS+='gx' # Directory
LSCOLORS+='fx' # Symbolic link
LSCOLORS+='cx' # Socket
LSCOLORS+='dx' # Pipe
LSCOLORS+='cx' # Executable
LSCOLORS+='eg' # Block special
LSCOLORS+='ed' # Character special
LSCOLORS+='ab' # Executable with setuid bit set
LSCOLORS+='ag' # Executable with setgid bit set
LSCOLORS+='cc' # Directory writable to others, with sticky bit
LSCOLORS+='bd' # Directory writable to others, without sticky bit
export LSCOLORS
# ------------------------------------------------------------------
# | GNU |
# ------------------------------------------------------------------
# - `ls` displays colors if the `--color` option is passed
#
# - the actual colors are configured through the `LS_COLORS`
# environment variable (built-in defaults are used if this
# variable is not set)
elif [ "$OS" == 'ubuntu' ]; then
LS_COLORS=''
LS_COLORS+='no=1;39:' # global default
LS_COLORS+='di=1;36:' # directory
LS_COLORS+='ex=1;32:' # executable file
LS_COLORS+='fi=1;39:' # file
LS_COLORS+='ec=:' # non-filename text
LS_COLORS+='mi=1;31:' # non-existent file pointed to by a symlink
LS_COLORS+='ln=target:' # symbolic link
LS_COLORS+='or=31;01' # symbolic link pointing to a non-existent file
export LS_COLORS
fi
}
# ----------------------------------------------------------------------
# | Prompts |
# ----------------------------------------------------------------------
# Note: Don't break this function into smaller, more specialized ones
# as you will only pollute the global space even more (this function
# cannot be unset due to the fact that it's called every time the prompt
# string is shown)
get_git_repository_details() {
local branchName=''
local tmp=''
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Check if the current directory is in a Git repository
[ "$(git rev-parse &>/dev/null; printf $?)" -ne 0 ] && return
# Check if in `.git/` directory (some of the following
# checks don't make sense/won't work in the `.git` directory)
[ "$(git rev-parse --is-inside-git-dir)" == "true" ] && return
# Check for uncommitted changes in the index
if ! $(git diff --quiet --ignore-submodules --cached); then
tmp="$tmp+";
fi
# Check for unstaged changes
if ! $(git diff-files --quiet --ignore-submodules --); then
tmp="$tmp!";
fi
# Check for untracked files
if [ -n "$(git ls-files --others --exclude-standard)" ]; then
tmp="$tmp?";
fi
# Check for stashed files
if $(git rev-parse --verify refs/stash &>/dev/null); then
tmp="$tmp$";
fi
[ -n "$tmp" ] && tmp=" [$tmp]"
branchName="$( printf "$( git rev-parse --abbrev-ref HEAD 2> /dev/null \
|| git rev-parse --short HEAD 2> /dev/null \
|| printf " (unknown)" )" | tr -d "\n" )"
printf "%s" "$1$branchName$tmp"
}
set_prompts() {
local black='' blue='' bold='' cyan='' green='' orange='' \
purple='' red='' reset='' white='' yellow=''
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if [ -x /usr/bin/tput ] && tput setaf 1 &> /dev/null; then
tput sgr0 # Reset colors
bold=$(tput bold)
reset=$(tput sgr0)
# Solarized colors
# https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized#the-values
# Colors
black="\[$(tput setaf 0)\]"
red="\[$(tput setaf 1)\]"
green="\[$(tput setaf 2)\]"
yellow="\[$(tput setaf 3)\]"
blue="\[$(tput setaf 4)\]"
magenta="\[$(tput setaf 5)\]"
cyan="\[$(tput setaf 6)\]"
white="\[$(tput setaf 7)\]"
# Title bar - "user@host: ~"
title="\u@\h: \w"
titlebar="\[\033]0;"$title"\007\]"
# Git branch
git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)\ /';
}
else
bold=''
reset="\e[0m"
black="\e[1;30m"
blue="\e[1;34m"
cyan="\e[1;36m"
green="\e[1;32m"
orange="\e[1;33m"
purple="\e[1;35m"
red="\e[1;31m"
white="\e[1;37m"
yellow="\e[1;33m"
fi
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Prompt Statement variables
# http://ss64.com/bash/syntax-prompt.html
# ------------------------------------------------------------------
# | PS1 - Default interactive prompt |
# ------------------------------------------------------------------
# PS1="\[\033]0;\w\007\]" # Terminal title (set to the
# # current working directory)
# PS1+="\[$bold\]"
# PS1+="\[$orange\]\u" # Username
# PS1+="\[$white\]@"
# PS1+="\[$yellow\]\h" # Host
# PS1+="\[$white\]: "
# PS1+="\[$green\]\w" # Working directory
# PS1+="\$(get_git_repository_details \"$white on $cyan\")"
# PS1+="\n"
# PS1+="\[$reset$white\]\$ \[$reset\]"
#
# export PS1
# Clear attributes
clear_attributes="\[$(tput sgr0)\]"
# Custom bash prompt - "➜ ~ (master) "
export PS1="\[$bold\] ${titlebar}${green}➜ ${blue}\u${white}@${red}\h ${yellow}\w ${cyan}\$(git_branch)${clear_attributes}"
# ------------------------------------------------------------------
# | PS2 - Continuation interactive prompt |
# ------------------------------------------------------------------
PS2='⚡ '
export PS2
# ------------------------------------------------------------------
# | PS4 - Debug prompt |
# ------------------------------------------------------------------
# e.g:
#
# The GNU `date` command has the `%N` interpreted sequence while
# other implementations don't (on OS X `gdate` can be used instead
# of the native `date` if the `coreutils` package was installed)
#
# local dateCmd=""
#
# if [ "$(date +%N)" != "N" ] || \
# [ ! -x "$(command -v 'gdate')" ]; then
# dateCmd="date +%s.%N"
# else
# dateCmd="gdate +%s.%N"
# fi
#
# PS4="+$( tput cr && tput cuf 6 &&
# printf "$yellow %s $green%6s $reset" "$($dateCmd)" "[$LINENO]" )"
#
# PS4 output:
#
# ++ 1357074705.875970000 [123] '[' 1 == 0 ']'
# └──┬─┘└────┬───┘ └───┬───┘ └──┬─┘ └──────┬─────┘
# │ │ │ │ │
# │ │ │ │ └─ command
# │ │ │ └─ line number
# │ │ └─ nanoseconds
# │ └─ seconds since 1970-01-01 00:00:00 UTC
# └─ depth-level of the subshell
PS4="+$( tput cr && tput cuf 6 && printf "%s $reset" )"
export PS4
}
# ----------------------------------------------------------------------
# | Main |
# ----------------------------------------------------------------------
main() {
enable_color_support
set_ls_colors
set_prompts
}
main
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Unset anything that just pollutes the global space
unset -f enable_color_support
unset -f main
unset -f set_ls_colors
unset -f set_prompts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment