# vim:filetype=sh # .bashrc for fancy prompt # max length of cwd _wdlen=36 ## colors _RESET=`echo -ne '\033[0m'` _RED=`echo -ne '\033[0;31m'` _GREEN=`echo -ne '\033[0;32m'` _YELLOW=`echo -ne '\033[0;33m'` _BLUE=`echo -ne '\033[0;34m'` _MAGENTA=`echo -ne '\033[0;35m'` _CYAN=`echo -ne '\033[0;36m'` _GRAY=`echo -ne '\033[0;37m'` ## username and hostname colors depend on their values _HCDEF="$_BLUE" host2color() { local colors sum colors=("$_RESET" "$_BLUE" "$_MAGENTA" "$_CYAN") sum=$(echo -n "$HOSTNAME" | sum) sum="${sum:0:1}" _HCDEF=${colors[sum % ${#colors[*]}]} } host2color unset host2color ## user if [ $UID -eq 0 ]; then _c_u="$_RED" else _c_u="$_GREEN" fi ## optimize access to load if [ -r /proc/loadavg ]; then _get_loadavg() { _loadavg=$(< /proc/loadavg) _loadavg="${_loadavg%%[, ]*}" } else _get_loadavg_fresh=0 _get_loadavg() { if [ $_get_loadavg_fresh -lt $SECONDS ]; then _loadavg=$(trap "" SIGTSTP; uptime) _loadavg="${_loadavg##*: }" _loadavg="${_loadavg%%[, ]*}" _get_loadavg_fresh=$((SECONDS+5)) _get_loadavg_save=$_loadavg else _loadavg=$_get_loadavg_save fi } fi ## prompt (xterm/screen/... title and PS1) _prompt() { ## must store $? first, it will get changed local _r=$? _wdlb _wdla _jobs_ids ## success/failure if [ $_r -eq 0 ]; then _c_p="$_GREEN" elif [ $_r -eq 127 ]; then _c_p="$_BLUE" else _c_p="$_RED" fi ## misc info _jobs_ids=( $(jobs -p) ) _jobs=${#_jobs_ids[*]} _get_loadavg ## pwd _wd="${PWD/#$HOME/~}" if [ "${#_wd}" -gt $_wdlen ]; then _wdp="${_wd%/*/*}" _wd="${_wd/#$_wdp\/}" _wdm=" .. " let _wdlb=_wdlen/3 _wdla=_wdlen-_wdlb if [ "${#_wd}" -gt $_wdla ]; then _wd="${_wd:${#_wd}-_wdla}" else let _wdlb+="_wdla-${#_wd}" fi if [ "${#_wdp}" -gt $_wdlb ]; then _wdp="${_wdp:0:_wdlb}" fi else _wdp="" _wdm="" fi ## title string _promptstr="$_loadavg/$_jobs/${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}" ## add window information from screen if [ -n "$WINDOW" ]; then _promptstr="$WINDOW $_promptstr" fi ## hostname color from loadavg let _loadavg="10#${_loadavg//.}" if [ $_loadavg -ge 150 ]; then _c_h="$_RED" elif [ $_loadavg -gt 75 ]; then _c_h="$_YELLOW" else _c_h="$_HCDEF" fi ## jobs (empty if no job) if [ $_jobs -gt 0 ]; then _c_j="$_RED" _jobs="$_jobs " else _c_j="$_RESET" _jobs="" fi return $_r } _prompt_xterm-color() { echo -ne "\033]0;$_promptstr\007" } _prompt_xterm() { echo -ne "\033]0;$_promptstr\007" } _prompt_screen() { echo -ne "\033_$_promptstr\033\\" } PROMPT_COMMAND="_prompt" if type -t _prompt_$TERM > /dev/null; then PROMPT_COMMAND="$PROMPT_COMMAND; _prompt_$TERM" fi if type -t _prompt_$SCREENTERM > /dev/null; then PROMPT_COMMAND="$PROMPT_COMMAND; _prompt_$SCREENTERM" fi PS1='\[$_c_u\]\u\[$_RESET\] \[$_c_h\]\h\[$_RESET\] \[$_RESET\]$_wdp\[$_GRAY\]$_wdm\[$_RESET\]$_wd\[$_RESET\] \[$_c_j\]$_jobs\[$_c_p\]\$\[$_RESET\] '