From 3723ba3d0a5cf2d5788b56954d1447d88fa02f8e Mon Sep 17 00:00:00 2001 From: Von Random Date: Sat, 13 Aug 2022 04:35:11 +0300 Subject: [PATCH] zsh: bring git status back --- zshrc | 88 ++++++++++++++++++++++++++++++++++++++----------- zshrc_gitprompt | 67 ------------------------------------- 2 files changed, 68 insertions(+), 87 deletions(-) delete mode 100644 zshrc_gitprompt diff --git a/zshrc b/zshrc index ddb1e31..4d24771 100644 --- a/zshrc +++ b/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' } diff --git a/zshrc_gitprompt b/zshrc_gitprompt deleted file mode 100644 index ff49a61..0000000 --- a/zshrc_gitprompt +++ /dev/null @@ -1,67 +0,0 @@ - -prompt_fmt='%%k%%f[ %s %s:%s %s]\n> ' -prompt_fmtn='%%k%%f[ %%{\e[2;3m%s\e[0m%%} ]> ' -prompt_user='%F{%(!.red.blue)}%n%f' -prompt_host='%m' -prompt_cwd='%F{green}%d%f' -prompt_git_fmt='\ue0a0 %s %s%%f ' -prompt_state_file=/tmp/zsh_gitstatus_$$.tmp - -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 ]] -} -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=0 unstaged_count=0 untracked_count=0 unmerged_count=0 - - 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 -}