# ceatinge prompt theme # based on adam2 prompt_ceatinge_help () { cat <<'EOF' This prompt is color-scheme-able. You can invoke it thus: prompt ceatinge [ 8bit ] [ [ [] []] where the colors are for the hyphens, current directory, user@host, and user input bits respectively. The default colors are cyan, green, cyan, and white. This theme works best with a dark background. If you have either UTF-8 or the `nexus' or `vga' console fonts or similar, you can specify the `8bit' option to use 8-bit replacements for the 7-bit characters. And you probably thought adam1 was overkill ... EOF } prompt_ceatinge_setup () { # Some can't be local local prompt_gfx_tlc prompt_gfx_mlc prompt_gfx_blc autoload zsh/terminfo if [[ $1 == '8bit' ]]; then shift if [[ ${LC_ALL:-${LC_CTYPE:-$LANG}} = *UTF-8* ]]; then prompt_gfx_tlc=$'\xe2\x94\x8c' prompt_gfx_mlc=$'\xe2\x94\x9c' prompt_gfx_blc=$'\xe2\x94\x94' prompt_gfx_hyphen=$'\xe2\x94\x80' else prompt_gfx_tlc=$'\xda' prompt_gfx_mlc=$'\xc3' prompt_gfx_blc=$'\xc0' prompt_gfx_hyphen=$'\xc4' fi else typeset -A altchar set -A altchar ${(s..)terminfo[acsc]} prompt_set_charset="%{$terminfo[enacs]%}" prompt_shift_in="%{$terminfo[smacs]%}" prompt_shift_out="%{$terminfo[rmacs]%}" tlc=${altchar[l]:-'.'} mlc=${altchar[x]:-'|'} blc=${altchar[m]:-'\`'} hyphen=${altchar[q]:-'-'} prompt_gfx_tlc="$prompt_shift_in$tlc$prompt_shift_out" prompt_gfx_mlc="$prompt_shift_in$mlc$prompt_shift_out" prompt_gfx_blc="$prompt_shift_in$blc$prompt_shift_out" prompt_gfx_hyphen="$prompt_shift_in$hyphen$prompt_shift_out" prompt_gfx_hyphen2="$hyphen" prompt_simple_hyphen='-' fi if [[ $1 == 'single' ]]; then shift prompt_single_line='true' else prompt_single_line='false' fi # Colour scheme prompt_ceatinge_color1=${1:-'cyan'} # hyphens prompt_ceatinge_color2=${2:-'green'} # current directory prompt_ceatinge_color3=${3:-'white'} # user prompt_ceatinge_color4=${4:-'white'} # user input prompt_ceatinge_color5=${5:-'yellow'} # host local prompt_gfx_bbox prompt_gfx_tbox="$prompt_set_charset%F{$prompt_ceatinge_color1}${prompt_gfx_tlc}%b%F{$prompt_ceatinge_color1}${prompt_gfx_hyphen}" prompt_gfx_bbox="%F{$prompt_ceatinge_color1}${prompt_gfx_blc}${prompt_gfx_hyphen}%b%F{$prompt_ceatinge_color1}" # This is a cute hack. Well I like it, anyway. prompt_gfx_bbox_to_mbox=$'%{\e[A\r'"%}%B%F{$prompt_ceatinge_color1}${prompt_gfx_mlc}%b%F{$prompt_ceatinge_color1}${prompt_gfx_hyphen}%{"$'\e[B%}' prompt_l_paren="%B%F{black}(" prompt_r_paren="%B%F{black})" prompt_user_host="%b%(!.%F{red}.%F{$prompt_ceatinge_color3})%n%F{$prompt_ceatinge_color4}@%b%F{$prompt_ceatinge_color5}%m" prompt_line_1a="$prompt_gfx_tbox$prompt_l_paren%b%F{$prompt_ceatinge_color2}%~$prompt_r_paren%b%F{$prompt_ceatinge_color1}" prompt_line_1b="$prompt_l_paren$prompt_user_host$prompt_r_paren%b%F{$prompt_ceatinge_color1}${prompt_gfx_hyphen}" prompt_line_2="$prompt_gfx_bbox${prompt_gfx_hyphen}%B%F{white}" prompt_char="%(!.#.%%)" prompt_opts=(cr subst percent) add-zsh-hook precmd prompt_ceatinge_precmd } prompt_ceatinge_precmd() { setopt noxtrace localoptions extendedglob local prompt_line_1 prompt_ceatinge_choose_prompt if [[ $prompt_single_line == 'true' ]]; then PS1="$prompt_user_host%B%F{white}$prompt_char %b%f%k" RPROMPT=":%F{$prompt_ceatinge_color2}%~" else PS1="$prompt_line_1$prompt_newline$prompt_line_2%B%F{white}$prompt_char %b%f%k" RPROMPT="" fi PS2="$prompt_line_2$prompt_gfx_bbox_to_mbox%B%F{white}%_> %b%f%k" PS3="$prompt_line_2$prompt_gfx_bbox_to_mbox%B%F{white}?# %b%f%k" zle_highlight[(r)default:*]="default:fg=$prompt_ceatinge_color4" } prompt_ceatinge_choose_prompt () { local prompt_line_1a_width=${#${(S%%)prompt_line_1a//(\%([KF1]|)\{*\}|\%[Bbkf])}} local prompt_line_1b_width=${#${(S%%)prompt_line_1b//(\%([KF1]|)\{*\}|\%[Bbkf])}} local prompt_padding_size=$(( COLUMNS - prompt_line_1a_width - prompt_line_1b_width )) # Try to fit in long path and user@host. if (( prompt_padding_size > 0 )); then local prompt_padding eval "prompt_padding=\${(l:${prompt_padding_size}::${prompt_gfx_hyphen2}:)_empty_zz}" prompt_line_1="$prompt_line_1a$prompt_shift_in$prompt_padding$prompt_shift_out$prompt_line_1b" return fi prompt_padding_size=$(( COLUMNS - prompt_line_1a_width )) # Didn't fit; try to fit in just long path. if (( prompt_padding_size > 0 )); then local prompt_padding eval "prompt_padding=\${(l:${prompt_padding_size}::${prompt_gfx_hyphen}:)_empty_zz}" prompt_line_1="$prompt_line_1a$prompt_padding" return fi # Still didn't fit; truncate local prompt_pwd_size=$(( COLUMNS - 5 )) prompt_line_1="$prompt_gfx_tbox$prompt_l_paren%B%F{$prompt_ceatinge_color2}%$prompt_pwd_size<...<%~%<<$prompt_r_paren%b%F{$prompt_ceatinge_color1}$prompt_gfx_hyphen" } prompt_ceatinge_setup "$@"