RUN_VCS_INFO=
fi
-# Set the default prompt. The current host and working directory is displayed,
-# the exit code of the last command if it wasn't 0, the number of running jobs
-# if not 0.
+# Set the prompt. A two line prompt is used. On the top left the current
+# working directory is displayed, on the right vcs_info (if available). On the
+# bottom left current user name and host is shown, the exit code of the last
+# command if it wasn't 0, the number of running jobs if not 0.
#
# The prompt is in green and blue to make easily detectable, the error exit
# code in red and bold and the job count in yellow.
+#
+# Thanks to Adam's prompt for the basic idea of this prompt.
prompt_precmd() {
+ # Regex to remove elements which take no space. Used to calculate the
+ # width of the top prompt. Thanks to Bart's and Adam's prompt code in
+ # Functions/Prompts/prompt_*_setup.
+ local zero='%([BSUbfksu]|([FB]|){*})'
+
# Call vcs_info before every prompt.
if [[ -n $RUN_VCS_INFO ]]; then
vcs_info
+ else
+ vcs_info_msg_0_=
+ fi
- # Display the VCS information in the right prompt.
- if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ]]; then
- RPROMPT="${vcs_info_msg_0_}"
- # There is a bug in Zsh below 4.3.9 which displays a wrong symbol when
- # ${vcs_info_msg_0_} is empty. Provide a workaround for those
- # versions, thanks to Frank Terbeck <ft@bewatermyfriend.org> for it.
- else
- RPROMPT="${vcs_info_msg_0_:- }"
- fi
+ local width width_left width_right
+ local top_left top_right
+
+ # Display vcs_info (if used) on the right in the top prompt.
+ top_right="${vcs_info_msg_0_}"
+ width_right=${#${(S%%)top_right//$~zero/}}
+ # Remove vcs_info if it would get too long.
+ if [[ $(( COLUMNS - 4 - 1 - width_right )) -lt 0 ]]; then
+ top_right=
+ width_right=0
fi
- PROMPT="$green%B%m%b$default:$blue%B%~%b$default \
-%(1j.$yellow%j$default.)%# \
+ # Display current directory on the left in the top prompt. Truncate the
+ # directory if necessary.
+ width=$(( COLUMNS - 4 - 1 - width_right ))
+ top_left=".-$default%b($yellow%$width<..<%~%<<$default)%B$blue"
+
+ # Calculate the width of the top prompt to fill the middle with "-".
+ width_left=${#${(S%%)top_left//$~zero/}}
+ width_right=${#${(S%%)top_right//$~zero/}}
+ width=$(( COLUMNS - width_left - width_right ))
+
+ PROMPT="$blue%B$top_left${(l:$width::-:)}%b$default$top_right
+$blue%B'%b$default\
+$green%B%n%b$default@$green%B%m%b$default %(1j.$yellow%j$default.)%# \
%(?..($red%B%?%b$default%) )"
+
}
add-zsh-hook precmd prompt_precmd
# in the term/outer screen.
if [[ $program_name == @screen ]]; then
program_name="@:${$(hostname)//.*/}"
+ # Use "@:!hostname" for root screens.
+ elif [[ $program_name == @!screen ]]; then
+ program_name="@:!${$(hostname)//.*/}"
fi
fi
# Add the preexec() and precmd() hooks.
add-zsh-hook preexec window_preexec
add-zsh-hook precmd window_precmd
+else
+ # Fallback if another TERM is used, necessary to run screen (see below in
+ # "RUN COMMANDS").
+ window_preexec() { }
fi
# complete to the same and change it.
zstyle ':completion:*:(mv|cp):*' ignore-line no
+# Provide a fallback completer which always completes files. Useful when Zsh's
+# completion is too "smart". Thanks to Frank Terbeck <ft@bewatermyfriend.org>
+# (http://www.zsh.org/mla/users/2009/msg01038.html).
+zle -C complete-files complete-word _generic
+zstyle ':completion:complete-files:*' completer _files
+bindkey '^F' complete-files
+
# CUSTOM ALIASES AND FUNCTIONS
return $1
}
-# Colorize stderr. Very useful when looking for errors. Thanks to
+# Colorize stderr in red. Very useful when looking for errors. Thanks to
# http://gentoo-wiki.com/wiki/Zsh for the basic script and Mikachu in #zsh on
# Freenode (2010-03-07 04:03) for some improvements (-r, printf). It's not yet
# perfect and doesn't work with su and git for example, but it can handle most
-# interactive output quite well (even with no trailing new line) and in those
-# cases the E alias can be used as workaround.
+# interactive output quite well (even with no trailing new line) and in cases
+# it doesn't work, the E alias can be used as workaround.
exec 2>>(while read -r -k -u 0 line; do
printf '\e[91m%s\e[0m' "$line";
print -n $'\0';