diff --git a/src/stage2/29_zimfw_build_init.zsh.erb b/src/stage2/29_zimfw_build_init.zsh.erb index 45ca875..1e64abd 100644 --- a/src/stage2/29_zimfw_build_init.zsh.erb +++ b/src/stage2/29_zimfw_build_init.zsh.erb @@ -7,11 +7,39 @@ _zimfw_build_init() { _zimfw_mv =( print -R "zimfw() { source ${ZIM_HOME}/zimfw.zsh \"\${@}\" }" print -R "zmodule() { source ${ZIM_HOME}/zimfw.zsh \"\${@}\" }" - # Remove all prefixes from _zfpaths, _zfunctions and _zcmds - local -r zpre=$'*\0' - print -R 'typeset -g _zim_fpath=('${${_zfpaths#${~zpre}}:A}')' + local zroot_dir zpre + local -a zif_functions zif_cmds zroot_functions zroot_cmds + local -a zfunctions=(${_zfunctions}) zcmds=(${_zcmds}) + # Keep fpath constant regardless of "if" root dirs, to avoid confusing compinit. + # Move all from zfunctions and zcmds with "if" root dirs prefixes. + for zroot_dir in ${_zroot_dirs}; do + if (( ${+_zifs[${zroot_dir}]} )); then + zpre=${zroot_dir}$'\0' + zif_functions+=(${(M)zfunctions:#${zpre}*}) + zif_cmds+=(${(M)zcmds:#${zpre}*}) + zfunctions=(${zfunctions:#${zpre}*}) + zcmds=(${zcmds:#${zpre}*}) + fi + done + zpre=$'*\0' + print -R 'typeset -gr _zim_fpath=('${${_zfpaths#${~zpre}}:A}')' if (( ${#_zfpaths} )) print 'fpath=(${_zim_fpath} ${fpath})' - if (( ${#_zfunctions} )) print -R 'autoload -Uz -- '${_zfunctions#${~zpre}} - print -R ${(F)_zcmds#${~zpre}} + if (( ${#zfunctions} )) print -R 'autoload -Uz -- '${zfunctions#${~zpre}} + for zroot_dir in ${_zroot_dirs}; do + zpre=${zroot_dir}$'\0' + if (( ${+_zifs[${zroot_dir}]} )); then + zroot_functions=(${${(M)zif_functions:#${zpre}*}#${zpre}}) + zroot_cmds=(${${(M)zif_cmds:#${zpre}*}#${zpre}}) + if (( ${#zroot_functions} || ${#zroot_cmds} )); then + print -R 'if '${_zifs[${zroot_dir}]}'; then' + if (( ${#zroot_functions} )) print -R ' autoload -Uz -- '${zroot_functions} + if (( ${#zroot_cmds} )) print -R ${(F):- ${^zroot_cmds}} + print fi + fi + else + zroot_cmds=(${${(M)zcmds:#${zpre}*}#${zpre}}) + if (( ${#zroot_cmds} )) print -R ${(F)zroot_cmds} + fi + done ) ${ztarget} } diff --git a/src/stage2/30_zmodule.zsh.erb b/src/stage2/30_zmodule.zsh.erb index d506f7d..afa8899 100644 --- a/src/stage2/30_zmodule.zsh.erb +++ b/src/stage2/30_zmodule.zsh.erb @@ -8,10 +8,10 @@ The initialization will be done in the same order it's defined. are equivalent: %Bfoo%b, %Bzimfw/foo%b, %Bhttps://github.com/zimfw/foo.git%b. If an absolute path is given, the module is considered externally installed, and won't be installed or updated by zimfw. - %B-n%b|%B--name%b Set a custom module name. Use slashes inside the name to organize - the module into subdirectories. The module will be installed at + %B-n%b|%B--name%b Set a custom module name. Default: the last component in . + Slashes can be used inside the name to organize the module into + subdirectories. The module will be installed at %B${ZIM_HOME}/%b. - Default: the last component in . %B-r%b|%B--root%b Relative path to the module root. Per-module options: @@ -49,7 +49,9 @@ Per-call initialization options: %B-s%b|%B--source%b Will source specified file. The path is relative to the module root directory. Default: %Binit.zsh%b, if a non-empty %Bfunctions%b sub- directory exists, else the largest of the files matching the glob - %B(init.zsh|%b%B.(zsh|plugin.zsh|zsh-theme|sh))%b, if any. + %B(init.zsh|%b%B.(zsh|plugin.zsh|zsh-theme|sh))%b, if any. + in the glob is resolved to the last component of the mod- + ule name, or the last component of the path to the module root. %B-c%b|%B--cmd%b Will execute specified command. Occurrences of the %B{}%b placeholder in the command are substituted by the module root directory path. I.e., %B-s 'foo.zsh'%b and %B-c 'source {}/foo.zsh'%b are equivalent. @@ -120,7 +122,7 @@ Per-call initialization options: # Set values from options while (( # > 0 )); do case ${1} in - -b|--branch|-t|--tag|-u|--use|--on-pull|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd) + -b|--branch|-t|--tag|-u|--use|--on-pull|--if|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd) if (( # < 2 )); then print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} _zfailed=1 @@ -156,6 +158,10 @@ Per-call initialization options: if [[ -n ${zroot} ]] zarg="(builtin cd -q ${zroot}; ${zarg})" _zonpulls[${zname}]="${_zonpulls[${zname}]+${_zonpulls[${zname}]}; }${zarg}" ;; + --if) + shift + _zifs[${zroot_dir}]=${1} + ;; -f|--fpath) shift zarg=${1} @@ -205,12 +211,12 @@ Per-call initialization options: zcmds=('source '${^prezto_scripts:A}) else # get script with largest size (descending `O`rder by `L`ength, and return only `[1]` first) - local -ra zscripts=(${zroot_dir}/(init.zsh|${zroot_dir:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) + local -ra zscripts=(${zroot_dir}/(init.zsh|(${zname:t}|${zroot_dir:t}).(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) zcmds=('source '${^zscripts:A}) fi fi if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then - _zimfw_print -u2 -PlR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zname}:%b Nothing found to be initialized. Customize the module name or initialization with %Bzmodule%b options.%f" '' ${zusage} + _zimfw_print -u2 -PlR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zname}:%b Nothing found to be initialized. Customize the module name, root or initialization with %Bzmodule%b options.%f" '' ${zusage} fi # Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating root dir local -r zpre=${zroot_dir}$'\0' diff --git a/src/stage2/80_zimfw.zsh.erb b/src/stage2/80_zimfw.zsh.erb index 5ca7727..9f4d4e0 100644 --- a/src/stage2/80_zimfw.zsh.erb +++ b/src/stage2/80_zimfw.zsh.erb @@ -27,7 +27,7 @@ Options: %B-q%b Quiet (yes to prompts, and only outputs errors) %B-v%b Verbose (outputs more details)" local -Ua _znames _zroot_dirs _zdisabled_root_dirs - local -A _zfrozens _ztools _zdirs _zurls _ztypes _zrevs _zsubmodules _zonpulls + local -A _zfrozens _ztools _zdirs _zurls _ztypes _zrevs _zsubmodules _zonpulls _zifs local -a _zfpaths _zfunctions _zcmds _zunused_dirs local -i _zprintlevel=1 if (( # > 2 )); then diff --git a/zimfw.zsh b/zimfw.zsh index 68bd297..796c9e6 100644 --- a/zimfw.zsh +++ b/zimfw.zsh @@ -59,12 +59,40 @@ _zimfw_build_init() { _zimfw_mv =( print -R "zimfw() { source ${ZIM_HOME}/zimfw.zsh \"\${@}\" }" print -R "zmodule() { source ${ZIM_HOME}/zimfw.zsh \"\${@}\" }" - # Remove all prefixes from _zfpaths, _zfunctions and _zcmds - local -r zpre=$'*\0' - print -R 'typeset -g _zim_fpath=('${${_zfpaths#${~zpre}}:A}')' + local zroot_dir zpre + local -a zif_functions zif_cmds zroot_functions zroot_cmds + local -a zfunctions=(${_zfunctions}) zcmds=(${_zcmds}) + # Keep fpath constant regardless of "if" root dirs, to avoid confusing compinit. + # Move all from zfunctions and zcmds with "if" root dirs prefixes. + for zroot_dir in ${_zroot_dirs}; do + if (( ${+_zifs[${zroot_dir}]} )); then + zpre=${zroot_dir}$'\0' + zif_functions+=(${(M)zfunctions:#${zpre}*}) + zif_cmds+=(${(M)zcmds:#${zpre}*}) + zfunctions=(${zfunctions:#${zpre}*}) + zcmds=(${zcmds:#${zpre}*}) + fi + done + zpre=$'*\0' + print -R 'typeset -gr _zim_fpath=('${${_zfpaths#${~zpre}}:A}')' if (( ${#_zfpaths} )) print 'fpath=(${_zim_fpath} ${fpath})' - if (( ${#_zfunctions} )) print -R 'autoload -Uz -- '${_zfunctions#${~zpre}} - print -R ${(F)_zcmds#${~zpre}} + if (( ${#zfunctions} )) print -R 'autoload -Uz -- '${zfunctions#${~zpre}} + for zroot_dir in ${_zroot_dirs}; do + zpre=${zroot_dir}$'\0' + if (( ${+_zifs[${zroot_dir}]} )); then + zroot_functions=(${${(M)zif_functions:#${zpre}*}#${zpre}}) + zroot_cmds=(${${(M)zif_cmds:#${zpre}*}#${zpre}}) + if (( ${#zroot_functions} || ${#zroot_cmds} )); then + print -R 'if '${_zifs[${zroot_dir}]}'; then' + if (( ${#zroot_functions} )) print -R ' autoload -Uz -- '${zroot_functions} + if (( ${#zroot_cmds} )) print -R ${(F):- ${^zroot_cmds}} + print fi + fi + else + zroot_cmds=(${${(M)zcmds:#${zpre}*}#${zpre}}) + if (( ${#zroot_cmds} )) print -R ${(F)zroot_cmds} + fi + done ) ${ztarget} } @@ -94,10 +122,10 @@ The initialization will be done in the same order it's defined. are equivalent: %Bfoo%b, %Bzimfw/foo%b, %Bhttps://github.com/zimfw/foo.git%b. If an absolute path is given, the module is considered externally installed, and won't be installed or updated by zimfw. - %B-n%b|%B--name%b Set a custom module name. Use slashes inside the name to organize - the module into subdirectories. The module will be installed at + %B-n%b|%B--name%b Set a custom module name. Default: the last component in . + Slashes can be used inside the name to organize the module into + subdirectories. The module will be installed at %B${ZIM_HOME}/%b. - Default: the last component in . %B-r%b|%B--root%b Relative path to the module root. Per-module options: @@ -135,7 +163,9 @@ Per-call initialization options: %B-s%b|%B--source%b Will source specified file. The path is relative to the module root directory. Default: %Binit.zsh%b, if a non-empty %Bfunctions%b sub- directory exists, else the largest of the files matching the glob - %B(init.zsh|%b%B.(zsh|plugin.zsh|zsh-theme|sh))%b, if any. + %B(init.zsh|%b%B.(zsh|plugin.zsh|zsh-theme|sh))%b, if any. + in the glob is resolved to the last component of the mod- + ule name, or the last component of the path to the module root. %B-c%b|%B--cmd%b Will execute specified command. Occurrences of the %B{}%b placeholder in the command are substituted by the module root directory path. I.e., %B-s 'foo.zsh'%b and %B-c 'source {}/foo.zsh'%b are equivalent. @@ -206,7 +236,7 @@ Per-call initialization options: # Set values from options while (( # > 0 )); do case ${1} in - -b|--branch|-t|--tag|-u|--use|--on-pull|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd) + -b|--branch|-t|--tag|-u|--use|--on-pull|--if|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd) if (( # < 2 )); then print -u2 -PlR "%F{red}x ${funcfiletrace[1]}:%B${zname}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} _zfailed=1 @@ -242,6 +272,10 @@ Per-call initialization options: if [[ -n ${zroot} ]] zarg="(builtin cd -q ${zroot}; ${zarg})" _zonpulls[${zname}]="${_zonpulls[${zname}]+${_zonpulls[${zname}]}; }${zarg}" ;; + --if) + shift + _zifs[${zroot_dir}]=${1} + ;; -f|--fpath) shift zarg=${1} @@ -291,12 +325,12 @@ Per-call initialization options: zcmds=('source '${^prezto_scripts:A}) else # get script with largest size (descending `O`rder by `L`ength, and return only `[1]` first) - local -ra zscripts=(${zroot_dir}/(init.zsh|${zroot_dir:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) + local -ra zscripts=(${zroot_dir}/(init.zsh|(${zname:t}|${zroot_dir:t}).(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) zcmds=('source '${^zscripts:A}) fi fi if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then - _zimfw_print -u2 -PlR "%F{yellow}! ${funcfiletrace[1]}:%B${zname}:%b Nothing found to be initialized. Customize the module name or initialization with %Bzmodule%b options.%f" '' ${zusage} + _zimfw_print -u2 -PlR "%F{yellow}! ${funcfiletrace[1]}:%B${zname}:%b Nothing found to be initialized. Customize the module name, root or initialization with %Bzmodule%b options.%f" '' ${zusage} fi # Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating root dir local -r zpre=${zroot_dir}$'\0' @@ -420,7 +454,7 @@ _zimfw_compile() { } _zimfw_info() { - print -R 'zimfw version: '${_zversion}' (built at 2022-09-29 00:40:29 UTC, previous commit is 3351dc6)' + print -R 'zimfw version: '${_zversion}' (built at 2022-10-07 00:49:27 UTC, previous commit is 8a9d63c)' print -R 'OSTYPE: '${OSTYPE} print -R 'TERM: '${TERM} print -R 'TERM_PROGRAM: '${TERM_PROGRAM} @@ -834,7 +868,7 @@ Options: %B-q%b Quiet (yes to prompts, and only outputs errors) %B-v%b Verbose (outputs more details)" local -Ua _znames _zroot_dirs _zdisabled_root_dirs - local -A _zfrozens _ztools _zdirs _zurls _ztypes _zrevs _zsubmodules _zonpulls + local -A _zfrozens _ztools _zdirs _zurls _ztypes _zrevs _zsubmodules _zonpulls _zifs local -a _zfpaths _zfunctions _zcmds _zunused_dirs local -i _zprintlevel=1 if (( # > 2 )); then