
1 changed files with 114 additions and 0 deletions
@ -0,0 +1,114 @@ |
|||||
|
#!/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 |
Loading…
Reference in new issue