1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-10-02 00:41:44 +02:00
zsh/Functions/Prompts/promptinit

193 lines
5.4 KiB
Plaintext

##
## 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
typeset -g prompt_theme >/dev/null
promptinit () {
emulate -L zsh
setopt extendedglob
local ppath='' name theme
# 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=($prompt_themes $name)
autoload -U prompt_${name}_setup
else
print "Couldn't read file $theme containing theme $name."
fi
else
print "Eh? Mismatch between glob patterns in promptinit."
fi
done
# Color definitions come in handy
autoload -U colors
colors
# Variables common to all prompt styles
prompt_newline=$'\n%{\r%}'
}
prompt_preview_safely() {
print $reset_color
if [[ -z "$prompt_themes[(r)$1]" ]]; then
print "Unknown theme: $1"
return
fi
local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
trap "${$(functions precmd):-:} ; ${$(functions preexec):-:}" 0
# 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_${1}_setup
if typeset +f prompt_${1}_preview >&/dev/null; then
prompt_${1}_preview "$@[2,-1]"
else
prompt_preview_theme "$@"
fi
}
set_prompt() {
emulate -L zsh
local opt preview theme usage old_theme
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)
Use prompt -h <theme> for help on specific themes.'
getopts "chlps:" opt
case "$opt" in
(h|p)
setopt localtraps
if [[ -z "$prompt_theme[1]" ]]; then
# Not using a prompt theme; save settings
local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
trap "${$(functions precmd):-:} ; ${$(functions preexec):-:}" 0
else
trap 'prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' 0
fi
;;
esac
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_setup >/dev/null; then
# The next line is a bit ugly. It (perhaps unnecessarily)
# runs the prompt theme setup function to ensure that if
# the theme has a _help function that it's been autoloaded.
prompt_$2_setup
fi
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
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
;;
l) print Currently available prompt themes:
print $prompt_themes
return
;;
p) preview=( $prompt_themes )
(( $#* > 1 )) && preview=( "$@[2,-1]" )
for theme in $preview; do
[[ "$theme" == "$prompt_theme[*]" ]] && continue
prompt_preview_safely "$=theme"
done
print $reset_color
;;
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]"
shift
;&
*) 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=( "$@" )
# Avoid screwing up the environment listing
PSZZZZ=$reset_color
RPSZZZZ=$reset_color
PROMPTZZZZ=$reset_color
RPROMPTZZZZ=$reset_color
promptzzzz=$reset_color
;;
esac
}
prompt () {
local prompt_opts
set_prompt "$@"
(( $#prompt_opts )) &&
setopt noprompt{bang,cr,percent,subst} prompt${^prompt_opts[@]}
true
}
prompt_preview_theme () {
local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
trap "${$(functions precmd):-:} ; ${$(functions preexec):-:}" 0
print -n "$1 theme"
(( $#* > 1 )) && print -n " with parameters \`$*[2,-1]'"
print ":"
prompt_${1}_setup "$@[2,-1]"
precmd
print -P "${PS1}command arg1 arg2 ... argn"
preexec
}
[[ -o kshautoload ]] || promptinit "$@"