view .shell.d/99.prompt.zsh @ 380:0ceb8554801e

zsh: make vcs info in prompt async Roughly cribbed from [0], but I'm hoping to rework this soon to use the zsh async library that shouldn't require a tempfile. 0: http://www.anishathalye.com/2015/02/07/an-asynchronous-shell-prompt/
author Augie Fackler <raf@durin42.com>
date Thu, 10 Mar 2016 18:56:28 -0500
parents 02b635053e8f
children 491cd0cedeee
line wrap: on
line source

# Magic prompt with colors
# username in blue if not root
# username in red if root - time in pink w/
# DANGER replacing the date
# failed jobs print exit status in the RPS1 with yellow text
setopt prompt_subst

preexec () {
        currJob="`echo $3 | cut -d ' ' -f 1 | head -n 1`"
        if [[ "$TERM" == "screen" ]]; then
                hostUser="%10<...<%~%<<"
                print -Pn "\ek[$hostUser $currJob]\e\\"
        else
                if [[ "$FANCYTYPE" == "YES" ]]; then
                        hostUser="%n@%m: %2~"
                        print -Pn "\e]0;$hostUser [$currJob]\a"
                fi
        fi
}

PROMPT_TMP="${HOME}/.augie-zsh-tmp-prompt"

function right_side_prompt() {
    branch=`vcs_current_branch`
    if [ $? = 0 ] ; then
        echo -n $branch > "$PROMPT_TMP"
        kill -s USR1 $$
    fi
}

function TRAPUSR1() {
    rps_branch=$(cat "$PROMPT_TMP")
    zle && zle reset-prompt
}

function precmd () {
    rps_branch="$(date '+%D %H:%M')"
    right_side_prompt &!
}

if [ "x`whoami`" = "xroot" ] ; then
        PS1=$'%{\e];%n@%m: %2~ [zsh]\a%}[%m:%3~] %{\e[31m%}%n%{\e[0m%}%# '
        if [[ "$TERM" == "screen" ]] ; then
                PS1=$'%{\ek[%2~ zsh]\e\\%}[%m:%3~] %{\e[31m%}%n%{\e[0m%}%# '
        fi
        RPS1=$'%{\e[1;35m%}[DANGER %t]%{\e[0m%}%(?..%{\e[1;33m%} %?%{\e[1;0m%})'
else
        PS1=$'%{\e];%n@%m: %2~ [zsh]\a%}[%m:%3~] %{\e[34m%}%n%{\e[0m%}%# '
        if [[ "$TERM" == "screen" ]]; then
                PS1=$'%{\ek[%2~ zsh]\e\\%}[%m:%3~] %{\e[34m%}%n%{\e[0m%}%# '
        fi
    RPS1=$'[$rps_branch]%(?..%{\e[1;33m%} %?%{\e[0m%})'
fi


export FANCYTYPE="NO"

for ok in rxvt rxvt-unicode xterm xterm-256color xterm-color screen ; do
    if [ "$TERM" = "$ok" ] ; then
        export FANCYTYPE="YES"
    fi
done

if [ $FANCYTYPE = "NO" ] ; then
    prompt='[%m:%3~] %n%# '
    RPS1=$'[%W %t]'
fi

if [[ $TERM == "dumb" ]]; then  # in emacs
    # for tramp to not hang, need the following. cf:
    # http://www.emacswiki.org/emacs/TrampMode
    unsetopt zle
    unsetopt prompt_cr
    unsetopt prompt_subst
    unfunction precmd
    unfunction preexec
fi


#nonfancy no-frills prompt - disabled (same as the "non-fancy" one above)
#prompt='[%m:%3~] %n%# '
#RPS1=$'[%W %t]'