From 2b38534405640d440bb77777dac965514dfa792e Mon Sep 17 00:00:00 2001 From: Jan Katins Date: Mon, 25 Apr 2022 16:14:29 +0200 Subject: [PATCH] fix: Don't escape exclamation marks in hook keys Exclamation marks (per default) get escaped in interactive mode, but not in non-interactive modes. In this case it meant that zinit would not find any hooks which implements the ices when running in non-interactive mode (e.g. in a script). This in turn would NOT result in errors but would just silently not execute any of the ices which of course would be a bad thing(tm). https://github.com/zdharma-continuum/zinit/issues/199 has the details... Closes: #199 --- doc/zsdoc/zinit.zsh.adoc | 4 +++- zinit-autoload.zsh | 18 +++++++++--------- zinit-install.zsh | 36 ++++++++++++++++++------------------ zinit.zsh | 16 ++++++++++------ 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/doc/zsdoc/zinit.zsh.adoc b/doc/zsdoc/zinit.zsh.adoc index 769943570..5b7fb7742 100644 --- a/doc/zsdoc/zinit.zsh.adoc +++ b/doc/zsdoc/zinit.zsh.adoc @@ -1169,7 +1169,9 @@ ____ Registers the z-annex inside Zinit – i.e. an Zinit extension ____ -Has 4 line(s). Doesn't call other functions. +Has 6 line(s). Doesn't call other functions. + +Uses feature(s): _setopt_ Called by: diff --git a/zinit-autoload.zsh b/zinit-autoload.zsh index 3330ff284..294529f04 100644 --- a/zinit-autoload.zsh +++ b/zinit-autoload.zsh @@ -1566,9 +1566,9 @@ ZINIT[EXTENDED_GLOB]="" # Run annexes' atpull hooks (the before atpull-ice ones). # The gh-r / GitHub releases block. reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-pre <->]} - ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-pre <->]} + ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) @@ -1655,9 +1655,9 @@ ZINIT[EXTENDED_GLOB]="" # Run annexes' atpull hooks (the before atpull-ice ones). # The regular Git-plugins block. reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-pre <->]} - ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-pre <->]} + ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) @@ -1702,9 +1702,9 @@ ZINIT[EXTENDED_GLOB]="" # Run annexes' atpull hooks (the before atpull[^!]…-ice ones). # Block common for Git and gh-r plugins. reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\\\!atpull-pre <->]} - ${${ICE[atpull]:#\!*}:+${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\\\!atpull-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\!atpull-pre <->]} + ${${ICE[atpull]:#\!*}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\!atpull-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) diff --git a/zinit-install.zsh b/zinit-install.zsh index 31bf680ae..d6196036a 100644 --- a/zinit-install.zsh +++ b/zinit-install.zsh @@ -448,9 +448,9 @@ builtin source "${ZINIT[BIN_DIR]}/zinit-side.zsh" || { # Store ices at clone of a plugin .zinit-store-ices "$local_path/._zinit" ICE "" "" "" "" reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:\\\!atclone-pre <->]} - ${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atclone-<-> <->]} - ${(on)ZINIT_EXTS2[(I)zinit hook:\\\!atclone-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:\!atclone-pre <->]} + ${(on)ZINIT_EXTS[(I)z-annex hook:\!atclone-<-> <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:\!atclone-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) @@ -995,9 +995,9 @@ builtin source "${ZINIT[BIN_DIR]}/zinit-side.zsh" || { # Run annexes' atpull hooks (the before atpull-ice ones). # The SVN block. reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-pre <->]} - ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-pre <->]} + ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) @@ -1089,9 +1089,9 @@ builtin source "${ZINIT[BIN_DIR]}/zinit-side.zsh" || { # The URL-snippet block. if [[ $update = -u && $ZINIT[annex-multi-flag:pull-active] -ge 1 ]] { reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-pre <->]} - ${${ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-pre <->]} + ${${ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) @@ -1149,9 +1149,9 @@ builtin source "${ZINIT[BIN_DIR]}/zinit-side.zsh" || { # The local-file snippets block. if [[ $update = -u ]] { reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-pre <->]} - ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:e-\\\!atpull-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-pre <->]} + ${${(M)ICE[atpull]#\!}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:e-\!atpull-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) @@ -1225,9 +1225,9 @@ builtin source "${ZINIT[BIN_DIR]}/zinit-side.zsh" || { # Run annexes' atpull hooks (the before atpull-ice ones). # The block is common to all 3 snippet types. reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\\\!atpull-pre <->]} - ${${ICE[atpull]:#\!*}:+${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atpull-<-> <->]}} - ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\\\!atpull-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\!atpull-pre <->]} + ${${ICE[atpull]:#\!*}:+${(on)ZINIT_EXTS[(I)z-annex hook:\!atpull-<-> <->]}} + ${(on)ZINIT_EXTS2[(I)zinit hook:no-e-\!atpull-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) @@ -1242,9 +1242,9 @@ builtin source "${ZINIT[BIN_DIR]}/zinit-side.zsh" || { # Run annexes' atclone hooks (the before atclone-ice ones) # The block is common to all 3 snippet types. reply=( - ${(on)ZINIT_EXTS2[(I)zinit hook:\\\!atclone-pre <->]} - ${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atclone-<-> <->]} - ${(on)ZINIT_EXTS2[(I)zinit hook:\\\!atclone-post <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:\!atclone-pre <->]} + ${(on)ZINIT_EXTS[(I)z-annex hook:\!atclone-<-> <->]} + ${(on)ZINIT_EXTS2[(I)zinit hook:\!atclone-post <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]:-$ZINIT_EXTS2[$key]}[@]}" ) diff --git a/zinit.zsh b/zinit.zsh index ae051e808..da84900c7 100644 --- a/zinit.zsh +++ b/zinit.zsh @@ -1174,6 +1174,10 @@ builtin setopt noaliases # FUNCTION: @zinit-register-hook. [[[ # Registers the z-annex inside Zinit – i.e. an Zinit extension @zinit-register-hook() { + emulate -LR zsh + # nobanghist to disable adding backslash escaping to "!", which is used in a lot of hocks and behaves differently + # in interactive sessions (escapes !) and non-interactive ones (does not) + builtin setopt extendedglob warncreateglobal typesetsilent noshortloops nobanghist local name="$1" type="$2" handler="$3" icemods="$4" key="zinit ${(q)2}" ZINIT_EXTS2[seqno]=$(( ${ZINIT_EXTS2[seqno]:-0} + 1 )) ZINIT_EXTS2[$key${${(M)type#hook:}:+ ${ZINIT_EXTS2[seqno]}}]="${ZINIT_EXTS2[seqno]} z-annex-data: ${(q)name} ${(q)type} ${(q)handler} '' ${(q)icemods}" @@ -1381,7 +1385,7 @@ builtin setopt noaliases ZINIT[CUR_USPL2]="$id_as" ZINIT_REPORTS[$id_as]= - reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atinit-<-> <->]} ) + reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\!atinit-<-> <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]}[@]}" ) "${arr[5]}" snippet "$save_url" "$id_as" "$local_dir/$dirname" \!atinit || \ @@ -1443,7 +1447,7 @@ builtin setopt noaliases [[ -n ${ICE[multisrc]} ]] && { local ___oldcd="$PWD"; () { setopt localoptions noautopushd; builtin cd -q "$local_dir/$dirname"; }; eval "reply=(${ICE[multisrc]})"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; local fname; for fname in "${reply[@]}"; do ZERO="${${(M)fname:#/*}:-$local_dir/$dirname/$fname}"; (( ${+ICE[silent]} )) && { { [[ -n $precm ]] && { builtin ${precm[@]} 'source "$ZERO"'; ((1)); } || { ((1)); builtin source "$ZERO"; }; } 2>/dev/null 1>&2; (( retval += $? )); ((1)); } || { ((1)); { [[ -n $precm ]] && { builtin ${precm[@]} 'source "$ZERO"'; ((1)); } || { ((1)); builtin source "$ZERO"; }; }; (( retval += $? )); }; done; } # Run the atload hooks right before atload ice. - reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atload-<-> <->]} ) + reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\!atload-<-> <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]}[@]}" ) "${arr[5]}" snippet "$save_url" "$id_as" "$local_dir/$dirname" \!atload @@ -1497,7 +1501,7 @@ builtin setopt noaliases [[ -n ${ICE[multisrc]} ]] && { local ___oldcd="$PWD"; () { setopt localoptions noautopushd; builtin cd -q "$local_dir/$dirname"; }; eval "reply=(${ICE[multisrc]})"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; local fname; for fname in "${reply[@]}"; do ZERO="${${(M)fname:#/*}:-$local_dir/$dirname/$fname}"; (( ${+ICE[silent]} )) && { { [[ -n $precm ]] && { builtin ${precm[@]} 'source "$ZERO"'; ((1)); } || { ((1)); builtin source "$ZERO"; }; } 2>/dev/null 1>&2; (( retval += $? )); ((1)); } || { ((1)); { [[ -n $precm ]] && { builtin ${precm[@]} 'source "$ZERO"'; ((1)); } || { ((1)); builtin source "$ZERO"; }; }; (( retval += $? )); }; done; } # Run the atload hooks right before atload ice. - reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atload-<-> <->]} ) + reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\!atload-<-> <->]} ) for key in "${reply[@]}"; do arr=( "${(Q)${(z@)ZINIT_EXTS[$key]}[@]}" ) "${arr[5]}" snippet "$save_url" "$id_as" "$local_dir/$dirname" \!atload @@ -1614,7 +1618,7 @@ builtin setopt noaliases .zinit-setup-params && local ${(Q)reply[@]} } - reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atinit-<-> <->]} ) + reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\!atinit-<-> <->]} ) for ___key in "${reply[@]}"; do ___arr=( "${(Q)${(z@)ZINIT_EXTS[$___key]}[@]}" ) "${___arr[5]}" plugin "$___user" "$___plugin" "$___id_as" "${${${(M)___user:#%}:+$___plugin}:-${ZINIT[PLUGINS_DIR]}/${___id_as//\//---}}" \!atinit || \ @@ -1715,7 +1719,7 @@ builtin setopt noaliases [[ -n ${ICE[multisrc]} ]] && { local ___oldcd="$PWD"; () { setopt localoptions noautopushd; builtin cd -q "$___pdir_orig"; }; eval "reply=(${ICE[multisrc]})"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; local ___fname; for ___fname in "${reply[@]}"; do ZERO="${${(M)___fname:#/*}:-$___pdir_orig/$___fname}"; (( ${+ICE[silent]} )) && { { [[ -n $___precm ]] && { builtin ${___precm[@]} 'source "$ZERO"'; ((1)); } || { ((1)); $___builtin source "$ZERO"; }; } 2>/dev/null 1>&2; (( ___retval += $? )); ((1)); } || { ((1)); { [[ -n $___precm ]] && { builtin ${___precm[@]} 'source "$ZERO"'; ((1)); } || { ((1)); $___builtin source "$ZERO"; }; }; (( ___retval += $? )); }; done; } # Run the atload hooks right before atload ice. - reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atload-<-> <->]} ) + reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\!atload-<-> <->]} ) for ___key in "${reply[@]}"; do ___arr=( "${(Q)${(z@)ZINIT_EXTS[$___key]}[@]}" ) "${___arr[5]}" plugin "$___user" "$___plugin" "$___id_as" "$___pdir_orig" \!atload @@ -1766,7 +1770,7 @@ builtin setopt noaliases [[ -n ${ICE[multisrc]} ]] && { local ___oldcd="$PWD"; () { setopt localoptions noautopushd; builtin cd -q "$___pdir_orig"; }; eval "reply=(${ICE[multisrc]})"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; for ___fname in "${reply[@]}"; do ZERO="${${(M)___fname:#/*}:-$___pdir_orig/$___fname}"; (( ${+ICE[silent]} )) && { { [[ -n $___precm ]] && { builtin ${___precm[@]} 'source "$ZERO"'; ((1)); } || { ((1)); $___builtin source "$ZERO"; }; } 2>/dev/null 1>&2; (( ___retval += $? )); ((1)); } || { { [[ -n $___precm ]] && { builtin ${___precm[@]} 'source "$ZERO"'; ((1)); } || { ((1)); $___builtin source "$ZERO"; }; }; (( ___retval += $? )); } done; } # Run the atload hooks right before atload ice. - reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\\\!atload-<-> <->]} ) + reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:\!atload-<-> <->]} ) for ___key in "${reply[@]}"; do ___arr=( "${(Q)${(z@)ZINIT_EXTS[$___key]}[@]}" ) "${___arr[5]}" plugin "$___user" "$___plugin" "$___id_as" "$___pdir_orig" \!atload