1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-25 17:20:25 +02:00

41472: introduce cleanup hooks default and restore special themes, and update documentation

This commit is contained in:
Barton E. Schaefer 2017-07-29 16:58:39 -07:00
parent 32ca9222af
commit 43e55a9bcd
6 changed files with 186 additions and 38 deletions

View file

@ -16,9 +16,13 @@ prompt_bart_help () {
blue, and the default foreground) are used if no arguments are
given. The defaults look best on a light background.
The "off" token temporarily disables the theme; "on" restores it.
No background colors or hardwired cursor motion escapes are used,
and it is not necessary to setopt promptsubst.
The "off" token temporarily disables the theme; "on" restores it.
Note, this does NOT fully reset to the original prompt state, it
only hides/reveals the extra lines above the command line and
removes the supporting hooks.
EOF
[[ $(read -sek 1 "?${(%):-%S[press return]%s}") == [Qq] ]] &&
print -nP '\r%E' && return
@ -183,7 +187,7 @@ prompt_bart_setup () {
add-zsh-hook -D preexec "prompt_*_preexec"
functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}"
[[ $prompt_theme[1] = bart ]] && PS1=${${(f)PS1}[-1]}
return 1
return 1 # Prevent change of $prompt_theme
;;
(on|enable)
shift
@ -224,6 +228,8 @@ prompt_bart_setup () {
add-zsh-hook precmd prompt_bart_precmd
add-zsh-hook preexec prompt_bart_preexec
prompt_cleanup \
'functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}"'
functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}
prompt_bart_winch"

View file

@ -0,0 +1,7 @@
PS1='%m%# '
PS2='%_> '
PS3='?# '
PS4='+%N:%i> '
unset RPS1 RPS2 RPROMPT RPROMPT2
prompt_opts=( cr percent sp )

View file

@ -1,9 +1,10 @@
# Very simple prompt
prompt_off_setup () {
PS1="%# "
PS2="> "
prompt_opts=( cr percent )
}
prompt_default_setup 2>/dev/null
prompt_off_setup "$@"
PS1="%# "
PS2="> "
PS3='?# '
PS4='+> '
prompt_opts=( cr percent sp )

View file

@ -0,0 +1,2 @@
# Damn that was easy
zstyle -t :prompt-theme cleanup

View file

@ -47,20 +47,36 @@ prompt_preview_safely() {
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
local -a precmd_functions preexec_functions
# This handles all the stuff from the default :prompt-theme cleanup
local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2
local +h PROMPT=$PROMPT RPROMPT=$RPOMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR
local -a precmd_functions preexec_functions prompt_preview_cleanup
local -aLl +h zle_highlight
# 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
{
# Save and clear current restore-point if any
zstyle -g prompt_preview_cleanup :prompt-theme cleanup
{
zstyle -d :prompt-theme cleanup
if typeset +f prompt_${1}_preview >&/dev/null; then
prompt_${1}_preview "$@[2,-1]"
else
prompt_preview_theme "$@"
fi
# 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
} always {
# Run any theme-specific cleanup, then reset restore point
zstyle -t :prompt-theme cleanup
}
} always {
(( $#prompt_preview_cleanup )) &&
zstyle -e :prompt-theme cleanup "${prompt_preview_cleanup[@]}"
}
}
set_prompt() {
@ -84,9 +100,9 @@ Use prompt -h <theme> for help on specific themes.'
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
local precmd_functions preexec_functions
local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2
local +h PROMPT=$PROMPT RPROMPT=$RPOMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR
local -a precmd_functions preexec_functions
else
trap 'prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' 0
fi
@ -104,11 +120,11 @@ Use prompt -h <theme> for help on specific themes.'
;;
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
# 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
@ -168,28 +184,74 @@ Use prompt -h <theme> for help on specific themes.'
esac
}
prompt () {
local prompt_opts
prompt_cleanup () {
local -a cleanup_hooks
if zstyle -g cleanup_hooks :prompt-theme cleanup
then
cleanup_hooks+=(';' "$@")
zstyle -e :prompt-theme cleanup "${cleanup_hooks[@]}"
elif (( $+prompt_preview_cleanup == 0 ))
then
print -u2 "prompt_cleanup: no prompt theme active"
return 1
fi
}
prompt () {
local -a prompt_opts theme_active
zstyle -g theme_active :prompt-theme cleanup || {
# This is done here rather than in set_prompt so that it
# is safe and sane for set_prompt to setopt localoptions,
# which will be cleared before we arrive back here again.
# This is also why we pass around the prompt_opts array.
[[ -o promptbang ]] && prompt_opts+=(bang)
[[ -o promptcr ]] && prompt_opts+=(cr)
[[ -o promptpercent ]] && prompt_opts+=(percent)
[[ -o promptsp ]] && prompt_opts+=(sp)
[[ -o promptsubst ]] && prompt_opts+=(subst)
zstyle -e :prompt-theme cleanup \
'zstyle -d :prompt-theme cleanup;' \
'prompt_default_setup;' \
${PS1+PS1="${(q)PS1}"} \
${PS2+PS2="${(q)PS2}"} \
${PS3+PS3="${(q)PS3}"} \
${PS4+PS4="${(q)PS4}"} \
${RPS1+RPS1="${(q)RPS1}"} \
${RPS2+RPS2="${(q)RPS2}"} \
${RPROMPT+RPROMPT="${(q)RPROMPT}"} \
${RPROMPT2+RPROMPT2="${(q)RPROMPT2}"} \
${PSVAR+PSVAR="${(q)PSVAR}"} \
"precmd_functions=(${(q)precmd_functions[@]})" \
"preexec_functions=(${(q)preexec_functions[@]})" \
"prompt_opts=( ${prompt_opts[*]} )" \
'reply=(yes)'
}
set_prompt "$@"
(( $#prompt_opts )) &&
setopt noprompt{bang,cr,percent,subst} "prompt${^prompt_opts[@]}"
(( ${#prompt_opts} )) &&
setopt noprompt{bang,cr,percent,sp,subst} "prompt${^prompt_opts[@]}"
true
}
prompt_preview_theme () {
emulate -L zsh
local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
local precmd_functions preexec_functions prompt_opts
local -aLl +h zle_highlight
# Check for proper state handling
(( $+prompt_preview_cleanup )) || {
prompt_preview_safely "$@"
return
}
# Minimal preview for prompts that don't supply one
local -a prompt_opts
print -n "$1 theme"
(( $#* > 1 )) && print -n " with parameters \`$*[2,-1]'"
print ":"
prompt_${1}_setup "$@[2,-1]"
(( ${#prompt_opts} )) &&
setopt noprompt{bang,cr,percent,sp,subst} "prompt${^prompt_opts[@]}"
[[ -n ${precmd_functions[(r)prompt_${1}_precmd]} ]] &&
prompt_${1}_precmd
[[ -o promptcr ]] && print -n $'\r'; :