I am trying to edit the zsh agnoster theme into something I personally find slightly more visually appealing and familiar (I'm trying to make something that somewhat resembles my previous bash prompt.)However, it's too slow at the moment; I'd prefer the prompt to be rendering nigh-instantaneously and at the moment there's a visible delay that distracts from my workflow.Does anyone have any tips on how I can speed up what's been written so far (disclaimer: most of this isn't my code):### Segment drawing# A few utility functions to make it easy and re-usable to draw segmented promptsCURRENT_BG='NONE'CURRENT_FG='NONE'# Special Powerline characters() {  local LC_ALL= LC_CTYPE=en_US.UTF-8  # NOTE: This segment separator character is correct.  In 2012, Powerline changed  # the code points they use for their special characters. This is the new code point.  # If this is not working for you, you probably have an old version of the  # Powerline-patched fonts installed. Download and install the new version.  # Do not submit PRs to change this unless you have reviewed the Powerline code point  # history and have new information.  # This is defined using a Unicode escape sequence so it is unambiguously readable, regardless of  # what font the user is viewing this source code in. Do not replace the  # escape sequence with a single literal character.  # Do not change this! Do not make it '\u2b80'; that is the old, wrong code point.  SEGMENT_SEPARATOR=$'\ue0b0'}# Begin a segment# Takes two arguments, background and foreground. Both can be omitted,# rendering default background/foreground.prompt_segment() {  local bg fg  [[ -n $1 ]] && bg=%K{$1} || bg=%k  [[ -n $2 ]] && fg=%F{$2} || fg=%f  if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then    echo -n  %{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%}   else    echo -n %{$bg%}%{$fg%}   fi  CURRENT_BG=$1  CURRENT_FG=$2  [[ -n ${@:3} ]] && echo -n ${@:3}}# End the prompt, closing any open segmentsprompt_end() {  if [[ -n $CURRENT_FG ]]; then    echo -n %{%k%F{$CURRENT_FG}%}\$  else    echo -n %{%k%}  fi  echo -n %{%f%}  CURRENT_BG=''  CURRENT_FG=''}### Prompt components# Each component will draw itself, and hide itself if no information needs to be shown# Context: user@hostname (who am I and where am I)prompt_context() {  if [[ $USER != $DEFAULT_USER || -n $SSH_CLIENT ]]; then    prompt_segment black default %(!.%{%F{yellow}%}.)$USER@%m  fi}# Git: branch/detached head, dirty statusprompt_git() {  (( $+commands[git] )) || return  local PL_BRANCH_CHAR  () {    local LC_ALL= LC_CTYPE=en_US.UTF-8    PL_BRANCH_CHAR=$'\ue0a0'         #   }  local ref dirty mode repo_path  repo_path=$(git rev-parse --git-dir 2>/dev/null)  if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then    dirty=$(parse_git_dirty)    ref=$(git symbolic-ref HEAD 2> /dev/null) || ref= $(git rev-parse --short HEAD 2> /dev/null)    if [[ -n $dirty ]]; then      prompt_segment default yellow    else      prompt_segment default green    fi    if [[ -e ${repo_path}/BISECT_LOG ]]; then      mode= <B>    elif [[ -e ${repo_path}/MERGE_HEAD ]]; then      mode= >M<    elif [[ -e ${repo_path}/rebase || -e ${repo_path}/rebase-apply || -e ${repo_path}/rebase-merge || -e ${repo_path}/../.dotest ]]; then      mode= >R>    fi    setopt promptsubst    autoload -Uz vcs_info    zstyle ':vcs_info:*' enable git    zstyle ':vcs_info:*' get-revision true    zstyle ':vcs_info:*' check-for-changes true    zstyle ':vcs_info:*' stagedstr ''    zstyle ':vcs_info:*' unstagedstr '*'    zstyle ':vcs_info:*' formats '%u%c'    zstyle ':vcs_info:*' actionformats '%u%c'    vcs_info    echo -n ${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode}  fi}# Dir: current working directoryprompt_dir() {  prompt_segment default cyan $(echo -n ${PWD/#$HOME/~} | awk -F '/' '{ if (length($0) > 14) { if (NF > 4) print $1 / $2 /.../ $(NF-1) / $NF; else if (NF > 3) print $1 / $2 /.../ $NF; else if (NF > 2) print $1 /.../ $NF; else print $0;} else print $0;}')}# Virtualenv: current working virtualenvprompt_virtualenv() {  local virtualenv_path=$VIRTUAL_ENV  if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then    prompt_segment blue black (`basename $virtualenv_path`)  fi}# Status:# - was there an error# - am I root# - are there background jobs?prompt_status() {  local symbols  symbols=()  ( [[ $(jobs -l | wc -l) -gt 0 ]] || [[ $(ts -l | grep -E '[[:blank:]]+running[[:blank:]]+') !=  ]] ) && symbols+=  [[ -n $symbols ]] && prompt_segment blue black $symbols}## Main promptbuild_prompt() {  RETVAL=$?  prompt_status  prompt_virtualenv  prompt_context  prompt_dir  prompt_git  prompt_end}PROMPT='%{%f%b%k%}$(build_prompt) 'Also, as someone extremely new to programming, let alone in shell script, I'd really appreciate any tips you have for me.
My zsh theme is too slow
performance;shell;zsh