zsh: bring git status back
This commit is contained in:
		
							parent
							
								
									488425ee01
								
							
						
					
					
						commit
						3723ba3d0a
					
				
					 2 changed files with 68 additions and 87 deletions
				
			
		
							
								
								
									
										88
									
								
								zshrc
									
										
									
									
									
								
							
							
						
						
									
										88
									
								
								zshrc
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -43,30 +43,78 @@ zstyle ':completion:*:processes-names' command 'ps axho command'
 | 
			
		|||
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
 | 
			
		||||
# }}}
 | 
			
		||||
# {{{ prompt
 | 
			
		||||
prompt_user='%(!.%F{red}%n%f@.)'
 | 
			
		||||
style_reset='%%{\e[0m%%}'
 | 
			
		||||
style_gital='%%{\e[2;3m%%}'
 | 
			
		||||
#prompt_user='%F{%(!.red.blue)}%n%f'
 | 
			
		||||
reset='%%{\e[0m%%}'
 | 
			
		||||
prompt_fmt="${reset}[ %s@%s:%s %s]\n%%# "
 | 
			
		||||
prompt_fmtn="${reset}[ %%{\e[2;3m%%}%s${reset} ]%%# "
 | 
			
		||||
prompt_user='%F{%(!.red.blue)}%n%f'
 | 
			
		||||
prompt_host='%m'
 | 
			
		||||
prompt_cwd='%F{blue}%2~%f'
 | 
			
		||||
prompt_bang='%#'
 | 
			
		||||
prompt_fmt="${style_reset}[ %s%s %s ]%s "
 | 
			
		||||
prompt_fmtn="${style_reset}[ $style_gital%s$style_reset ]%s "
 | 
			
		||||
prompt_cwd='%F{green}%d%f'
 | 
			
		||||
prompt_git_fmt='\ue0a0 %s %s%%f '
 | 
			
		||||
prompt_state_file=/tmp/zsh_gitstatus_$$.tmp
 | 
			
		||||
 | 
			
		||||
function zle-line-init zle-keymap-select {
 | 
			
		||||
    case $KEYMAP in
 | 
			
		||||
        (vicmd) prompt_bang='_';;
 | 
			
		||||
        (main)  prompt_bang='#';;
 | 
			
		||||
    esac
 | 
			
		||||
    printf -v PROMPT $prompt_fmt $prompt_user $prompt_host $prompt_cwd $prompt_bang
 | 
			
		||||
    printf -v PROMPT2 $prompt_fmtn '%_' $prompt_bang
 | 
			
		||||
    printf -v PROMPT3 $prompt_fmtn '?#' $prompt_bang
 | 
			
		||||
    printf -v PROMPT4 $prompt_fmtn '+%N:%i' $prompt_bang
 | 
			
		||||
    zle reset-prompt
 | 
			
		||||
printf -v PROMPT $prompt_fmt $prompt_user $prompt_host $prompt_cwd ''
 | 
			
		||||
printf -v PROMPT2 $prompt_fmtn '%_'
 | 
			
		||||
printf -v PROMPT3 $prompt_fmtn '?#'
 | 
			
		||||
printf -v PROMPT4 $prompt_fmtn '+%N:%i'
 | 
			
		||||
 | 
			
		||||
precmd.is_git_repo() {
 | 
			
		||||
    read -r git_dir < <(git rev-parse --git-dir 2>/dev/null) || return 1
 | 
			
		||||
    [[ ! -e $git_dir/nozsh ]]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
zle -N zle-line-init
 | 
			
		||||
zle -N zle-keymap-select
 | 
			
		||||
precmd.git() {
 | 
			
		||||
    typeset raw_status
 | 
			
		||||
    raw_status=$(flock -n $prompt_state_file git --no-optional-locks status --porcelain -bu 2>/dev/null) || return 0
 | 
			
		||||
 | 
			
		||||
    typeset branch_status git_status IFS=
 | 
			
		||||
    typeset staged_count unstaged_count untracked_count unmerged_coun
 | 
			
		||||
    while read line; do
 | 
			
		||||
        if [[ $line[1,2] == '##' ]]; then
 | 
			
		||||
            branch_status=${line[4,-1]%%...*}
 | 
			
		||||
            [[ $line =~ behind    ]] && branch_status+=?
 | 
			
		||||
            [[ $line =~ ahead     ]] && branch_status+=!
 | 
			
		||||
        fi
 | 
			
		||||
        [[ $line[1,2] == '??'     ]] && (( untracked_count++ ))
 | 
			
		||||
        [[ $line[1,2] =~ .[MD]    ]] && (( unstaged_count++  ))
 | 
			
		||||
        [[ $line[1,2] =~ [MDARC]. ]] && (( staged_count++    ))
 | 
			
		||||
        [[ $line[1,2] =~ [ADU]{2} ]] && (( unmerged_count++  ))
 | 
			
		||||
    done <<< $raw_status
 | 
			
		||||
 | 
			
		||||
    (( unstaged_count  )) && git_status+=%F{yellow}~$unstaged_count
 | 
			
		||||
    (( staged_count    )) && git_status+=%F{blue}+$staged_count
 | 
			
		||||
    (( untracked_count )) && git_status+=%F{red}-$untracked_count
 | 
			
		||||
    (( unmerged_count  )) && git_status+=%F{cyan}*$unmerged_count
 | 
			
		||||
    [[ -z $git_status  ]] && git_status=%F{green}ok
 | 
			
		||||
 | 
			
		||||
    printf $prompt_git_fmt $branch_status $git_status > $prompt_state_file
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
precmd.prompt() {
 | 
			
		||||
    printf -v PROMPT $prompt_fmt $prompt_user $prompt_host $prompt_cwd $1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
precmd.git_update() {
 | 
			
		||||
    precmd.git
 | 
			
		||||
    kill -s USR1 $$
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
precmd() {
 | 
			
		||||
    if precmd.is_git_repo; then
 | 
			
		||||
        precmd.prompt $'\ue0a0 ... '
 | 
			
		||||
        precmd.git_update &!
 | 
			
		||||
    else
 | 
			
		||||
        precmd.prompt ''
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TRAPUSR1() {
 | 
			
		||||
    precmd.prompt "$(<$prompt_state_file)"
 | 
			
		||||
    zle && zle reset-prompt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TRAPEXIT() {
 | 
			
		||||
    [[ -f $prompt_state_file ]] && rm $prompt_state_file
 | 
			
		||||
}
 | 
			
		||||
# }}}
 | 
			
		||||
# {{{ aliases
 | 
			
		||||
beep()    { printf $'\007' }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue