From 5c60ec46ec087e7e58c8fc00c6821060e8caecb8 Mon Sep 17 00:00:00 2001 From: Arseny Maslennikov Date: Fri, 19 Feb 2021 18:38:09 -0600 Subject: 47867: Fix RPROMPT typo in prompinit --- Functions/Prompts/promptinit | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Functions/Prompts/promptinit') diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit index e27b8779a..5e42ebdd3 100644 --- a/Functions/Prompts/promptinit +++ b/Functions/Prompts/promptinit @@ -49,7 +49,7 @@ prompt_preview_safely() { # 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 +h PROMPT=$PROMPT RPROMPT=$RPROMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR local -a precmd_functions preexec_functions prompt_preview_cleanup local -aLl +h zle_highlight @@ -101,7 +101,7 @@ Use prompt -h for help on specific themes.' if [[ -z "$prompt_theme[1]" ]]; then # Not using a prompt theme; save settings 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 +h PROMPT=$PROMPT RPROMPT=$RPROMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR local -a precmd_functions preexec_functions else trap 'prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' 0 -- cgit v1.2.3 From 8b67c36d929c2661a1f4e28ff137c7ddd53ec33d Mon Sep 17 00:00:00 2001 From: Arseny Maslennikov Date: Mon, 22 Feb 2021 20:29:55 -0800 Subject: 48094: apply cleanup commands of the current theme on any theme change * Rename zstyle `cleanup' on the context `:prompt-theme' to `restore' everywhere but in prompt_cleanup(). It is only used as a restore mechanism now. * Ensure prompt_cleanup() continues to store its command list in the `cleanup' style. * Clean up before theme switch at the end of set_prompt(). * Prepend every use of prompt_*_setup (which might modify the shell state in ways that require cleanup) with a cleanup run. * Adjust `prompt restore' to do both parts of the newly split restore mechanism, cleanup first. --- ChangeLog | 6 ++++ Functions/Prompts/prompt_restore_setup | 1 + Functions/Prompts/promptinit | 54 ++++++++++++++++++++++------------ 3 files changed, 42 insertions(+), 19 deletions(-) (limited to 'Functions/Prompts/promptinit') diff --git a/ChangeLog b/ChangeLog index cee131eda..7e96cfadf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2021-02-22 Bart Schaefer + + * 48094: Arseny Maslennikov: Functions/Prompts/prompt_restore_setup, + Functions/Prompts/promptinit: apply cleanup commands of the current + theme on any theme change, including "prompt -[hp] $theme" + 2021-02-19 dana * 47867: Arseny Maslennikov: Functions/Prompts/promptinit: Fix diff --git a/Functions/Prompts/prompt_restore_setup b/Functions/Prompts/prompt_restore_setup index 54c4adbf9..b77dbe815 100644 --- a/Functions/Prompts/prompt_restore_setup +++ b/Functions/Prompts/prompt_restore_setup @@ -1,2 +1,3 @@ # Damn that was easy zstyle -t :prompt-theme cleanup +zstyle -t :prompt-theme restore diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit index 5e42ebdd3..37d69f100 100644 --- a/Functions/Prompts/promptinit +++ b/Functions/Prompts/promptinit @@ -47,17 +47,19 @@ prompt_preview_safely() { return fi - # This handles all the stuff from the default :prompt-theme cleanup + # This handles all the stuff from the default :prompt-theme restore local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2 local +h PROMPT=$PROMPT RPROMPT=$RPROMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR - local -a precmd_functions preexec_functions prompt_preview_cleanup + local -a precmd_functions preexec_functions prompt_preview_restore local -aLl +h zle_highlight { # Save and clear current restore-point if any - zstyle -g prompt_preview_cleanup :prompt-theme cleanup + zstyle -g prompt_preview_restore :prompt-theme restore { - zstyle -d :prompt-theme cleanup + zstyle -d :prompt-theme restore + # Execute current cleanup sequence, if any. + zstyle -t :prompt-theme cleanup # The next line is a bit ugly. It (perhaps unnecessarily) # runs the prompt theme setup function to ensure that if @@ -74,8 +76,8 @@ prompt_preview_safely() { zstyle -t :prompt-theme cleanup } } always { - (( $#prompt_preview_cleanup )) && - zstyle -e :prompt-theme cleanup "${prompt_preview_cleanup[@]}" + (( $#prompt_preview_restore )) && + zstyle -e :prompt-theme restore "${prompt_preview_restore[@]}" } } @@ -103,9 +105,11 @@ Use prompt -h for help on specific themes.' local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2 local +h PROMPT=$PROMPT RPROMPT=$RPROMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR local -a precmd_functions preexec_functions + local theme_reset='' else - trap 'prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' 0 + local theme_reset='prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' fi + trap 'zstyle -t :prompt-theme cleanup;'"${theme_reset:+ $theme_reset}" 0 ;; esac case "$opt" in @@ -120,6 +124,7 @@ Use prompt -h for help on specific themes.' ;; h) if [[ -n "$2" && -n $prompt_themes[(r)$2] ]]; then if functions prompt_$2_setup >/dev/null; then + zstyle -t :prompt-theme cleanup # 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. @@ -179,28 +184,38 @@ Use prompt -h for help on specific themes.' typeset -ga zle_highlight=( ${zle_highlight:#default:*} ) (( ${#zle_highlight} )) || unset zle_highlight + zstyle -t :prompt-theme cleanup prompt_$1_setup "$@[2,-1]" && prompt_theme=( "$@" ) ;; esac } 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 )) + local -a cleanup_hooks theme_active + if ! zstyle -g cleanup_hooks :prompt-theme cleanup then - print -u2 "prompt_cleanup: no prompt theme active" - return 1 + (( $+prompt_preview_restore == 0 )) && + if ! zstyle -g theme_active :prompt-theme restore + then + print -u2 "prompt_cleanup: no prompt theme active" + return 1 + fi + + # Set the cleanup sequence up. + zstyle -e :prompt-theme cleanup \ + 'zstyle -d :prompt-theme cleanup;' \ + 'reply=(yes)' + zstyle -g cleanup_hooks :prompt-theme cleanup fi + + cleanup_hooks+=(';' "$@") + zstyle -e :prompt-theme cleanup "${cleanup_hooks[@]}" } prompt () { local -a prompt_opts theme_active - zstyle -g theme_active :prompt-theme cleanup || { + zstyle -g theme_active :prompt-theme restore || { # 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. @@ -210,8 +225,8 @@ prompt () { [[ -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;' \ + zstyle -e :prompt-theme restore \ + 'zstyle -d :prompt-theme restore;' \ 'prompt_default_setup;' \ ${PS1+PS1="${(q)PS1}"} \ ${PS2+PS2="${(q)PS2}"} \ @@ -239,7 +254,7 @@ prompt_preview_theme () { emulate -L zsh # Check for proper state handling - (( $+prompt_preview_cleanup )) || { + (( $+prompt_preview_restore )) || { prompt_preview_safely "$@" return } @@ -249,6 +264,7 @@ prompt_preview_theme () { print -n "$1 theme" (( $#* > 1 )) && print -n " with parameters \`$*[2,-1]'" print ":" + zstyle -t :prompt-theme cleanup prompt_${1}_setup "$@[2,-1]" (( ${#prompt_opts} )) && setopt noprompt{bang,cr,percent,sp,subst} "prompt${^prompt_opts[@]}" -- cgit v1.2.3 From 7383baf4cff9a1621b9b5517689a5653ae86e123 Mon Sep 17 00:00:00 2001 From: Marlon Richert Date: Sun, 16 May 2021 21:18:06 -0700 Subject: 48853: improved handling of theme resets when changing prompt themes, especially for theme preview --- ChangeLog | 4 ++ Doc/Zsh/contrib.yo | 10 +-- Functions/Prompts/promptinit | 165 +++++++++++++++++++------------------------ 3 files changed, 81 insertions(+), 98 deletions(-) (limited to 'Functions/Prompts/promptinit') diff --git a/ChangeLog b/ChangeLog index 7a50c3529..0eca118a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2021-05-16 Bart Schaefer + * Marlon Richert: 48853: Doc/Zsh/contrib.yo, + Functions/Prompts/promptinit: improved handling of theme resets + when changing prompt themes, especially for theme preview + * 48860: Etc/BUGS: remove mention of bugs that were fixed * 48857: Src/builtin.c, Src/exec.c, Src/loop.c, Src/makepro.awk, diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index b777703b3..a972f08d6 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -2041,10 +2041,12 @@ setopts (tt(promptbang), etc.) are turned on, all other prompt-related options are turned off. The tt(prompt_opts) array preserves setopts even beyond the scope of tt(localoptions), should your function need that. ) -item(Modify precmd and preexec)( -Use of tt(add-zsh-hook) is recommended. The tt(precmd) and tt(preexec) -hooks are automatically adjusted if the prompt theme changes or is -disabled. +item(Modify hooks)( +Use of tt(add-zsh-hook) and tt(add-zle-hook-widget) is recommended (see +ifzman(the bf(Manipulating Hook Functions) section above)\ +ifnzman(noderef(Manipulating Hook Functions))\ +). All hooks that follow the naming pattern tt(prompt_)var(theme)tt(_)var(hook) +are automatically removed when the prompt theme changes or is disabled. ) item(Declare cleanup)( If your function makes any other changes that should be undone when the diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit index 37d69f100..20503d78b 100644 --- a/Functions/Prompts/promptinit +++ b/Functions/Prompts/promptinit @@ -14,6 +14,8 @@ prompt_themes=() promptinit () { emulate -L zsh setopt extendedglob + autoload -Uz add-zsh-hook add-zle-hook-widget + local ppath='' name theme local -a match mbegin mend @@ -32,9 +34,6 @@ promptinit () { fi done - # To manipulate precmd and preexec hooks... - autoload -Uz add-zsh-hook - # Variables common to all prompt styles prompt_newline=$'\n%{\r%}' } @@ -47,38 +46,23 @@ prompt_preview_safely() { return fi - # This handles all the stuff from the default :prompt-theme restore - local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2 - local +h PROMPT=$PROMPT RPROMPT=$RPROMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR - local -a precmd_functions preexec_functions prompt_preview_restore - local -aLl +h zle_highlight + # Run this in a subshell, so we don't need to clean up afterwards. + ( + # Execute current theme's cleanup sequence, if any. + zstyle -t :prompt-theme cleanup - { - # Save and clear current restore-point if any - zstyle -g prompt_preview_restore :prompt-theme restore - { - zstyle -d :prompt-theme restore - # Execute current cleanup sequence, if any. - zstyle -t :prompt-theme cleanup - - # 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. + # If we can't find a _preview function, run the _setup function to see if + # it will create one. + typeset +f prompt_${1}_preview >&/dev/null || 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_restore )) && - zstyle -e :prompt-theme restore "${prompt_preview_restore[@]}" - } + # ...then try again. + if typeset +f prompt_${1}_preview >&/dev/null; then + prompt_${1}_preview "$@[2,-1]" + else + prompt_preview_theme "$@" + fi + ) } set_prompt() { @@ -97,21 +81,6 @@ Options: Use prompt -h 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 +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1 RPS2=$RPS2 - local +h PROMPT=$PROMPT RPROMPT=$RPROMPT RPROMPT2=$RPROMPT2 PSVAR=$PSVAR - local -a precmd_functions preexec_functions - local theme_reset='' - else - local theme_reset='prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' - fi - trap 'zstyle -t :prompt-theme cleanup;'"${theme_reset:+ $theme_reset}" 0 - ;; - esac case "$opt" in c) if [[ -n $prompt_theme ]]; then print -n "Current prompt theme" @@ -123,21 +92,26 @@ Use prompt -h for help on specific themes.' return ;; h) if [[ -n "$2" && -n $prompt_themes[(r)$2] ]]; then - if functions prompt_$2_setup >/dev/null; then + # Run this in a subshell, so we don't need to clean up afterwards. + ( + # Execute current theme's cleanup sequence, if any. zstyle -t :prompt-theme cleanup - # 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." + + # If we can't find a _help function, run the _setup function to see + # if it will create one. + typeset +f prompt_$2_help >/dev/null || + prompt_$2_setup + + # ...then try again. + if typeset +f 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 @@ -178,8 +152,13 @@ Use prompt -h for help on specific themes.' # Reset some commonly altered bits to the default local hook - for hook in chpwd precmd preexec periodic zshaddhistory zshexit; do - add-zsh-hook -D "${hook}" "prompt_*_${hook}" + for hook in chpwd precmd preexec periodic zshaddhistory zshexit \ + zsh_directory_name; do + add-zsh-hook -D "$hook" "prompt_*_$hook" + done + for hook in isearch-exit isearch-update line-pre-redraw line-init \ + line-finish history-line-set keymap-select; do + add-zle-hook-widget -D "$hook" "prompt_*_$hook" done typeset -ga zle_highlight=( ${zle_highlight:#default:*} ) (( ${#zle_highlight} )) || unset zle_highlight @@ -192,11 +171,8 @@ Use prompt -h for help on specific themes.' prompt_cleanup () { local -a cleanup_hooks theme_active - if ! zstyle -g cleanup_hooks :prompt-theme cleanup - then - (( $+prompt_preview_restore == 0 )) && - if ! zstyle -g theme_active :prompt-theme restore - then + if ! zstyle -g cleanup_hooks :prompt-theme cleanup; then + if ! zstyle -g theme_active :prompt-theme restore; then print -u2 "prompt_cleanup: no prompt theme active" return 1 fi @@ -225,22 +201,21 @@ prompt () { [[ -o promptpercent ]] && prompt_opts+=(percent) [[ -o promptsp ]] && prompt_opts+=(sp) [[ -o promptsubst ]] && prompt_opts+=(subst) - zstyle -e :prompt-theme restore \ - 'zstyle -d :prompt-theme restore;' \ - '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)' + zstyle -e :prompt-theme restore " + zstyle -d :prompt-theme restore + 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}} + prompt_opts=( $prompt_opts[*] ) + reply=( yes ) + " } set_prompt "$@" @@ -253,12 +228,6 @@ prompt () { prompt_preview_theme () { emulate -L zsh - # Check for proper state handling - (( $+prompt_preview_restore )) || { - prompt_preview_safely "$@" - return - } - # Minimal preview for prompts that don't supply one local -a prompt_opts print -n "$1 theme" @@ -268,12 +237,20 @@ prompt_preview_theme () { prompt_${1}_setup "$@[2,-1]" (( ${#prompt_opts} )) && setopt noprompt{bang,cr,percent,sp,subst} "prompt${^prompt_opts[@]}" + + [[ -n ${chpwd_functions[(r)prompt_${1}_chpwd]} ]] && + prompt_${1}_chpwd [[ -n ${precmd_functions[(r)prompt_${1}_precmd]} ]] && - prompt_${1}_precmd - [[ -o promptcr ]] && print -n $'\r'; : - print -P "${PS1}command arg1 arg2 ... argn" + prompt_${1}_precmd + + # We'd like to call zle-line-init/finish hooks, too, but that's not possible + # while the ZLE is not active. + + [[ -o promptcr ]] && print -n $'\r' + :; print -P -- "${PS1}command arg1 arg2 ... argn" + [[ -n ${preexec_functions[(r)prompt_${1}_preexec]} ]] && - prompt_${1}_preexec + prompt_${1}_preexec } [[ -o kshautoload ]] || promptinit "$@" -- cgit v1.2.3 From 28410bd5bc71fda6343b13c2b6abad06bd2eaaee Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Wed, 23 Feb 2022 19:45:43 +0100 Subject: promptinit: only exclude current theme from preview if no arguments are given --- ChangeLog | 5 +++++ Functions/Prompts/promptinit | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'Functions/Prompts/promptinit') diff --git a/ChangeLog b/ChangeLog index 35e8693ac..fd2b2bb34 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2022-03-08 Mikael Magnusson + + * 49773: Functions/Prompts/promptinit: promptinit: only exclude + current theme from preview if no arguments are given + 2022-03-06 Jun-ichi Takimoto * 49802 (+ 49804:Daniel): Test/W03jobparameters.ztst: pass diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit index 20503d78b..0c06699e8 100644 --- a/Functions/Prompts/promptinit +++ b/Functions/Prompts/promptinit @@ -73,7 +73,7 @@ set_prompt() { Options: -c Show currently selected theme and parameters -l List currently available prompt themes - -p [] Preview given themes (defaults to all) + -p [] Preview given themes (defaults to all except current theme) -h [] Display help (for given theme) -s Set and save theme Switch to new theme immediately (changes not saved) @@ -120,10 +120,9 @@ Use prompt -h for help on specific themes.' print $prompt_themes return ;; - p) preview=( $prompt_themes ) + p) preview=( ${prompt_themes:#$prompt_theme} ) (( $#* > 1 )) && preview=( "$@[2,-1]" ) for theme in $preview; do - [[ "$theme" == "$prompt_theme[*]" ]] && continue prompt_preview_safely "$=theme" done print -P "%b%f%k" -- cgit v1.2.3