about summary refs log tree commit diff
path: root/Functions/Prompts/promptinit
blob: 285b9e4d99ced4e8ca9c823d3095f7346458a97f (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
117
118
119
120
121
122
123
124
125
126
# zsh prompt themes extension
#
# Load with `autoload -U promptinit; promptinit'.

prompt_themes=()
typeset -gU prompt_themes
typeset -g prompt_theme

promptinit () {
  emulate -L zsh
  setopt extendedglob
  local ppath='' name

  # Autoload all prompt_*_setup functions in fpath
  for theme in $^fpath/prompt_*_setup(N); do
    if [[ $theme == */prompt_(#b)(*)_setup ]]; then
      name="$match[1]"
      if [[ -r "$theme" ]]; then
        prompt_themes=($name $prompt_themes)
        autoload -U prompt_${name}_setup
      else
        print "Couldn't find theme $theme" 
      fi
    else
      print "eh?"
    fi
  done

  # Color definitions come in handy
  autoload -U colors
  colors

  # Variables common to all prompt styles
  prompt_newline=$(echo -ne "\n%{\r%}")
}

set_prompt() {
  emulate -L zsh
  local opt preview theme usage old_theme

  usage='Usage: prompt <options>
Options:
    -l              List currently available prompt themes
    -p [<themes>]   Preview given themes (defaults to all)
    -h [<theme>]    Display help (for given theme)
    -s <theme>      Set and save theme
    <theme>         Switch to new theme immediately (changes not saved)'

  getopts "hlps" opt
  case "$opt" in
    h) if [[ -n "$2" && -n $prompt_themes[(r)$2] ]]; then
         if functions prompt_$2_help >/dev/null; then
	   print "Help for $2 theme:\n"
           prompt_$2_help
         else
           print "No help available for $2 theme"
         fi
       else
         print "$usage"
       fi
       ;;
    l) print Currently available prompt themes:
       print $prompt_themes
       return
       ;;
    p) if (( ! $+prompt_theme )); then
         print "Cannot preview; current prompt is non-themeable and would"
	 print "be destroyed."
	 return
       fi
       preview=( $prompt_themes )
       [[ -n "$2" && -n $prompt_themes[(r)$2] ]] && preview=( $*[2,-1] )
       for theme in $preview; do
         [[ $theme == $prompt_theme[1] ]] && continue
         print "\nTheme: $theme"
         prompt_${theme}_setup
	 precmd
	 print -n -P "${PS1}"
	 preexec
	 print "command arg1 arg2 ... argn"
       done
       print
       prompt_${prompt_theme}_setup
       ;;
    s) print "Set and save not yet implemented.  Please ensure your ~/.zshrc"
       print "contains something similar to the following:\n"
       print "  autoload -U promptinit"
       print "  promptinit"
       print "  prompt $*[2,-1]"
       ;;
    *) if [[ -z "$1" || -z $prompt_themes[(r)$1] ]]; then
         print "$usage"
         return
       fi
       prompt_$1_setup $*[2,-1]
       prompt_theme=( $* )

       # Avoid screwing up the environment listing
       PSZZZZ=$reset_color
       RPSZZZZ=$reset_color
       PROMPTZZZZ=$reset_color
       RPROMPTZZZZ=$reset_color
       promptzzzz=$reset_color
       ;;
  esac
}

prompt () {
  local -A prompt_opts
  local opt

  set_prompt "$@"

  # Set prompt options
  for opt in ${(k)prompt_opts}; do
    if [[ $prompt_opts[$opt] != (|un)set ]]; then
      echo "${0##*/}: value of prompt option must be 'set' or 'unset'" >&2
      return 1
    else
      $prompt_opts[$opt]opt prompt$opt
    fi
  done
}

promptinit "$@"