zmodule() { local -r zusage="Usage: %B${0}%b [%B-n%b|%B--name%b ] [options] Add %Bzmodule%b calls to your %B${ZDOTDIR:-${HOME}}/.zimrc%b file to define the modules to be initialized. The modules are initialized in the same order they are defined. Module absolute path or repository URL. The following URL formats are equivalent: %Bname%b, %Bzimfw/name%b, %Bhttps://github.com/zimfw/name.git%b. %B-n%b|%B--name%b Set a custom module name. Default: the last component in the . Repository options: %B-b%b|%B--branch%b Use specified branch when installing and updating the module. Overrides the tag option. Default: the repository's default branch. %B-t%b|%B--tag%b Use specified tag when installing and updating the module. Overrides the branch option. %B-u%b|%B--use%b <%%Bgit%b|%Bdegit%b> Install and update the module using the defined tool. Default: %Bgit%b Initialization options: %B-f%b|%B--fpath%b Add specified path to fpath. The path is relative to the module root directory. Default: %Bfunctions%b, if the subdirectory exists. %B-a%b|%B--autoload%b Autoload specified function. Default: all valid names inside the module's specified fpath paths. %B-s%b|%B--source%b Source specified file. The file path is relative to the module root directory. Default: %Binit.zsh%b, if the %Bfunctions%b subdirectory also exists, or the file with largest size matching %B{init.zsh,module_name.{zsh,plugin.zsh,zsh-theme,sh}}%b, if any exist. %B-c%b|%B--cmd%b Execute specified command. Occurrences of the %B{}%b placeholder in the command are substituted by the module root directory path. %B-s 'script.zsh'%b and %B-c 'source {}/script.zsh'%b are equivalent. %B-d%b|%B--disabled%b Don't initialize or uninstall the module. " if [[ ${${funcfiletrace[1]%:*}:t} != .zimrc ]]; then print -u2 -PR "%F{red}${0}: Must be called from %B<%= home %>/.zimrc%b%f"$'\n\n'${zusage} return 2 fi if (( ! # )); then print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}: Missing zmodule url%f"$'\n\n'${zusage} _zfailed=1 return 2 fi setopt LOCAL_OPTIONS CASE_GLOB EXTENDED_GLOB local ztool=git local zmodule=${1:t} zurl=${1} local ztype zrev local -i zdisabled=0 zfrozen=0 local -a zfpaths zfunctions zcmds local zarg zdir if [[ ${zurl} =~ ^[^:/]+: ]]; then zmodule=${zmodule%.git} elif [[ ${zurl} != /* ]]; then # Count number of slashes case ${#zurl//[^\/]/} in 0) zurl="https://github.com/zimfw/${zurl}.git" ;; 1) zurl="https://github.com/${zurl}.git" ;; esac fi shift if [[ ${1} == (-n|--name) ]]; then if (( # < 2 )); then print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Missing argument for zmodule option ${1}%f"$'\n\n'${zusage} _zfailed=1 return 2 fi shift zmodule=${1} shift fi if [[ ${zurl} == /* ]]; then zdir=${zurl} else zdir=${ZIM_HOME}/modules/${zmodule} fi while (( # > 0 )); do case ${1} in -b|--branch|-t|--tag|-u|--use|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd) if (( # < 2 )); then print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Missing argument for zmodule option ${1}%f"$'\n\n'${zusage} _zfailed=1 return 2 fi ;; esac case ${1} in -b|--branch) shift ztype=branch zrev=${1} ;; -t|--tag) shift ztype=tag zrev=${1} ;; -u|--use) shift ztool=${1} ;; -z|--frozen) zfrozen=1 ;; -f|--fpath) shift zarg=${1} if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg} zfpaths+=(${zarg}) ;; -a|--autoload) shift zfunctions+=(${1}) ;; -s|--source) shift zarg=${1} if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg} zcmds+=("source ${zarg:A}") ;; -c|--cmd) shift zcmds+=(${1//{}/${zdir:A}}) ;; -d|--disabled) zdisabled=1 ;; *) print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Unknown zmodule option ${1}%f"$'\n\n'${zusage} _zfailed=1 return 2 ;; esac shift done if [[ -n ${_zargs_action} ]]; then if (( ! zfrozen )); then _zmodules_zargs+=("${ztool}" "${_zargs_action}" "${zmodule}" "${zdir}" "${zurl}" "${ztype}" "${zrev}") fi else if (( zdisabled )); then _zdisableds+=(${zmodule}) else if [[ ! -d ${zdir} ]]; then print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Not installed. Run %Bzimfw install%b to install.%f" _zfailed=1 return 1 fi local -ra prezto_fpaths=(${zdir}/functions(NF)) local -ra prezto_scripts=(${zdir}/init.zsh(N)) if (( ! ${#zfpaths} && ! ${#zcmds} && ${#prezto_fpaths} && ${#prezto_scripts} )); then # this follows the prezto module format, no need to check for other scripts zfpaths=(${prezto_fpaths}) zcmds=("source ${^prezto_scripts[@]:A}") else if (( ! ${#zfpaths} )) zfpaths=(${prezto_fpaths}) if (( ! ${#zcmds} )); then # get script with largest size (descending `O`rder by `L`ength, and return only `[1]` first) local -r zscript=(${zdir}/(init.zsh|${zmodule:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) zcmds=("source ${^zscript[@]:A}") fi fi if (( ! ${#zfunctions} )); then # _* functions are autoloaded by compinit # prompt_*_setup functions are autoloaded by promptinit zfunctions=(${^zfpaths}/^(*~|*.zwc(|.old)|_*|prompt_*_setup)(N-.:t)) fi if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then print -u2 -PR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zmodule}:%b Nothing found to be initialized. Customize the module name or initialization with %Bzmodule%b options.%f"$'\n\n'${zusage} fi _zmodules+=(${zmodule}) _zdirs+=(${zdir}) _zfpaths+=(${zfpaths}) _zfunctions+=(${zfunctions}) _zcmds+=(${zcmds}) fi fi }