Browse Source

feat(gallois): big rewrite to `gallois` theme (#11867)

Felipe Gallois 8 months ago
parent
commit
76e541a3fe
1 changed files with 126 additions and 10 deletions
  1. 126 10
      themes/gallois.zsh-theme

+ 126 - 10
themes/gallois.zsh-theme

@@ -1,24 +1,140 @@
 # Depends on the git plugin for work_in_progress()
 (( $+functions[work_in_progress] )) || work_in_progress() {}
 
-ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[green]%}["
-ZSH_THEME_GIT_PROMPT_SUFFIX="]%{$reset_color%}"
-ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[cyan]%}[%{$fg[green]%}"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$fg[cyan]%}]"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}"
 ZSH_THEME_GIT_PROMPT_CLEAN=""
 
 # Customized git status, oh-my-zsh currently does not allow render dirty status before branch
 git_custom_status() {
   local branch=$(git_current_branch)
   [[ -n "$branch" ]] || return 0
-  echo "$(parse_git_dirty)\
-%{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\
-${ZSH_THEME_GIT_PROMPT_PREFIX}${branch}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
+  print "%{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\
+${ZSH_THEME_GIT_PROMPT_PREFIX}$(parse_git_dirty)${branch}\
+${ZSH_THEME_GIT_PROMPT_SUFFIX}"
+}
+autoload -U colors && colors
+
+#export VCS_PROMPT=hg_prompt_info
+export VCS_PROMPT=git_custom_status
+
+base_prompt="%{$fg[cyan]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b "
+custom_prompt=""
+last_run_time=""
+last_vcs_info=""
+
+
+function pipestatus_parse {
+  PIPESTATUS="$pipestatus"
+  ERROR=0
+  for i in "${(z)PIPESTATUS}"; do
+      if [[ "$i" -ne 0 ]]; then
+          ERROR=1
+      fi
+  done
+
+  if [[ "$ERROR" -ne 0 ]]; then
+      print "[%{$fg[red]%}$PIPESTATUS%{$fg[cyan]%}]"
+  fi
 }
 
-# RVM component of prompt
-ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg[red]%}["
-ZSH_THEME_RUBY_PROMPT_SUFFIX="]%{$reset_color%}"
 
 # Combine it all into a final right-side prompt
-RPS1="\$(git_custom_status)\$(ruby_prompt_info)${RPS1:+ $RPS1}"
 PROMPT='%{$fg[cyan]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b '
+function preexec() {
+    last_run_time=$(perl -MTime::HiRes=time -e 'printf "%.9f\n", time')
+}
+
+function duration() {
+    local duration
+    local now=$(perl -MTime::HiRes=time -e 'printf "%.9f\n", time')
+    local last=$1
+    local last_split=("${(@s/./)last}")
+    local now_split=("${(@s/./)now}")
+    local T=$((now_split[1] - last_split[1]))
+    local D=$((T/60/60/24))
+    local H=$((T/60/60%24))
+    local M=$((T/60%60))
+    local S=$((T%60))
+    local s=$(((now_split[2] - last_split[2]) / 1000000000.))
+    local m=$(((now_split[2] - last_split[2]) / 1000000.))
+
+    (( $D > 0 )) && duration+="${D}d"
+    (( $H > 0 )) && duration+="${H}h"
+    (( $M > 0 )) && duration+="${M}m"
+
+    if [[ $S -le 0 ]]; then
+        printf "%ims" "$m"
+    else
+        if ! [[ -z $duration ]] && printf "%s" "$duration"
+        local sec_milli=$((S + s))
+        printf "%.3fs" "$sec_milli"
+    fi
+}
+
+function precmd() {
+    RETVAL=$(pipestatus_parse)
+    local info=""
+
+    if [ ! -z "$last_run_time" ]; then
+        local elapsed=$(duration $last_run_time)
+        last_run_time=$(print $last_run_time | tr -d ".")
+        if [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 120 * 1000 * 1000 * 1000 )) ]; then
+            local elapsed_color="%{$fg[magenta]%}"
+        elif [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 60 * 1000 * 1000 * 1000 )) ]; then
+            local elapsed_color="%{$fg[red]%}"
+        elif [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 10 * 1000 * 1000 * 1000 )) ]; then
+            local elapsed_color="%{$fg[yellow]%}"
+        else
+            local elapsed_color="%{$fg[green]%}"
+        fi
+        info=$(printf "%s%s%s%s%s" "%{$fg[cyan]%}[" "$elapsed_color" "$elapsed" "%{$fg[cyan]%}]" "$RETVAL")
+        unset last_run_time
+    fi
+
+    if [ -z "$info" -a ! -z "$last_vcs_info" ]; then
+        custom_prompt="$last_vcs_info$base_prompt"
+        return;
+    fi
+
+    if (( ${+VCS_PROMPT} )); then
+        last_vcs_info=$($VCS_PROMPT)
+        if [ ! -z "$last_vcs_info" ]; then
+            [ -z "$info" ] && info=$last_vcs_info || info="$info$last_vcs_info"
+        fi
+    fi
+
+    [ -z "$info" ] && custom_prompt="$base_prompt" || custom_prompt="$info$base_prompt"
+}
+
+function hg_prompt_info() {
+    unset output info parts branch_parts branch
+
+    local output=""
+    if ! output="$(hg status 2> /dev/null)"; then
+        return
+    fi
+
+    local info=$(hg log -l1 --template '{author}:{node|short}:{remotenames}:{phabdiff}')
+    local parts=(${(@s/:/)info})
+    local branch_parts=(${(@s,/,)parts[3]})
+    local branch=${branch_parts[-1]}
+    [ ! -z "${parts[3]}" ] && [[ "${parts[1]}" =~ "$USER@" ]] && branch=${parts[3]}
+    [ -z "${parts[3]}" ] && branch=${parts[2]}
+
+    if [[ ! -z "$output" ]]; then
+        local color="%{$fg[red]%}"
+    elif [[ "${branch}" == "master" || "${branch}" == "warm" ]]; then
+        local color="%{$fg[yellow]%}"
+    else
+        local color="%{$fg[green]%}"
+    fi
+
+    print "%{$fg[cyan]%}[${color}${branch}%{$fg[cyan]%}]"
+}
+
+setopt PROMPT_SUBST
+PROMPT='$custom_prompt'
+
+