diff options
Diffstat (limited to 'home/.oh-my-zsh/themes/gallois.zsh-theme')
| -rw-r--r-- | home/.oh-my-zsh/themes/gallois.zsh-theme | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/home/.oh-my-zsh/themes/gallois.zsh-theme b/home/.oh-my-zsh/themes/gallois.zsh-theme new file mode 100644 index 0000000..3fc3490 --- /dev/null +++ b/home/.oh-my-zsh/themes/gallois.zsh-theme @@ -0,0 +1,140 @@ +# Depends on the git plugin for work_in_progress() +(( $+functions[work_in_progress] )) || work_in_progress() {} + +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 + 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 +} + + +# Combine it all into a final right-side prompt +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' + + |
