# Zsh prompt theme, needs Zsh >= 5.0.0. Asynchronous prompt if zsh-async is # detected function() # Keep local variables in here { # Make theme variables global for later use typeset -gA zsh_theme_colours zsh_theme_colours[prompt]="63" # violet zsh_theme_colours[vcs]="97" # dark pink zsh_theme_colours[highlight]="207" # bright pink zsh_theme_colours[minor]="60" # dark violet zsh_theme_colours[inactive]="236" # grey [[ -n "${SSH_CONNECTION}" ]] && zsh_theme_colours[prompt]="yellow" [[ $(id -u) -eq 0 ]] && zsh_theme_colours[prompt]="red" # Show username if it is not the default user local showuser="" if [[ "${USERNAME}" != "${DEFAULT_USER}" ]] && [[ -n "${USERNAME}" ]]; then showuser="%n " fi autoload -Uz vcs_info zstyle ':vcs_info:*' enable git svn hg # vcs_info_printsys zstyle ':vcs_info:*' formats "%F{${zsh_theme_colours[vcs]}}(%b)%u%c%f " zstyle ':vcs_info:*' actionformats "%F{${zsh_theme_colours[vcs]}}(%b|%F{${zsh_theme_colours[highlight]}}%a%F{${zsh_theme_colours[vcs]}})%u%c%f " zstyle ':vcs_info:*' stagedstr "%F{${zsh_theme_colours[highlight]}}●" zstyle ':vcs_info:*' unstagedstr "%F{${zsh_theme_colours[highlight]}}○" zstyle ':vcs_info:*' check-for-changes true # Needs mafredri/zsh-async, async_init must be called before using function async_vcs_prompt() { # From https://vincent.bernat.ch/en/blog/2019-zsh-async-vcs-info _my_vcs_async_start() { async_start_worker vcs_info async_register_callback vcs_info _my_vcs_info_done } _my_vcs_info() { cd -q $1 vcs_info print ${vcs_info_msg_0_} } _my_vcs_info_done() { local job=$1 local return_code=$2 local stdout=$3 local more=$6 if [[ $job == '[async]' ]]; then if [[ $return_code -eq 2 ]]; then # Need to restart the worker _my_vcs_async_start return fi fi vcs_info_msg_0_=$stdout (( $more )) || zle reset-prompt } _my_vcs_chpwd() { # Change colour of old value vcs_info_msg_0_="${vcs_info_msg_0_//\%F\{${zsh_theme_colours[vcs]}/%F{${zsh_theme_colours[inactive]}}" vcs_info_msg_0_="${vcs_info_msg_0_//\%F\{${zsh_theme_colours[highlight]}/%F{${zsh_theme_colours[inactive]}}" } _my_vcs_precmd() { async_flush_jobs vcs_info async_job vcs_info _my_vcs_info $PWD } _my_vcs_async_start add-zsh-hook precmd _my_vcs_precmd add-zsh-hook chpwd _my_vcs_chpwd } # Use asynchronous VCS prompt if zsh-async is installed and initialized if [[ ${ASYNC_INIT_DONE} -eq 1 ]]; then async_vcs_prompt else add-zsh-hook precmd vcs_info fi setopt prompt_subst PROMPT="%B%F{${zsh_theme_colours[prompt]}}${showuser}%b"'${vcs_info_msg_0_}'"%B%F{${zsh_theme_colours[prompt]}}%#%f%b " RPROMPT="%F{${zsh_theme_colours[minor]}}%(?..[%B%F{${zsh_theme_colours[highlight]}}%?%b%F{${zsh_theme_colours[minor]}}] )%4~%f" }