setopt PROMPT_SUBST PS1="%2~ %B" PS1+='${(j::)psvar}' PS1+="%(1j.%j.)%b" PS1+='%U${vcs_info_msg_0_}%u' PS1+="%(?.. %S%?%s)" PS1+='%(1S. %B${SECONDS}%b.)' PS1+='%B%F{magenta}${_VIMODE}%f%b ' function zle-line-init zle-keymap-select { [[ ${KEYMAP} == vicmd ]] && _VIMODE="+" || _VIMODE="%#" [[ "$#_autoenv_stack_entered" -eq 0 ]] && psvar=(${psvar#A}) || { [[ -n "${psvar[(r)A]}" ]] || psvar=(A $psvar) } [[ -z "$VIRTUAL_ENV" ]] && psvar=(${psvar#V}) || { [[ -n "${psvar[(r)V]}" ]] || psvar=(V $psvar) } zle reset-prompt } zle -N zle-line-init zle -N zle-keymap-select preexec() { SECONDS=0 } precmd() { printf "\a\033]2;\033\\" vcs_info }