about summary refs log tree commit diff
path: root/Functions/Prompts/prompt_adam2_setup
blob: 9aa4f75cf3746938bdfa39af14419335549def1e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# adam2 prompt theme

prompt_adam2_help () {
  cat <<'EOF'
This prompt is color-theme-able.  You can invoke it thus:

  prompt adam2 [ plain ] <color1> <color2> <color3>

where the colors are for the hyphens, current directory, and user@host
bits respectively.

And you probably thought adam1 was overkill.  If you've ever seen a
more complex prompt in your whole life, please e-mail it to me at
<adam@spiers.net>; I'd love to know that I'm not the saddest person
on the planet.
EOF
}

prompt_adam2_setup () {
  # Some can't be local
  local prompt_gfx_tlc prompt_gfx_mlc prompt_gfx_blc prompt_gfx_bbox 

  if [[ $1 == 'plain' ]]; then
    shift
    prompt_gfx_tlc='.'
    prompt_gfx_mlc='|'
    prompt_gfx_blc='\`'
    prompt_gfx_hyphen='-'
  else
    prompt_gfx_tlc=$(echo "\xda")
    prompt_gfx_mlc=$(echo "\xc3")
    prompt_gfx_blc=$(echo "\xc0")
    prompt_gfx_hyphen=$(echo "\xc4")
  fi

  # Colour scheme
  prompt_scheme_color1=${1:-'cyan'}    # hyphens
  prompt_scheme_color2=${2:-'green'}   # current directory
  prompt_scheme_color3=${3:-'cyan'}    # user@host

  local num
  for num in 1 2 3; do
    # Grok this!
    eval "prompt_color$num="'${(P)$(echo "fg_no_bold_$prompt_scheme_color'"$num\")}"
    eval "prompt_bold_color$num="'${(P)$(echo "fg_bold_$prompt_scheme_color'"$num\")}"
  done

  prompt_gfx_tbox=$(echo "%{$prompt_bold_color1%}${prompt_gfx_tlc}%{$prompt_color1%}${prompt_gfx_hyphen}")
  prompt_gfx_bbox=$(echo "%{$prompt_bold_color1%}${prompt_gfx_blc}${prompt_gfx_hyphen}%{$prompt_color1%}")

  # This is a cute hack.  Well I like it, anyway.
  prompt_gfx_bbox_to_mbox=$(echo "%{\e[A\r$prompt_bold_color1${prompt_gfx_mlc}$prompt_color1${prompt_gfx_hyphen}\e[B%}")

  prompt_l_paren=$(echo "%{$fg_bold_grey%}(")
  prompt_r_paren=$(echo "%{$fg_bold_grey%})")

  prompt_l_bracket=$(echo "%{$fg_bold_grey%}[")
  prompt_r_bracket=$(echo "%{$fg_bold_grey%}]")

  prompt_machine=$(echo "%{$prompt_color3%}%n%{$prompt_bold_color3%}@%{$prompt_color3%}%m")

  prompt_padding_text=`perl -e "print qq{${prompt_gfx_hyphen}} x 200"`

  prompt_line_1a="$prompt_gfx_tbox$prompt_l_paren%{$prompt_bold_color2%}%~$prompt_r_paren%{$prompt_color1%}"
  prompt_line_1a_no_color=$(echo "$prompt_line_1a" | perl -pe "s/%{.*?%}//g")
  prompt_line_1b=$(echo "$prompt_l_paren$prompt_machine$prompt_r_paren%{$prompt_color1%}${prompt_gfx_hyphen}")
  prompt_line_1b_no_color=$(echo "$prompt_line_1b" | perl -pe "s/%{.*?%}//g")

  prompt_line_2="$prompt_gfx_bbox${prompt_gfx_hyphen}%{$fg_bold_white%}"

  prompt_char="%(!.#.>)"

  precmd () { prompt_adam2_precmd; setopt promptsubst }
  preexec () { prompt_adam2_preexec }
}

prompt_adam2_precmd () {
  setopt noxtrace localoptions
  local prompt_line_1a_no_color_expanded prompt_line_2a_no_color_expanded
  local prompt_padding_size prompt_padding prompt_line_1 pre_prompt
  local prompt_pwd_size

  prompt_line_1a_no_color_expanded=$(print -P "$prompt_line_1a_no_color")
  prompt_line_1b_no_color_expanded=$(print -P "$prompt_line_1b_no_color")
  prompt_padding_size=$(( $COLUMNS
                            - $#prompt_line_1a_no_color_expanded 
                            - $#prompt_line_1b_no_color_expanded ))

  if [[ $prompt_padding_size -ge 0 ]]; then
    prompt_padding=$(printf "%$prompt_padding_size.${prompt_padding_size}s" "$prompt_padding_text")
    prompt_line_1="$prompt_line_1a$prompt_padding$prompt_line_1b"
  else
    prompt_padding_size=$(( $COLUMNS
                              - $#prompt_line_1a_no_color_expanded ))

    if [[ $prompt_padding_size -ge 0 ]]; then
      prompt_padding=$(printf "%$prompt_padding_size.${prompt_padding_size}s" "$prompt_padding_text")
      prompt_line_1="$prompt_line_1a$prompt_padding"
    else
      prompt_pwd_size=$(( $COLUMNS - 5 ))
      prompt_line_1="$prompt_gfx_tbox$prompt_l_paren%{$prompt_bold_color2%}%$prompt_pwd_size<...<%~%<<$prompt_r_paren%{$prompt_color1$prompt_gfx_hyphen%}"
    fi
  fi

  pre_prompt="$prompt_line_1$prompt_newline$prompt_line_2"

  PS1="$pre_prompt%{$fg_bold_white%}$prompt_char "
  PS2="$prompt_line_2%{$prompt_gfx_bbox_to_mbox$fg_bold_white%}%_> "
  PS3="$prompt_line_2%{$prompt_gfx_bbox_to_mbox$fg_bold_white%}?# "
}

prompt_adam2_preexec () {
  print -n "$fg_no_bold_white"
}

prompt_adam2_setup "$@"