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 . Use slashes inside the name to organize the module into subdirecto- ries. 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 is defined by %Bzstyle ':zim:zmodule' use '%b<%%Bgit%b|%Bdegit%b>%B'%b, or %Bgit%b if none is provided. %Bgit%b requires git itself. Local changes are preserved during updates. %Bdegit%b requires curl or wget, and currently only works with GitHub URLs. Modules install faster and take less disk space. Local changes are lost during updates. Git submodules are not supported. %B-z%b|%B--frozen%b Don't install or update the module. 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. I.e., %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 zurl=${1} zmodule=${1:t} ztool zdir ztype zrev zarg local -i zdisabled=0 zfrozen=0 local -a zfpaths zfunctions zcmds zstyle -s ':zim:zmodule' use 'ztool' || ztool=git 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%%/##} 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|-t|--tag|-u|--use) if [[ -z ${zurl} ]] _zimfw_print -u2 -PR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zmodule}:%b The zmodule option ${1} has no effect for external modules%f" ;; 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 (( _zflags & 1 )); then _zmodules_zargs+=("${ztool}" "${_zargs_action}" "${zmodule}" "${zdir}" "${zurl}" "${ztype}" "${zrev}" "${zfrozen}" "${zdisabled}") fi if (( _zflags & 2 )); then if (( zdisabled )); then _zdisabled_dirs+=(${zdir}) else if [[ ! -e ${zdir} ]]; then if [[ -z ${zurl} ]]; then print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}: ${zdir}%b not found%f" else print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Not installed. Run %Bzimfw install%b to install.%f" fi _zfailed=1 return 1 fi if (( ! ${#zfpaths} && ! ${#zcmds} )); then zfpaths=(${zdir}/functions(NF)) local -ra prezto_scripts=(${zdir}/init.zsh(N)) if (( ${#zfpaths} && ${#prezto_scripts} )); then # this follows the prezto module format, no need to check for other scripts 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=(${zdir}/(init.zsh|${zmodule:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) zcmds=("source ${^zscripts[@]: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 _zimfw_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 _zdirs+=(${zdir}) # Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating modules local -r zpre=${zmodule}$'\0' _zfpaths+=(${zpre}${^zfpaths}) _zfunctions+=(${zpre}${^zfunctions}) _zcmds+=(${zpre}${^zcmds}) fi fi }