diff options
| author | Sam Nystrom <sam@samnystrom.dev> | 2023-09-07 21:12:39 -0400 |
|---|---|---|
| committer | Sam Nystrom <sam@samnystrom.dev> | 2023-09-07 21:12:39 -0400 |
| commit | e023da000caf7693682cd9113e2085ec1256bf0b (patch) | |
| tree | 0f55a09ef5eeaee73d32590aed6982ee91c6c50c | |
| parent | 371ef2873b7b251ed75a4b03511164c57bc6a46e (diff) | |
yash: use less external commands in PS1
| -rw-r--r-- | .yashrc | 88 |
1 files changed, 44 insertions, 44 deletions
@@ -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)' |
