# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # Copyright (c) 2016-2020 Sebastian Gniazdowski and contributors # FUNCTION: :zinit-shade-source [[[ :zinit-shade-source() { local -a ___substs ___ab ___substs=( "${(@s.;.)ZINIT_ICE[subst]}" ) if [[ -n ${(M)___substs:#*\\(#e)} ]] { local ___prev ___substs=( ${___substs[@]//(#b)((*)\\(#e)|(*))/${match[3]:+${___prev:+$___prev\;}}${match[3]}${${___prev::=${match[2]:+${___prev:+$___prev\;}}${match[2]}}:+}} ) } # Load the plugin if [[ ! -r $1 ]] { +zinit-message "[error]source: Couldn't read the script [obj]${1}[error]" \ ", cannot substitute [data]${ZINIT_ICE[subst]}[error].[rst]" } local ___data="$(<$1)" () { builtin emulate -LR zsh -o extendedglob -o interactivecomments local ___subst for ___subst ( "${___substs[@]}" ) { ___ab=( "${(@)${(@)${(@s:->:)___subst}##[[:space:]]##}%%[[:space:]]##}" ) ___ab[2]=${___ab[2]//(#b)\\([[:digit:]])/\${match[${match[1]}]}} builtin eval "___data=\"\${___data//(#b)\${~___ab[1]}/${___ab[2]}}\"" } ___data="() { ${(F)${(@)${(f)___data[@]}:#\ #\#*}} ; } \"\${@[2,-1]}\"" } builtin eval "$___data" } # ]]] # FUNCTION: .zinit-setup-params [[[ .zinit-setup-params() { emulate -LR zsh -o extendedglob reply=( ${(@)${(@s.;.)ZINIT_ICE[param]}/(#m)*/${${MATCH%%(-\>|→)*}//((#s)[[:space:]]##|[[:space:]]##(#e))}${${(M)MATCH#*(-\>|→)}:+\=${${MATCH#*(-\>|→)}//((#s)[[:space:]]##|[[:space:]]##(#e))}}} ) (( ${#reply} )) && return 0 || return 1 } # ]]] # FUNCTION: .zinit-service [[[ # Handles given service, i.e. obtains lock, runs it, or waits if no lock # # $1 - type "p" or "s" (plugin or snippet) # $2 - mode - for plugin (light or load) # $3 - id - URL or plugin ID or alias name (from id-as'') .zinit-service() { emulate -LR zsh setopt extendedglob warncreateglobal typesetsilent noshortloops local ___tpe="$1" ___mode="$2" ___id="$3" ___fle="${ZINIT[SERVICES_DIR]}/${ZINIT_ICE[service]}.lock" ___fd ___cmd ___tmp ___lckd ___strd=0 { builtin print -n >! "$___fle"; } 2>/dev/null 1>&2 [[ ! -e ${___fle:r}.fifo ]] && command mkfifo "${___fle:r}.fifo" 2>/dev/null 1>&2 [[ ! -e ${___fle:r}.fifo2 ]] && command mkfifo "${___fle:r}.fifo2" 2>/dev/null 1>&2 typeset -g ZSRV_WORK_DIR="${ZINIT[SERVICES_DIR]}" ZSRV_ID="${ZINIT_ICE[service]}" # should be also set by other p-m while (( 1 )); do ( while (( 1 )); do [[ ! -f ${___fle:r}.stop ]] && if (( ___lckd )) || zsystem 2>/dev/null 1>&2 flock -t 1 -f ___fd -e $___fle; then ___lckd=1 if (( ! ___strd )) || [[ $___cmd = RESTART ]]; then [[ $___tpe = p ]] && { ___strd=1; .zinit-load "$___id" "" "$___mode"; } [[ $___tpe = s ]] && { ___strd=1; .zinit-load-snippet "$___id" ""; } fi ___cmd= while (( 1 )); do builtin read -t 32767 ___cmd <>"${___fle:r}.fifo" && break; done else return 0 fi [[ $___cmd = (#i)NEXT ]] && { kill -TERM "$ZSRV_PID"; builtin read -t 2 ___tmp <>"${___fle:r}.fifo2"; kill -HUP "$ZSRV_PID"; exec {___fd}>&-; ___lckd=0; ___strd=0; builtin read -t 10 ___tmp <>"${___fle:r}.fifo2"; } [[ $___cmd = (#i)STOP ]] && { kill -TERM "$ZSRV_PID"; builtin read -t 2 ___tmp <>"${___fle:r}.fifo2"; kill -HUP "$ZSRV_PID"; ___strd=0; builtin print >! "${___fle:r}.stop"; } [[ $___cmd = (#i)QUIT ]] && { kill -HUP ${sysparams[pid]}; return 1; } [[ $___cmd != (#i)RESTART ]] && { ___cmd=; builtin read -t 1 ___tmp <>"${___fle:r}.fifo2"; } done ) || break builtin read -t 1 ___tmp <>"${___fle:r}.fifo2" done >>! "$ZSRV_WORK_DIR/$ZSRV_ID".log 2>&1 } # ]]] # FUNCTION: .zinit-wrap-track-functions [[[ .zinit-wrap-track-functions() { local user="$1" plugin="$2" id_as="$3" f local -a wt wt=( ${(@s.;.)ZINIT_ICE[wrap-track]} ) for f in ${wt[@]}; do functions[${f}-zinit-bkp]="${functions[$f]}" eval " function $f { ZINIT[CUR_USR]=\"$user\" ZINIT[CUR_PLUGIN]=\"$plugin\" ZINIT[CUR_USPL2]=\"$id_as\" .zinit-add-report \"\${ZINIT[CUR_USPL2]}\" \"Note: === Starting to track function: $f ===\" .zinit-diff \"\${ZINIT[CUR_USPL2]}\" begin .zinit-shade-on load functions[${f}]=\${functions[${f}-zinit-bkp]} ${f} \"\$@\" .zinit-shade-off load .zinit-diff \"\${ZINIT[CUR_USPL2]}\" end .zinit-add-report \"\${ZINIT[CUR_USPL2]}\" \"Note: === Ended tracking function: $f ===\" ZINIT[CUR_USR]= ZINIT[CUR_PLUGIN]= ZINIT[CUR_USPL2]= }" done } # ]]] # # Dtrace # # FUNCTION: .zinit-debug-start [[[ # Starts Dtrace, i.e. session tracking for changes in Zsh state. .zinit-debug-start() { if [[ ${ZINIT[DTRACE]} = 1 ]]; then +zinit-message "[error]Dtrace is already active, stop it first with \`dstop'[rst]" return 1 fi ZINIT[DTRACE]=1 .zinit-diff _dtrace/_dtrace begin # Full shadeing on .zinit-shade-on dtrace } # ]]] # FUNCTION: .zinit-debug-stop [[[ # Stops Dtrace, i.e. session tracking for changes in Zsh state. .zinit-debug-stop() { ZINIT[DTRACE]=0 # Shadowing fully off .zinit-shade-off dtrace # Gather end data now, for diffing later .zinit-diff _dtrace/_dtrace end } # ]]] # FUNCTION: .zinit-clear-debug-report [[[ # Forgets dtrace repport gathered up to this moment. .zinit-clear-debug-report() { .zinit-clear-report-for _dtrace/_dtrace } # ]]] # FUNCTION: .zinit-debug-unload [[[ # Reverts changes detected by dtrace run. .zinit-debug-unload() { (( ${+functions[.zinit-unload]} )) || builtin source "${ZINIT[BIN_DIR]}/zinit-autoload.zsh" || return 1 if [[ ${ZINIT[DTRACE]} = 1 ]]; then +zinit-message "[error]Dtrace is still active, stop it first with \`dstop'[rst]" else .zinit-unload _dtrace _dtrace fi } # ]]] # vim:ft=zsh:sw=4:sts=4:et:foldmarker=[[[,]]]:foldmethod=marker