about summary refs log tree commit diff
path: root/Functions/Prompts/promptinit
blob: 157cb1e3842879892a0c3f7e34e324288ab44ef9 (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
127
128
129
130
131
# 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%}")
}

prompt () {
  local -A prompt_opts
  local opt

  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
  }

  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 "$@"