about summary refs log tree commit diff
path: root/Functions/Prompts/promptinit
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/Prompts/promptinit')
-rw-r--r--Functions/Prompts/promptinit98
1 files changed, 74 insertions, 24 deletions
diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit
index c249412cf..2786f9ac7 100644
--- a/Functions/Prompts/promptinit
+++ b/Functions/Prompts/promptinit
@@ -1,6 +1,10 @@
-# zsh prompt themes extension
-#
-# Load with `autoload -U promptinit; promptinit'.
+##
+## zsh prompt themes extension
+## by Adam Spiers <adam@spiers.net>
+##
+## Load with `autoload -U promptinit; promptinit'.
+## Type `prompt -h' for help.
+##
 
 prompt_themes=()
 typeset -gU prompt_themes
@@ -19,10 +23,10 @@ promptinit () {
         prompt_themes=($name $prompt_themes)
         autoload -U prompt_${name}_setup
       else
-        print "Couldn't find theme $theme" 
+        print "Couldn't read file $theme containing theme $name."
       fi
     else
-      print "eh?"
+      print "Eh?  Mismatch between glob patterns in promptinit."
     fi
   done
 
@@ -31,7 +35,7 @@ promptinit () {
   colors
 
   # Variables common to all prompt styles
-  prompt_newline=$(echo -ne "\n%{\r%}")
+  prompt_newline=$'\n%{\r%}'
 }
 
 set_prompt() {
@@ -40,21 +44,35 @@ set_prompt() {
 
   usage='Usage: prompt <options>
 Options:
+    -c              Show currently selected theme and parameters
     -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)'
+    <theme>         Switch to new theme immediately (changes not saved)
 
-  getopts "hlps" opt
+Use prompt -h <theme> for help on specific themes.'
+
+  getopts "chlps" opt
   case "$opt" in
+    c) if (( $+prompt_theme )); then
+         print -n "Current prompt theme"
+         (( $#prompt_theme > 1 )) && print -n " with parameters"
+         print " is:\n  $prompt_theme"
+       else
+         print "Current prompt is not a theme."
+       fi
+       return
+       ;;
     h) if [[ -n "$2" && -n $prompt_themes[(r)$2] ]]; then
          if functions prompt_$2_help >/dev/null; then
-	   print "Help for $2 theme:\n"
+           print "Help for $2 theme:\n"
            prompt_$2_help
          else
-           print "No help available for $2 theme"
+           print "No help available for $2 theme."
          fi
+         print "\nType \`prompt -p $2' to preview the theme, \`prompt $2'"
+         print "to try it out, and \`prompt -s $2' to use it in future sessions."
        else
          print "$usage"
        fi
@@ -65,22 +83,33 @@ Options:
        ;;
     p) if (( ! $+prompt_theme )); then
          print "Cannot preview; current prompt is non-themeable and would"
-	 print "be destroyed."
-	 return
+         print "be destroyed."
+         return
        fi
        preview=( $prompt_themes )
-       [[ -n "$2" && -n $prompt_themes[(r)$2] ]] && preview=( $*[2,-1] )
+       (( $#* > 1 )) && 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"
+         theme_args=( "$=theme" )
+         [[ "$theme" == "$prompt_theme[*]" ]] && continue
+         if [[ -z "$prompt_themes[(r)$theme_args[1]]" ]]; then
+           print "\nUnknown theme: $theme_args[1]"
+           continue
+         fi
+         print
+
+	 # The next line is a bit ugly.  It (perhaps unnecessarily)
+	 # runs the prompt theme setup function to ensure that if
+	 # the theme has a _preview function that it's been autoloaded.
+	 prompt_${theme_args[1]}_setup
+
+         if functions prompt_${theme_args[1]}_preview >&/dev/null; then
+           prompt_${theme_args[1]}_preview "${(@)theme_args[2,-1]}"
+         else
+           prompt_preview_theme "${(@)theme_args}"
+         fi
        done
        print
-       prompt_${prompt_theme}_setup
+       prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"
        ;;
     s) print "Set and save not yet implemented.  Please ensure your ~/.zshrc"
        print "contains something similar to the following:\n"
@@ -88,12 +117,22 @@ Options:
        print "  promptinit"
        print "  prompt $*[2,-1]"
        ;;
-    *) if [[ -z "$1" || -z $prompt_themes[(r)$1] ]]; then
+    *) if [[ "$1" == 'random' ]]; then
+	 local random_themes
+	 if (( $#* == 1 )); then
+	   random_themes=( $prompt_themes )
+	 else
+	   random_themes=( "$@[2,-1]" )
+	 fi
+         local i=$(( ( $RANDOM % $#random_themes ) + 1 ))
+         argv=( "${=random_themes[$i]}" )
+       fi
+       if [[ -z "$1" || -z $prompt_themes[(r)$1] ]]; then
          print "$usage"
          return
        fi
-       prompt_$1_setup $*[2,-1]
-       prompt_theme=( $* )
+       prompt_$1_setup "$@[2,-1]"
+       prompt_theme=( "$@" )
 
        # Avoid screwing up the environment listing
        PSZZZZ=$reset_color
@@ -114,4 +153,15 @@ prompt () {
       setopt noprompt{bang,cr,percent,subst} prompt${^prompt_opts[@]}
 }
 
+prompt_preview_theme () {
+  print -n "$1 theme"
+  (( $#* > 1 )) && print -n " with parameters \`$*[2,-1]'"
+  print ":"
+  prompt_${1}_setup "$@[2,-1]"
+  precmd
+  print -n -P "${PS1}"
+  preexec
+  print "command arg1 arg2 ... argn"
+}
+
 promptinit "$@"