From 712cac1952fb4d35861082748068ae33c757f125 Mon Sep 17 00:00:00 2001 From: Vladislav Doster Date: Wed, 26 Aug 2026 22:48:01 -0500 Subject: [PATCH] fix(ices): restore $OLDPWD around plugin directory hooks Every ice that runs code inside a plugin or snippet directory (atinit, atload, multisrc, atclone, atpull, ps-on-unload) saved and restored $PWD around the temporary cd, but never $OLDPWD. `cd -q' suppresses chpwd hooks and `noautopushd' suppresses the directory stack, but neither suppresses $OLDPWD, so the cd back left it pointing at the directory just visited. Opening a new shell and pressing `cd -' jumped into a zinit plugin directory without the user ever having gone there. Add .zinit-cd-quiet/.zinit-restore-dir, which return to the original $PWD by cd'ing through the original $OLDPWD for real. A plain $OLDPWD assignment is not enough: `cd -' reads zsh's internal previous-directory state, not the parameter, so assigning it leaves the parameter looking correct while `cd -' still navigates to the plugin directory. When the original $OLDPWD is empty or has since been deleted, bounce through $PWD instead, which degrades `cd -' to a harmless no-op rather than emitting an error and leaking the plugin directory anyway. Also gate the restore on the cd having actually happened. It ran unconditionally, so with the nocd ice -- where no cd takes place -- the no-op cd back to $PWD still set OLDPWD=$PWD, silently discarding the user's real previous directory. Sites already protected by a real subshell, and the user-facing `zinit cd' and `zinit create' commands that are meant to leave you in the target directory, are left untouched. Signed-off-by: Vladislav Doster --- zinit-autoload.zsh | 6 ++--- zinit-install.zsh | 30 ++++++++++--------------- zinit.zsh | 55 ++++++++++++++++++++++++++++++++-------------- 3 files changed, 54 insertions(+), 37 deletions(-) diff --git a/zinit-autoload.zsh b/zinit-autoload.zsh index a770cb38..ee3893f4 100644 --- a/zinit-autoload.zsh +++ b/zinit-autoload.zsh @@ -2503,10 +2503,10 @@ print -- "\nAvailable ice-modifiers:\n\n${ice_order[*]}" if [[ -n ${sice[ps-on-unload]} ]]; then (( quiet )) || builtin print -r "Running plugin's provided unload code: ${ZINIT[col-info]}${sice[ps-on-unload][1,50]}${sice[ps-on-unload][51]:+…}${ZINIT[col-rst]}" - local ___oldcd="$PWD" - () { setopt localoptions noautopushd; builtin cd -q "$___dir"; } + local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD" + .zinit-cd-quiet "$___dir" eval "${sice[ps-on-unload]}" - () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; } + .zinit-restore-dir "$___oldcd" "$___oldoldpwd" fi # 1. Delete done bindkeys diff --git a/zinit-install.zsh b/zinit-install.zsh index 5299a2f8..435428ef 100644 --- a/zinit-install.zsh +++ b/zinit-install.zsh @@ -2258,19 +2258,15 @@ __zinit-cmake-base-hook () { local rc=0 [[ -n $atclone ]] && .zinit-countdown atclone && { - local ___oldcd=$PWD + local ___oldcd=$PWD ___oldoldpwd=$OLDPWD + integer ___moved=0 - (( ${+ICE[nocd]} == 0 )) && { - () { - setopt localoptions noautopushd - builtin cd -q "$dir" - } - } + (( ${+ICE[nocd]} == 0 )) && .zinit-cd-quiet "$dir" && ___moved=1 eval "$atclone" rc="$?" - () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; } + (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd" } return "$rc" @@ -2389,13 +2385,12 @@ __zinit-cmake-base-hook () { local rc=0 .zinit-countdown atpull && { - local ___oldcd=$PWD - (( ${+ICE[nocd]} == 0 )) && { - () { setopt localoptions noautopushd; builtin cd -q "$dir"; } - } + local ___oldcd=$PWD ___oldoldpwd=$OLDPWD + integer ___moved=0 + (( ${+ICE[nocd]} == 0 )) && .zinit-cd-quiet "$dir" && ___moved=1 .zinit-at-eval "$atpull" "$ICE[atclone]" rc="$?" - () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; + (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd" } return "$rc" @@ -2415,13 +2410,12 @@ __zinit-cmake-base-hook () { local rc=0 .zinit-countdown atpull && { - local ___oldcd=$PWD - (( ${+ICE[nocd]} == 0 )) && { - () { setopt localoptions noautopushd; builtin cd -q "$dir"; } - } + local ___oldcd=$PWD ___oldoldpwd=$OLDPWD + integer ___moved=0 + (( ${+ICE[nocd]} == 0 )) && .zinit-cd-quiet "$dir" && ___moved=1 .zinit-at-eval "$atpull" $ICE[atclone] rc="$?" - () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; + (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd" } return "$rc" diff --git a/zinit.zsh b/zinit.zsh index c6b5dfce..180cdd8d 100644 --- a/zinit.zsh +++ b/zinit.zsh @@ -1017,6 +1017,29 @@ builtin setopt noaliases { : ${(P)2::="$(stat -c %Y "$1")"}; } 2>/dev/null } } # ]]] +# FUNCTION: .zinit-cd-quiet [[[ +# Changes directory without running chpwd hooks or touching the directory stack. +# +# $1 - directory to change into +.zinit-cd-quiet() { + () { setopt localoptions noautopushd; builtin cd -q "$1"; } "$1" +} # ]]] +# FUNCTION: .zinit-restore-dir [[[ +# Returns to $1 without leaving the visited directory as the `cd -' target. +# +# The directory `cd -' goes to is tracked internally by zsh and is only updated +# by a real cd/pushd/popd, never by assigning to $OLDPWD. The only way to make +# `cd -' forget the directory we temporarily visited is to cd through the +# original $OLDPWD for real on the way back. Do not simplify this to a single +# cd plus an $OLDPWD assignment. +# +# $1 - the $PWD to return to +# $2 - the $OLDPWD to restore; may be empty or since-deleted, in which case we +# bounce through $1 so that `cd -' degrades to a harmless no-op +.zinit-restore-dir() { + [[ -n $2 && -d $2 ]] && .zinit-cd-quiet "$2" || .zinit-cd-quiet "$1" + .zinit-cd-quiet "$1" +} # ]]] # FUNCTION: .zinit-any-to-user-plugin [[[ # Allows elastic plugin-spec across the code. # @@ -1497,7 +1520,7 @@ builtin setopt noaliases return $(( 10 - $? )) done - (( ${+ICE[atinit]} )) && { local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "$local_dir/$dirname"; } && eval "${ICE[atinit]}"; ((1)); } || eval "${ICE[atinit]}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + (( ${+ICE[atinit]} )) && { local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "$local_dir/$dirname" && { ___moved=1; eval "${ICE[atinit]}" }; ((1)); } || eval "${ICE[atinit]}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:atinit-<-> <->]} ) for key in "${reply[@]}"; do @@ -1549,7 +1572,7 @@ builtin setopt noaliases } else { [[ ${+ICE[silent]} -eq 1 || ${+ICE[pick]} -eq 1 && -z ${ICE[pick]} || ${ICE[pick]} = /dev/null ]] || { +zi-log "Snippet not loaded ({url}${id_as}{rst})"; retval=1; } } [[ -n ${ICE[src]} ]] && { ZERO="${${(M)ICE[src]##/*}:-$local_dir/$dirname/${ICE[src]}}"; (( ${+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 += $? )); }; } - [[ -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; } + [[ -n ${ICE[multisrc]} ]] && { local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; .zinit-cd-quiet "$local_dir/$dirname"; eval "reply=(${ICE[multisrc]})"; .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; 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-<-> <->]} ) @@ -1564,7 +1587,7 @@ builtin setopt noaliases .zinit-wrap-functions "$save_url" "" "$id_as" } - [[ ${ICE[atload][1]} = "!" ]] && { .zinit-add-report "$id_as" "Note: Starting to track the atload'!…' ice…"; ZERO="$local_dir/$dirname/-atload-"; local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "$local_dir/$dirname"; } && builtin eval "${ICE[atload]#\!}"; ((1)); } || eval "${ICE[atload]#\!}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + [[ ${ICE[atload][1]} = "!" ]] && { .zinit-add-report "$id_as" "Note: Starting to track the atload'!…' ice…"; ZERO="$local_dir/$dirname/-atload-"; local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "$local_dir/$dirname" && { ___moved=1; builtin eval "${ICE[atload]#\!}" }; ((1)); } || eval "${ICE[atload]#\!}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } (( -- ZINIT[TMP_SUBST] == 0 )) && { ZINIT[TMP_SUBST]=inactive; builtin setopt noaliases; (( ${+ZINIT[bkp-compdef]} )) && functions[compdef]="${ZINIT[bkp-compdef]}" || unfunction compdef; (( ZINIT[ALIASES_OPT] )) && builtin setopt aliases; } elif [[ -n ${opts[(r)--command]} || ${ICE[as]} = command ]]; then @@ -1603,7 +1626,7 @@ builtin setopt noaliases ZERO="${${(M)ICE[src]##/*}:-$local_dir/$dirname/${ICE[src]}}" (( ${+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 += $? )); } fi - [[ -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; } + [[ -n ${ICE[multisrc]} ]] && { local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; .zinit-cd-quiet "$local_dir/$dirname"; eval "reply=(${ICE[multisrc]})"; .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; 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-<-> <->]} ) @@ -1618,7 +1641,7 @@ builtin setopt noaliases .zinit-wrap-functions "$save_url" "" "$id_as" } - [[ ${ICE[atload][1]} = "!" ]] && { .zinit-add-report "$id_as" "Note: Starting to track the atload'!…' ice…"; ZERO="$local_dir/$dirname/-atload-"; local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "$local_dir/$dirname"; } && builtin eval "${ICE[atload]#\!}"; ((1)); } || eval "${ICE[atload]#\!}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + [[ ${ICE[atload][1]} = "!" ]] && { .zinit-add-report "$id_as" "Note: Starting to track the atload'!…' ice…"; ZERO="$local_dir/$dirname/-atload-"; local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "$local_dir/$dirname" && { ___moved=1; builtin eval "${ICE[atload]#\!}" }; ((1)); } || eval "${ICE[atload]#\!}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } [[ -n ${ICE[src]} || -n ${ICE[multisrc]} || ${ICE[atload][1]} = "!" ]] && { (( -- ZINIT[TMP_SUBST] == 0 )) && { ZINIT[TMP_SUBST]=inactive; builtin setopt noaliases; (( ${+ZINIT[bkp-compdef]} )) && functions[compdef]="${ZINIT[bkp-compdef]}" || unfunction compdef; (( ZINIT[ALIASES_OPT] )) && builtin setopt aliases; } @@ -1627,7 +1650,7 @@ builtin setopt noaliases ((1)) fi - (( ${+ICE[atload]} )) && [[ ${ICE[atload][1]} != "!" ]] && { ZERO="$local_dir/$dirname/-atload-"; local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "$local_dir/$dirname"; } && builtin eval "${ICE[atload]}"; ((1)); } || eval "${ICE[atload]}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + (( ${+ICE[atload]} )) && [[ ${ICE[atload][1]} != "!" ]] && { ZERO="$local_dir/$dirname/-atload-"; local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "$local_dir/$dirname" && { ___moved=1; builtin eval "${ICE[atload]}" }; ((1)); } || eval "${ICE[atload]}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:atload-<-> <->]} ) for key in "${reply[@]}"; do @@ -1732,7 +1755,7 @@ builtin setopt noaliases return $(( 10 - $? )) done - [[ ${+ICE[atinit]} = 1 && $ICE[atinit] != '!'* ]] && { local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "${${${(M)___user:#%}:+$___plugin}:-${ZINIT[PLUGINS_DIR]}/${___id_as//\//---}}"; } && eval "${ICE[atinit]}"; ((1)); } || eval "${ICE[atinit]}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + [[ ${+ICE[atinit]} = 1 && $ICE[atinit] != '!'* ]] && { local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "${${${(M)___user:#%}:+$___plugin}:-${ZINIT[PLUGINS_DIR]}/${___id_as//\//---}}" && { ___moved=1; eval "${ICE[atinit]}" }; ((1)); } || eval "${ICE[atinit]}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:atinit-<-> <->]} ) for ___key in "${reply[@]}"; do @@ -1823,9 +1846,9 @@ builtin setopt noaliases } local ZERO - [[ $ICE[atinit] = '!'* ]] && { local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "${${${(M)___user:#%}:+$___plugin}:-${ZINIT[PLUGINS_DIR]}/${___id_as//\//---}}"; } && eval "${ICE[atinit#!]}"; ((1)); } || eval "${ICE[atinit]#!}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + [[ $ICE[atinit] = '!'* ]] && { local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "${${${(M)___user:#%}:+$___plugin}:-${ZINIT[PLUGINS_DIR]}/${___id_as//\//---}}" && { ___moved=1; eval "${ICE[atinit#!]}" }; ((1)); } || eval "${ICE[atinit]#!}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } [[ -n ${ICE[src]} ]] && { ZERO="${${(M)ICE[src]##/*}:-$___pdir_orig/${ICE[src]}}"; (( ${+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 += $? )); }; } - [[ -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; } + [[ -n ${ICE[multisrc]} ]] && { local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; .zinit-cd-quiet "$___pdir_orig"; eval "reply=(${ICE[multisrc]})"; .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; 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-<-> <->]} ) @@ -1840,7 +1863,7 @@ builtin setopt noaliases .zinit-wrap-functions "$___user" "$___plugin" "$___id_as" } - [[ ${ICE[atload][1]} = "!" ]] && { .zinit-add-report "$___id_as" "Note: Starting to track the atload'!…' ice…"; ZERO="$___pdir_orig/-atload-"; local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "$___pdir_orig"; } && builtin eval "${ICE[atload]#\!}"; } || eval "${ICE[atload]#\!}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + [[ ${ICE[atload][1]} = "!" ]] && { .zinit-add-report "$___id_as" "Note: Starting to track the atload'!…' ice…"; ZERO="$___pdir_orig/-atload-"; local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "$___pdir_orig" && { ___moved=1; builtin eval "${ICE[atload]#\!}" }; } || eval "${ICE[atload]#\!}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } [[ -n ${ICE[src]} || -n ${ICE[multisrc]} || ${ICE[atload][1]} = "!" ]] && { (( -- ZINIT[TMP_SUBST] == 0 )) && { ZINIT[TMP_SUBST]=inactive; builtin setopt noaliases; (( ${+ZINIT[bkp-compdef]} )) && functions[compdef]="${ZINIT[bkp-compdef]}" || unfunction compdef; (( ZINIT[ALIASES_OPT] )) && builtin setopt aliases; } @@ -1873,10 +1896,10 @@ builtin setopt noaliases (( ${+ICE[blockf]} )) && { local -a fpath_bkp; fpath_bkp=( "${fpath[@]}" ); } local ZERO="$___pdir_path/$___fname" (( ${+ICE[aliases]} )) || builtin setopt noaliases - [[ $ICE[atinit] = '!'* ]] && { local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "${${${(M)___user:#%}:+$___plugin}:-${ZINIT[PLUGINS_DIR]}/${___id_as//\//---}}"; } && eval "${ICE[atinit]#!}"; ((1)); } || eval "${ICE[atinit]#1}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + [[ $ICE[atinit] = '!'* ]] && { local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "${${${(M)___user:#%}:+$___plugin}:-${ZINIT[PLUGINS_DIR]}/${___id_as//\//---}}" && { ___moved=1; eval "${ICE[atinit]#!}" }; ((1)); } || eval "${ICE[atinit]#1}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } (( ${+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 += $? )); } [[ -n ${ICE[src]} ]] && { ZERO="${${(M)ICE[src]##/*}:-$___pdir_orig/${ICE[src]}}"; (( ${+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 += $? )); }; } - [[ -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; } + [[ -n ${ICE[multisrc]} ]] && { local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; .zinit-cd-quiet "$___pdir_orig"; eval "reply=(${ICE[multisrc]})"; .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; 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-<-> <->]} ) @@ -1891,7 +1914,7 @@ builtin setopt noaliases .zinit-wrap-functions "$___user" "$___plugin" "$___id_as" } - [[ ${ICE[atload][1]} = "!" ]] && { .zinit-add-report "$___id_as" "Note: Starting to track the atload'!…' ice…"; ZERO="$___pdir_orig/-atload-"; local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "$___pdir_orig"; } && builtin eval "${ICE[atload]#\!}"; ((1)); } || eval "${ICE[atload]#\!}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + [[ ${ICE[atload][1]} = "!" ]] && { .zinit-add-report "$___id_as" "Note: Starting to track the atload'!…' ice…"; ZERO="$___pdir_orig/-atload-"; local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "$___pdir_orig" && { ___moved=1; builtin eval "${ICE[atload]#\!}" }; ((1)); } || eval "${ICE[atload]#\!}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } (( ZINIT[ALIASES_OPT] )) && builtin setopt aliases (( ${+ICE[blockf]} )) && { fpath=( "${fpath_bkp[@]}" ); } @@ -1900,7 +1923,7 @@ builtin setopt noaliases [[ $___mode != light(|-b) ]] && .zinit-diff "${ZINIT[CUR_USPL2]}" end fi - [[ ${+ICE[atload]} = 1 && ${ICE[atload][1]} != "!" ]] && { ZERO="$___pdir_orig/-atload-"; local ___oldcd="$PWD"; (( ${+ICE[nocd]} == 0 )) && { () { setopt localoptions noautopushd; builtin cd -q "$___pdir_orig"; } && builtin eval "${ICE[atload]}"; ((1)); } || eval "${ICE[atload]}"; () { setopt localoptions noautopushd; builtin cd -q "$___oldcd"; }; } + [[ ${+ICE[atload]} = 1 && ${ICE[atload][1]} != "!" ]] && { ZERO="$___pdir_orig/-atload-"; local ___oldcd="$PWD" ___oldoldpwd="$OLDPWD"; integer ___moved=0; (( ${+ICE[nocd]} == 0 )) && { .zinit-cd-quiet "$___pdir_orig" && { ___moved=1; builtin eval "${ICE[atload]}" }; ((1)); } || eval "${ICE[atload]}"; (( ___moved )) && .zinit-restore-dir "$___oldcd" "$___oldoldpwd"; ((1)); } reply=( ${(on)ZINIT_EXTS[(I)z-annex hook:atload-<-> <->]} ) for ___key in "${reply[@]}"; do @@ -1986,7 +2009,7 @@ builtin setopt noaliases integer ___nolast=1 fi .zinit-any-to-user-plugin "$1" "" - local ___id_as="$1" ___user="${reply[-2]}" ___plugin="${reply[-1]}" ___oldpwd="$PWD" + local ___id_as="$1" ___user="${reply[-2]}" ___plugin="${reply[-1]}" ___oldcd="$PWD" ___oldoldpwd="$OLDPWD" () { builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} builtin cd &>/dev/null -q ${${${(M)___user:#%}:+$___plugin}:-${ZINIT[PLUGINS_DIR]}/${___id_as//\//---}} || { @@ -1998,7 +2021,7 @@ builtin setopt noaliases (( ___nolast )) && { builtin print -r "$1" >! ${ZINIT[BIN_DIR]}/last-run-object.txt; } ZINIT[last-run-plugin]="$1" eval "${@[2-correct,-1]}" - () { setopt localoptions noautopushd; builtin cd -q "$___oldpwd"; } + .zinit-restore-dir "$___oldcd" "$___oldoldpwd" else +zi-log "{u-warn}Error{b-warn}:{rst} no such plugin or snippet." fi