+ # Setup. Create variables holding the formatted content.
+
+ # Current directory in yellow, truncated if necessary (WIDTH is replaced
+ # below).
+ local directory="${yellow}%WIDTH<..<%~%<<${default}"
+ # Minimal information about the VCS, only displayed if there are
+ # unstaged/staged changes.
+ local vcs_staged=${vcs_info_msg_1_}
+
+ # Information about the VCS in this directory.
+ local vcs=${vcs_info_msg_0_}
+ # Current time (seconds since epoch) in Hex in bright blue.
+ local seconds="${blue}%B0x$(([##16] EPOCHSECONDS))%b${default}"
+
+ # User name (%n) in bright green.
+ local user="${green}%B%n%b${default}"
+ # Host name (%m) in bright green; underlined if running on a remote system
+ # through SSH.
+ local host="${green}%B%m%b${default}"
+ if [[ -n $SSH_CONNECTION ]]; then
+ host="%U${host}%u"
+ fi
+
+ # Number of background processes in yellow if not zero.
+ local background="%(1j.${yellow}%j${default}.)"
+ # Exit code in bright red in parentheses if not zero.
+ local exitcode="%(?..(${red}%B%?%b${default}%) )"
+ # Prompt symbol, % for normal users, # in red for root.
+ local symbol="%(!.${red}#${default}.%%)"
+
+ # Prefix characters in first and second line.
+ local top_prefix="${blue}%B.-%b${default}"
+ local bottom_prefix="${blue}%B'%b${default}"
+
+ # Combine them to create the prompt.
+
+ local top_left=${vcs_staged}
+ local top_right="${vcs}(${seconds})"
+
+ local width_top_prefix=${#${(S%%)top_prefix//$~zero/}}
+ local width_top_left=${#${(S%%)top_left//$~zero/}}
+ local width_top_right=${#${(S%%)top_right//$~zero/}}
+
+ # Calculate the maximum width of ${top_left}. -2 are the braces of
+ # ${top_left}, -1 is one separator from ${top_separator} (we want at least
+ # one between left and right parts).
+ local top_left_width_max=$((
+ COLUMNS - $width_top_prefix
+ - $width_top_left - 2
+ - 1
+ - $width_top_right
+ ))
+ # Truncate directory if necessary.
+ top_left="(${directory/WIDTH/${top_left_width_max}})${top_left}"
+ width_top_left=${#${(S%%)top_left//$~zero/}}
+
+ # Calculate the width of the top prompt to fill the middle with "-".
+ local width=$((
+ COLUMNS - width_top_prefix - width_top_left - width_top_right
+ ))
+ local top_separator="%B${blue}${(l:${width}::-:)}%b${default}"
+
+ PROMPT="${top_prefix}${top_left}${top_separator}${top_right}
+${bottom_prefix}${user}@${host} ${background}${symbol} ${exitcode}"
+}
+precmd_functions+=(zshrc_prompt_precmd)
+
+
+# When GNU screen, tmux, xterm or rxvt is used set the name of the window to
+# the currently running program.
+#
+# When a program is started preexec() sets the window's name to it; when it
+# stops precmd() resets the window's name to 'zsh'. 'fg' is supported and sets
+# the window's name to the resumed job.
+#
+# It works with GNU screen, tmux, xterm and rxvt.
+#
+# If a command is run with sudo or if the shell is running as root then a ! is
+# added at the beginning of the command to make this clear. If a command is
+# running on a different computer with ssh a @ is added at the beginning. If
+# screen/tmux is running on the remote machine instead of @screen @:hostname
+# (or @tmux ..; hostname replaced by the machine's hostname) is displayed.
+# This only works if the .zshrc on the server also uses this command.
+#
+# screen* is necessary as `screen` uses screen.linux for example for a linux
+# console.
+if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then
+ # Is set to a non empty value to reset the window name in the next
+ # precmd() call.
+ zshrc_window_reset=yes
+
+ zshrc_window_preexec() {