148 lines
4.3 KiB
Bash
148 lines
4.3 KiB
Bash
#!/bin/bash
|
|
|
|
format_modified_detailed() {
|
|
local txtrst='\e[m'
|
|
local txtred='\e[0;31m'
|
|
local txtgrn='\e[0;32m'
|
|
local txtyel='\e[0;33m'
|
|
|
|
# Modified, staged and untracked
|
|
# A added (new file) M modified, D deleted, R renamed, T typechange
|
|
stat="$(git status --porcelain 2>/dev/null)"
|
|
n_sta=""
|
|
n_mod=""
|
|
for i in A M D R T; do
|
|
c=$(echo "$stat" | grep "^[$i]" | wc -l)
|
|
[ "$c" != "0" ] && n_sta="$n_sta$i$c"
|
|
c=$(echo "$stat" | grep "^ [$i]" | wc -l)
|
|
[ "$c" != "0" ] && n_mod="$n_mod$i$c"
|
|
done
|
|
n_unt=$(echo "$stat" | grep "??" | wc -l)
|
|
|
|
out=""
|
|
[ ! -z "$n_sta" ] && out+="\[$txtgrn\]+$n_sta\[$txtrst\]"
|
|
[ ! -z "$n_mod" ] && out+="\[$txtred\]*$n_mod\[$txtrst\]"
|
|
[ ! -z "$n_unt" ] && out+="\[$txtyel\]^$n_unt\[$txtrst\]"
|
|
echo "$out"
|
|
}
|
|
|
|
format_modified() {
|
|
local txtrst='\e[m'
|
|
local txtred='\e[0;31m'
|
|
local txtgrn='\e[0;32m'
|
|
local txtyel='\e[0;33m'
|
|
|
|
# Modified, staged and untracked
|
|
# A added (new file) M modified, D deleted, R renamed, T typechange
|
|
stat="$(git status --porcelain 2>/dev/null)"
|
|
n_sta=$(echo "$stat" | grep "^[AMDRT]" | wc -l)
|
|
n_mod=$(echo "$stat" | grep "^ [AMDRT]" | wc -l)
|
|
n_unt=$(echo "$stat" | grep "??" | wc -l)
|
|
|
|
out=""
|
|
[ "$n_sta" != 0 ] && out+="\[$txtgrn\]+$n_sta\[$txtrst\]"
|
|
[ "$n_mod" != 0 ] && out+="\[$txtred\]*$n_mod\[$txtrst\]"
|
|
[ "$n_unt" != 0 ] && out+="\[$txtyel\]^$n_unt\[$txtrst\]"
|
|
echo "$out"
|
|
}
|
|
|
|
set_prompt_fancy()
|
|
{
|
|
local is_git="$(git rev-parse --is-inside-work-tree 2>/dev/null)"
|
|
|
|
local last_cmd=$?
|
|
local txtrst='\e[m'
|
|
local txtbold='\e[1m'
|
|
local txtblk='\e[30m'
|
|
local txtred='\e[31m'
|
|
local txtgrn='\e[32m'
|
|
local txtyel='\e[33m'
|
|
local txtblu='\e[34m'
|
|
local txtpur='\e[35m'
|
|
local txtcyn='\e[36m'
|
|
local txtwht='\e[37m'
|
|
# unicode "✗"
|
|
local fancyx='\342\234\227'
|
|
# unicode "✓"
|
|
local checkmark='\342\234\223'
|
|
# Line 1: Full date + full time (24h)
|
|
# Line 2: current path
|
|
PS1="\[$txtbold\]\[$txtwht\]\n\D{%A %d %B %Y %H:%M:%S}\n\[$txtgrn\]\w\n"
|
|
# Line 3: Git repo + path in repo
|
|
if [ "$is_git" ]; then
|
|
local git_repo=$(basename `git rev-parse --show-toplevel` 2>/dev/null)
|
|
local git_rel_path=$(git rev-parse --show-prefix 2>/dev/null)
|
|
PS1+="$txtcyn$git_repo $txtpur$git_rel_path$txtrst\n"
|
|
fi
|
|
# User color: red for root, yel for others
|
|
if [[ $EUID == 0 ]]; then
|
|
PS1+="\[$txtred\]"
|
|
else
|
|
PS1+="\[$txtyel\]"
|
|
fi
|
|
# Line 3: user@host
|
|
PS1+="\u\[$txtwht\]@\h\n"
|
|
# Line 4: a red "✗" or a grn "✓" and the error number
|
|
if [[ $last_cmd == 0 ]]; then
|
|
PS1+="\[$txtgrn\]$checkmark \[$txtwht\](0)"
|
|
else
|
|
PS1+="\[$txtred\]$fancyx \[$txtwht\]($last_cmd)"
|
|
fi
|
|
# Line 4: grn git branch
|
|
PS1+="\[$txtgrn\]$(__git_ps1 '(%s')\[$txtwht\]"
|
|
PS1+="$(format_modified_detailed)\[$txtgrn\])\[$txtrst\] "
|
|
# Line 4: good old prompt, $ for user, # for root
|
|
PS1+=" \\$ "
|
|
}
|
|
|
|
set_prompt()
|
|
{
|
|
local is_git="$(git rev-parse --is-inside-work-tree 2>/dev/null)"
|
|
|
|
local txtrst='\e[m'
|
|
local txtbold='\e[1m'
|
|
local txtblk='\e[30m'
|
|
local txtred='\e[31m'
|
|
local txtgrn='\e[32m'
|
|
local txtyel='\e[33m'
|
|
local txtblu='\e[34m'
|
|
local txtpur='\e[35m'
|
|
local txtcyn='\e[36m'
|
|
local txtwht='\e[37m'
|
|
|
|
# User color: red for root, yel for others
|
|
if [[ $EUID == 0 ]]; then
|
|
PS1+="\[$txtred\]"
|
|
else
|
|
PS1+="\[$txtyel\]"
|
|
fi
|
|
# user@host
|
|
PS1="\u\[$txtwht\]@\h"
|
|
# Git repo + path in repo
|
|
if [ "$is_git" ]; then
|
|
local git_repo=$(basename `git rev-parse --show-toplevel` 2>/dev/null)
|
|
local git_rel_path=$(git rev-parse --show-prefix 2>/dev/null)
|
|
PS1+="\[$txtcyn\][$git_repo] \[$txtpur\]$git_rel_path\[$txtrst\]"
|
|
# Green git branch
|
|
PS1+="\[$txtgrn\]$(__git_ps1 '(%s')\[$txtwht\]"
|
|
PS1+="$(format_modified)\[$txtgrn\])\[$txtrst\] "
|
|
else
|
|
# Current path
|
|
PS1+="\[$txtgrn\]\w "
|
|
fi
|
|
# Good old prompt, $ for user, # for root
|
|
PS1+="\[$txtrst\]\\$ "
|
|
}
|
|
|
|
f() {
|
|
case $PROMPT_COMMAND in
|
|
set_prompt )
|
|
export PROMPT_COMMAND='set_prompt_fancy'
|
|
;;
|
|
set_prompt_fancy )
|
|
export PROMPT_COMMAND='set_prompt'
|
|
;;
|
|
esac
|
|
}
|
|
export PROMPT_COMMAND='set_prompt'
|