X-Git-Url: https://git.rmz.io/dotfiles.git/blobdiff_plain/2ecf015bfa7f10eab50aeb748e687ee3dfb71356..03e18ae17a72f3db72ee65eb290d35fb13d66237:/zsh/lib/prompt.zsh diff --git a/zsh/lib/prompt.zsh b/zsh/lib/prompt.zsh index 0334516..56d702b 100644 --- a/zsh/lib/prompt.zsh +++ b/zsh/lib/prompt.zsh @@ -2,19 +2,24 @@ setopt prompt_subst autoload colors; colors; -hostcolor=green +hostcolor=cyan [[ $(hostname) == "tardis" ]] && hostcolor=red precmd() { - PROMPT='%T %n@%{$fg[$hostcolor]%}%m%{$reset_color%}%-0>..>$(git_prompt_status)%>> -%(?..%{$fg_bold[white]%}%?%{$reset_color%})$(vi_prompt_info)%{%(!.$fg[red]❰.$fg[green]❱)%1G%} ' + PROMPT='%T $(virtualenv_prompt)%n@%{$fg[$hostcolor]%}%m$(jobs_prompt)%-0>..>$(git_prompt_status)%>> +%(?..%{$fg_bold[white]%}%?)%{$reset_color%}$(vi_prompt_info)%{%(!.$fg[red]❰.$fg[green]❱)%1G%} ' RPROMPT='%{$fg[green]%}%~%{$reset_color%}' } +jobs_prompt() { + printf '%s' "%(1j. $fg_bold[white]↵%{$fg_bold[red]%}%j.)%{$reset_color%}" +} + vi_prompt_info() { local vicmd="$fg_bold[green]❰$reset_color%1G" local viins="$fg_bold[blue]❱$reset_color%1G" - printf '%s' "%{${${KEYMAP/vicmd/$vicmd}/(main|viins)/$viins}%}" + local map=${KEYMAP:-viins} + printf '%s' "%{${${map/vicmd/$vicmd}/(main|viins)/$viins}%}" } function zle-line-init zle-line-finish zle-keymap-select { @@ -22,8 +27,8 @@ function zle-line-init zle-line-finish zle-keymap-select { zle -R } -zle -N zle-line-init -zle -N zle-line-finish +# zle -N zle-line-init +# zle -N zle-line-finish zle -N zle-keymap-select # reset zle on resize @@ -33,45 +38,44 @@ TRAPWINCH() { # Get the status of the working tree git_prompt_status() { - local branch ahead behind + if ! git rev-parse --is-inside-work-tree &>/dev/null; then + return + fi + local oid head ahead behind local added deleted modified renamed unmerged untracked dirty # Use porcelain status for easy parsing. - local status_cmd="git status --porcelain -b" + local status_cmd="git status --porcelain=v2 -b" # Get current status. while IFS=$'\n' read line; do - if [[ "$line" == \#\#\ * ]]; then - [[ "$line" =~ '## ([^.]*)\.\.\.(.*)' ]] && branch=$match[1] - [[ "$line" =~ 'ahead ([0-9]+)' ]] && ahead=$match[1] - [[ "$line" =~ 'behind ([0-9]+)' ]] && behind=$match[1] + if [[ "$line" == \#\ * ]]; then + [[ "$line" =~ '# branch.oid ([0-9a-f]+)' ]] && oid=$match[1] + [[ "$line" =~ '# branch.head (.*)' ]] && head=$match[1] + [[ "$line" =~ '# branch.ab \+([0-9]+) -([0-9]+)' ]] && ahead=$match[1] && behind=$match[2] else # Count added, deleted, modified, renamed, unmerged, untracked, dirty. # T (type change) is undocumented, see http://git.io/FnpMGw. # index - [[ "$line" == M[\ MTD]\ * ]] && (( updated++ )) - [[ "$line" == [AC][\ MTD]\ * ]] && (( added++ )) - [[ "$line" == D[\ MT]\ * ]] && (( deleted++ )) - [[ "$line" == R[\ MTD]\ * ]] && (( renamed++ )) + [[ "$line" == 1\ M[.MTD]\ * ]] && (( updated++ )) + [[ "$line" == 1\ [AC][.MTD]\ * ]] && (( added++ )) + [[ "$line" == 1\ D[.MT]\ * ]] && (( deleted++ )) + [[ "$line" == 2\ R[.MTD]\ * ]] && (( renamed++ )) # work tree - [[ "$line" == [\ MARCT]M\ * ]] && (( modified++ )) - [[ "$line" == [\ MARCT]D\ * ]] && (( deleted_wt++ )) - [[ "$line" == \?\?\ * ]] && (( untracked++ )) + [[ "$line" == 1\ [.MARCT]A\ * ]] && (( added++ , modified++ )) # intend-to-add + [[ "$line" == 1\ [.MARCT]M\ * ]] && (( modified++ )) + [[ "$line" == 1\ [.MARCT]D\ * ]] && (( deleted_wt++ )) + [[ "$line" == \?\ * ]] && (( untracked++ )) - # morge conflicts - [[ "$line" == (AA|DD|U?|?U)\ * ]] && (( unmerged++ )) + # merge conflicts + [[ "$line" == u\ (AA|DD|U?|?U)\ * ]] && (( unmerged++ )) fi done < <(${(z)status_cmd} 2> /dev/null) - local git_status=" %{$fg[yellow]%}" + local git_status=" %{$fg_bold[green]%}" - # Format branch - if [[ -n $branch ]]; then - git_status+="$branch" - else - git_status+="$(git rev-parse --short HEAD 2> /dev/null)" - [[ $? -ne 0 ]] && return - fi + # Format branch and commit + git_status+="$head%{$fg_no_bold[yellow]%}(${oid[1,8]})" # Format upstream local upstream_str @@ -79,6 +83,13 @@ git_prompt_status() { (( behind > 0 )) && upstream_str+="%{$fg[blue]%} <$behind" git_status+="$upstream_str" + # Format push + push_ab=( $(git rev-list --left-right --count @...@{push} 2>/dev/null) ) + if (( $? == 0 )); then + (( push_ab[1] > 0 )) && git_status+="%{$fg_bold[blue]%} ⮝$push_ab[1]" + (( push_ab[2] > 0 )) && git_status+="%{$fg_bold[blue]%} ⮟$push_ab[2]" + fi + # Format stashed stashed=$(git stash list | wc -l) if (( stashed > 0 )) then @@ -107,6 +118,14 @@ git_prompt_status() { echo $git_status } +function virtualenv_prompt() { + if [[ -z $VIRTUAL_ENV ]] then + echo "" + else + echo "(${VIRTUAL_ENV##*/}) " + fi +} + function print_if_fits() { local zero length