You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.1 KiB
114 lines
3.1 KiB
#!/bin/bash
|
|
|
|
function signal() {
|
|
echo "$@" > ~/.signal
|
|
}
|
|
function silent() {
|
|
rm ~/.signal
|
|
}
|
|
|
|
# Check for an interactive session
|
|
[ -z "$PS1" ] && return
|
|
|
|
|
|
# https://wiki.archlinux.org/index.php/Color_Bash_Prompt#Wolfman.27s
|
|
##################################################
|
|
# Fancy PWD display function
|
|
##################################################
|
|
# The home directory (HOME) is replaced with a ~
|
|
# The last pwdmaxlen characters of the PWD are displayed
|
|
# Leading partial directory names are striped off
|
|
# /home/me/stuff -> ~/stuff if USER=me
|
|
# /usr/share/big_dir_name -> ../share/big_dir_name if pwdmaxlen=20
|
|
##################################################
|
|
bash_prompt_command() {
|
|
PROMPTRET="$?"
|
|
if [ $PROMPTRET == 0 ];
|
|
then
|
|
PROMPTRET=""
|
|
else
|
|
PROMPTRET=" $PROMPTRET"
|
|
fi
|
|
if [ -e ~/.signal ]
|
|
then
|
|
SIGNAL=$(cat ~/.signal)
|
|
[ -z "$SIGNAL" ] && SIGNAL="signal"
|
|
SIGNAL="[$SIGNAL]"
|
|
else
|
|
SIGNAL=""
|
|
fi
|
|
|
|
end_time=$(date +%s)
|
|
NEWF=''
|
|
local mfiles=$(find . -maxdepth 1 -type f -newermt '5 sec ago')
|
|
if [ -n "$mfiles" ]; then
|
|
NEWF=" $(ls -rt $mfiles 2>/dev/null | tail -3 | xargs -n 1 basename 2>/dev/null | tr '\n' ' ' )"
|
|
fi
|
|
|
|
# How many characters of the $PWD should be kept
|
|
local pwdmaxlen=30
|
|
# Indicate that there has been dir truncation
|
|
local trunc_symbol="..."
|
|
local dir=${PWD##*/}
|
|
pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
|
|
NEW_PWD=${PWD/#$HOME/\~}
|
|
local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
|
|
|
|
if [ ${pwdoffset} -gt "0" ]
|
|
then
|
|
NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
|
|
NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
|
|
fi
|
|
|
|
GIT_INFO=$(git_info)
|
|
}
|
|
|
|
|
|
git_info () {
|
|
GITSTATUS=$(LC_ALL=C git status 2>&1 | tr -d '#' | awk '
|
|
BEGIN {
|
|
}
|
|
/fatal:/ { exit(1) }
|
|
/On branch/ { branch=$3 }
|
|
/detached at/ { branch="detached at " $4 }
|
|
/working directory clean/ { clean=" clean" }
|
|
/branch is up-to-date/ { commits="" }
|
|
/branch is ahead/ { commits="+" $8}
|
|
/branch is behind/ { commits="-" $7}
|
|
/have diverged/ { commits=" diverged"}
|
|
/to be committed/ { staged=1; clean = " " }
|
|
/modified:/ { modified="M" }
|
|
/deleted:/ { deleted="D" }
|
|
/new file:/ { newfile="N" }
|
|
/Untracked/ { untracked="?" }
|
|
/not staged/ { staged=0; clean = " " }
|
|
END {
|
|
print( "("branch commits clean untracked modified deleted newfile ") ")
|
|
}
|
|
')
|
|
Q=$?
|
|
# print(EMW "(" EM branch W commits clean R untracked B modified R deleted G newfile EMW ") ")
|
|
# There seems to be no way to expand colored values into PS1 w/o breaking the length magic,
|
|
# so we re-set it every time
|
|
|
|
PS1STR="";
|
|
if [ $Q == 0 ]; then {
|
|
PS1STR="${GITSTATUS}";
|
|
} fi
|
|
echo -e $PS1STR
|
|
}
|
|
|
|
bash_prompt() {
|
|
local EMG="\[\033[1;32m\]"
|
|
local EMB="\[\033[1;34m\]"
|
|
local PSIGN="$"
|
|
trap 'echo -ne "\033[0;37m"' DEBUG
|
|
PS1="[\u@\h::\${NEW_PWD}\${NEWF}]\${SIGNAL} ${EMB}\${GIT_INFO}${EMG} ${PSIGN} "
|
|
BASE_PS1="$PS1" # for git_info
|
|
}
|
|
|
|
|
|
|
|
PROMPT_COMMAND=bash_prompt_command
|
|
bash_prompt
|
|
unset bash_prompt
|
|
|