summaryrefslogtreecommitdiff
path: root/.yashrc
diff options
context:
space:
mode:
authorSam Nystrom <sam@samnystrom.dev>2023-09-07 21:12:39 -0400
committerSam Nystrom <sam@samnystrom.dev>2023-09-07 21:12:39 -0400
commite023da000caf7693682cd9113e2085ec1256bf0b (patch)
tree0f55a09ef5eeaee73d32590aed6982ee91c6c50c /.yashrc
parent371ef2873b7b251ed75a4b03511164c57bc6a46e (diff)
yash: use less external commands in PS1
Diffstat (limited to '.yashrc')
-rw-r--r--.yashrc88
1 files changed, 44 insertions, 44 deletions
diff --git a/.yashrc b/.yashrc
index 4cf14c5..c83de3d 100644
--- a/.yashrc
+++ b/.yashrc
@@ -4,73 +4,73 @@ _ps1_prompt() {
CMD_DURATION=0
is_git=$(git rev-parse --is-inside-work-tree 2>/dev/null)
- printf '\n\\foc.'
+ prompt="\n\\foc."
if [ "$is_git" ]; then
- printf '%s' "$(git rev-parse --show-toplevel | awk -F/ '{ print $NF }')"
+ prompt="$prompt$(git rev-parse --show-toplevel | awk -F/ '{ print $NF }')"
git_path=$(git rev-parse --show-prefix)
git_path="${git_path%/}"
- [ "$git_path" ] && printf '/%s' "$git_path"
+ prompt="$prompt${git_path:+"/$git_path"}"
+ elif [ "${PWD#"$HOME"}" != "$PWD" ]; then
+ prompt="$prompt~${PWD#"$HOME"}"
else
- printf '%s' "$(pwd | sed "s#^$HOME#~#")"
+ prompt="$prompt$PWD"
fi
- printf '\\fD.'
+ prompt="$prompt\\fD."
if [ "$is_git" ]; then
- printf ' on \\fom. %s' "$(git branch --show-current)"
+ prompt="$prompt on \\fom. $(git branch --show-current)"
stat=
- s=$(git status --porcelain -b)
- echo "$s" | grep -q '^U[UDA]|^AA|^DD|^[DA]U' && stat="$stat="
git rev-parse --verify refs/stash >/dev/null 2>&1 && stat="$stat\$"
- echo "$s" | grep -q '^[MARCDU ]D|^D[ UM]' && stat="$stat✘"
- echo "$s" | grep -q '^R[ MD]' && stat="$stat»"
- echo "$s" | grep -q '^[ MARC]M' && stat="$stat!"
- echo "$s" | grep -q '^A[ MDAU]|^M[ MD]|^UA' && stat="$stat+"
- echo "$s" | grep -q '^\?\?' && stat="$stat?"
-
- ahead=
- behind=
- echo "$s" | grep -q '^## [^ ]\+ .*ahead' && ahead=1
- echo "$s" | grep -q '^## [^ ]\+ .*behind' && behind=1
- if [ "$ahead" ] && [ "$behind" ]; then
- stat="$stat⇕"
- elif [ "$ahead" ]; then
- stat="$stat⇡"
- elif [ "$behind" ]; then
- stat="$stat⇣"
- fi
-
- if [ "$stat" ]; then
- printf '\\for. [%s]' "$stat"
- fi
+ status="$(git status --porcelain -b)"
+ case "$status" in
+ U[UDA]*|AA*|DD*|[DA]U*) stat="$stat=" ;;
+ esac
+ case "$status" in
+ [MARCDU\ ]D*|D[\ UM]*) stat="$stat✘" ;;
+ esac
+ case "$status" in
+ R[\ MD]*) stat="$stat»" ;;
+ esac
+ case "$status" in
+ [\ MARC]M*) stat="$stat!" ;;
+ esac
+ case "$status" in
+ A[\ MDAU]*|M[\ MD]*|UA*) stat="$stat+" ;;
+ esac
+ case "$status" in
+ '??'*) stat="$stat?" ;;
+ esac
+ case "$status" in
+ '## '*ahead*behind*) stat="$stat⇕" ;;
+ '## '*ahead*) stat="$stat⇡" ;;
+ '## '*behind*) stat="$stat⇣" ;;
+ esac
+ prompt="$prompt${stat:+"\\for. [$stat]"}"
fi
if [ "$cmd_duration" -gt 1 ]; then
- printf ' took\\foy.'
+ prompt="$prompt took\\foy."
secs=$((cmd_duration % 60))
mins=$((cmd_duration / 60 % 60))
hours=$((cmd_duration / 3600))
- [ "$hours" -gt 0 ] && printf ' %dh' "$hours"
- [ "$mins" -gt 0 ] && printf ' %dm' "$mins"
- [ "$secs" -gt 0 ] && printf ' %ds' "$secs"
+ [ "$hours" -gt 0 ] && prompt="$prompt ${hours}h"
+ [ "$mins" -gt 0 ] && prompt="$prompt ${mins}m"
+ [ "$secs" -gt 0 ] && prompt="$prompt ${secs}s"
fi
- printf '\\fD.\n'
+ prompt="$prompt\n"
n_jobs="$(jobs 2>/dev/null | wc -l)"
if [ "$n_jobs" -gt 0 ]; then
- printf '\\fob.✦ '
- [ "$n_jobs" -gt 1 ] && printf '%d ' "$n_jobs"
- printf '\\fD.'
- fi
-
- if [ "$cmd_status" -eq 0 ]; then
- printf '\\fg.'
- else
- printf '\\fr.'
+ [ "$n_jobs" -le 1 ] && n_jobs=
+ prompt="$prompt\\fob.✦ ${n_jobs:+"$n_jobs "}"
fi
- printf '❯ \\fD.'
+ case "$cmd_status" in
+ 0) printf '%s\\fg.❯ \\fD.' "$prompt" ;;
+ *) printf '%s\\fr.❯ \\fD.' "$prompt" ;;
+ esac
}
export PS1='$(_ps1_prompt)'