2019-12-01 16:00:47 -05:00
zmodule() {
2020-01-13 13:14:31 -05:00
local -r zusage="Usage: %B${0}%b <url> [%B-n%b|%B--name%b <module_name>] [options]
2019-12-01 16:00:47 -05:00
2020-05-02 19:47:38 -04:00
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.
2020-10-11 13:24:01 -04:00
<url> Module absolute path or repository URL. The following URL formats
2021-11-08 20:05:32 -05:00
are equivalent: %Bfoo%b, %Bzimfw/foo%b, %Bhttps://github.com/zimfw/foo.git%b.
%B-n%b|%B--name%b <module_name> Set a custom module name. Default: the last component in <url>.
Use slashes inside the name to organize the module into subdirec-
tories.
2020-05-02 19:47:38 -04:00
2019-12-01 16:00:47 -05:00
Repository options:
2020-10-11 13:24:01 -04:00
%B-b%b|%B--branch%b <branch_name> Use specified branch when installing and updating the module.
2021-11-08 20:05:32 -05:00
Overrides the tag option. Default: the repository default branch.
%B-t%b|%B--tag%b <tag_name> Use specified tag when installing and updating the module. Over-
rides the branch option.
2021-07-11 16:58:15 -04:00
%B-u%b|%B--use%b <%%Bgit%b|%Bdegit%b> Install and update the module using the defined tool. Default is
2021-11-08 20:05:32 -05:00
either 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 on updates.
2021-08-10 10:56:25 -04:00
%Bdegit%b requires curl or wget, and currently only works with GitHub
2021-11-08 20:05:32 -05:00
URLs. Modules install faster and take less disk space. Local
changes are lost on updates. Git submodules are not supported.
2022-01-25 09:32:50 -05:00
%B--no-submodules%b Don't install or update git submodules.
2021-07-01 19:06:20 -04:00
%B-z%b|%B--frozen%b Don't install or update the module.
2022-05-07 17:31:08 -04:00
%B--on-pull%b <command> Execute command after installing or updating the module. The com-
mand is executed in the module root directory.
2020-05-02 19:47:38 -04:00
Initialization options:
2020-10-11 13:24:01 -04:00
%B-f%b|%B--fpath%b <path> 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 <func_name> Autoload specified function. Default: all valid names inside the
2021-11-15 19:37:40 -05:00
%Bfunctions%b subdirectory, if any.
2021-11-08 20:05:32 -05:00
%B-s%b|%B--source%b <file_path> Source specified file. The file path is relative to the module
root directory. Default: %Binit.zsh%b, if the %Bfunctions%b subdirectory
2022-01-25 09:32:50 -05:00
also exists, or the largest of the files with name matching
2021-11-08 20:05:32 -05:00
%B{init.zsh,module_name.{zsh,plugin.zsh,zsh-theme,sh}}%b, if any.
%B-c%b|%B--cmd%b <command> 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.
2021-09-26 20:47:44 -04:00
%B-d%b|%B--disabled%b Don't initialize or uninstall the module.
2021-11-08 20:05:32 -05:00
Setting any initialization option above will disable all the default values from the other
initialization options, so only your provided values are used. I.e. these values are either
all automatic, or all manual."
2019-12-01 16:00:47 -05:00
if [[ ${${funcfiletrace[1]%:*}:t} != .zimrc ]]; then
2021-11-08 11:38:56 -05:00
print -u2 -PlR "%F{red}${0}: Must be called from %B<%= home %>/.zimrc%b%f" '' ${zusage}
2021-03-19 18:13:21 -04:00
return 2
2019-12-01 16:00:47 -05:00
fi
if (( ! # )); then
2021-11-08 11:38:56 -05:00
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}: Missing zmodule url%f" '' ${zusage}
2019-12-01 16:00:47 -05:00
_zfailed=1
2021-03-19 18:13:21 -04:00
return 2
2019-12-01 16:00:47 -05:00
fi
2022-05-17 19:43:59 -04:00
local zurl=${1} zname=${1:t} zarg
local -a zfpaths zfunctions zcmds
2019-12-01 16:00:47 -05:00
if [[ ${zurl} =~ ^[^:/]+: ]]; then
2022-05-17 19:43:59 -04:00
zname=${zname%.git}
2019-12-01 16:00:47 -05:00
elif [[ ${zurl} != /* ]]; then
# Count number of slashes
case ${#zurl//[^\/]/} in
2021-09-23 15:29:40 -04:00
0) zurl=https://github.com/zimfw/${zurl}.git ;;
1) zurl=https://github.com/${zurl}.git ;;
2019-12-01 16:00:47 -05:00
esac
fi
shift
2022-05-17 19:43:59 -04:00
while [[ ${1} == (-n|--name) ]]; do
2019-12-01 16:00:47 -05:00
if (( # < 2 )); then
2022-05-17 19:43:59 -04:00
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage}
2019-12-01 16:00:47 -05:00
_zfailed=1
2021-03-19 18:13:21 -04:00
return 2
2019-12-01 16:00:47 -05:00
fi
shift
2022-05-17 19:43:59 -04:00
zname=${${1%%/##}##/##}
2019-12-01 16:00:47 -05:00
shift
2022-05-17 19:43:59 -04:00
done
2020-06-05 23:09:23 -04:00
if [[ ${zurl} == /* ]]; then
2022-05-17 19:43:59 -04:00
_zdirs[${zname}]=${zurl%%/##}
2021-09-23 15:29:40 -04:00
zurl=
2020-06-05 23:09:23 -04:00
else
2022-05-17 19:43:59 -04:00
_zdirs[${zname}]=${ZIM_HOME}/modules/${zname}
fi
_zurls[${zname}]=${zurl}
# Set default values
if (( ! ${+_ztools[${zname}]} )); then
zstyle -s ':zim:zmodule' use "_ztools[${zname}]" || _ztools[${zname}]=git
2020-06-05 23:09:23 -04:00
fi
2022-05-17 19:43:59 -04:00
if (( ! ${+_ztypes[${zname}]} )) _ztypes[${zname}]=branch
if (( ! ${+_zsubmodules[${zname}]} )) _zsubmodules[${zname}]=1
# Set values from options
2019-12-01 16:00:47 -05:00
while (( # > 0 )); do
case ${1} in
2022-05-07 17:31:08 -04:00
-b|--branch|-t|--tag|-u|--use|--on-pull|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd)
2019-12-01 16:00:47 -05:00
if (( # < 2 )); then
2022-05-17 19:43:59 -04:00
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage}
2019-12-01 16:00:47 -05:00
_zfailed=1
2021-03-19 18:13:21 -04:00
return 2
2019-12-01 16:00:47 -05:00
fi
;;
esac
2021-09-19 14:37:13 -04:00
case ${1} in
2022-01-25 09:32:50 -05:00
-b|--branch|-t|--tag|-u|--use|--no-submodules)
2022-05-17 19:43:59 -04:00
if [[ -z ${zurl} ]] _zimfw_print -u2 -PR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zname}:%b The zmodule option %B${1}%b has no effect for external modules%f"
2021-09-19 14:37:13 -04:00
;;
esac
2019-12-01 16:00:47 -05:00
case ${1} in
-b|--branch)
shift
2022-05-17 19:43:59 -04:00
_ztypes[${zname}]=branch
_zrevs[${zname}]=${1}
2019-12-01 16:00:47 -05:00
;;
-t|--tag)
shift
2022-05-17 19:43:59 -04:00
_ztypes[${zname}]=tag
_zrevs[${zname}]=${1}
2019-12-01 16:00:47 -05:00
;;
2021-04-03 10:35:28 -04:00
-u|--use)
shift
2022-05-17 19:43:59 -04:00
_ztools[${zname}]=${1}
2021-04-03 10:35:28 -04:00
;;
2022-05-17 19:43:59 -04:00
--no-submodules) _zsubmodules[${zname}]=0 ;;
-z|--frozen) _zfrozens[${zname}]=1 ;;
2022-05-07 17:31:08 -04:00
--on-pull)
shift
2022-05-17 19:43:59 -04:00
_zonpulls[${zname}]="${_zonpulls[${zname}]+${_zonpulls[${zname}]}; }${1}"
2022-05-07 17:31:08 -04:00
;;
2019-12-01 16:00:47 -05:00
-f|--fpath)
shift
zarg=${1}
2022-05-17 19:43:59 -04:00
if [[ ${zarg} != /* ]] zarg=${_zdirs[${zname}]}/${zarg}
2019-12-01 16:00:47 -05:00
zfpaths+=(${zarg})
;;
-a|--autoload)
shift
zfunctions+=(${1})
;;
-s|--source)
shift
zarg=${1}
2022-05-17 19:43:59 -04:00
if [[ ${zarg} != /* ]] zarg=${_zdirs[${zname}]}/${zarg}
2020-07-02 18:16:44 -04:00
zcmds+=("source ${zarg:A}")
;;
-c|--cmd)
shift
2022-05-17 19:43:59 -04:00
zcmds+=(${1//{}/${_zdirs[${zname}]:A}})
2019-12-01 16:00:47 -05:00
;;
2022-05-17 19:43:59 -04:00
-d|--disabled) _zdisableds[${zname}]=1 ;;
2019-12-01 16:00:47 -05:00
*)
2022-05-17 19:43:59 -04:00
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}:%b Unknown zmodule option %B${1}%b%f" '' ${zusage}
2019-12-01 16:00:47 -05:00
_zfailed=1
2021-03-19 18:13:21 -04:00
return 2
2019-12-01 16:00:47 -05:00
;;
esac
shift
done
2021-09-19 14:37:13 -04:00
if (( _zflags & 1 )); then
2022-05-17 19:43:59 -04:00
_znames+=(${zname})
2021-09-19 14:37:13 -04:00
fi
if (( _zflags & 2 )); then
2022-05-17 19:43:59 -04:00
if (( _zdisableds[${zname}] )); then
_zdisabled_dirs+=(${_zdirs[${zname}]})
2019-12-03 07:07:59 -05:00
else
2022-05-17 19:43:59 -04:00
if [[ ! -e ${_zdirs[${zname}]} ]]; then
print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}: ${_zdirs[${zname}]}%b not found%f"
2019-12-07 21:17:40 -05:00
_zfailed=1
return 1
fi
2021-09-26 20:47:44 -04:00
if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then
2022-05-17 19:43:59 -04:00
zfpaths=(${_zdirs[${zname}]}/functions(NF))
2021-09-26 20:47:44 -04:00
# _* functions are autoloaded by compinit
# prompt_*_setup functions are autoloaded by promptinit
zfunctions=(${^zfpaths}/^(*~|*.zwc(|.old)|_*|prompt_*_setup)(N-.:t))
2022-05-17 19:43:59 -04:00
local -ra prezto_scripts=(${_zdirs[${zname}]}/init.zsh(N))
2021-09-23 12:36:38 -04:00
if (( ${#zfpaths} && ${#prezto_scripts} )); then
# this follows the prezto module format, no need to check for other scripts
2022-01-11 11:29:47 -05:00
zcmds=('source '${^prezto_scripts:A})
2021-09-23 12:36:38 -04:00
else
2021-03-16 18:04:40 -04:00
# get script with largest size (descending `O`rder by `L`ength, and return only `[1]` first)
2022-05-17 19:43:59 -04:00
local -ra zscripts=(${_zdirs[${zname}]}/(init.zsh|${zname:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1]))
2022-01-11 11:29:47 -05:00
zcmds=('source '${^zscripts:A})
2021-03-16 18:04:40 -04:00
fi
fi
2020-07-02 18:16:44 -04:00
if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then
2022-05-17 19:43:59 -04:00
_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}
2020-05-25 15:01:00 -04:00
fi
2022-05-17 19:43:59 -04:00
# Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating names
local -r zpre=${zname}$'\0'
2021-09-21 09:27:56 -04:00
_zfpaths+=(${zpre}${^zfpaths})
_zfunctions+=(${zpre}${^zfunctions})
_zcmds+=(${zpre}${^zcmds})
2019-12-01 16:00:47 -05:00
fi
fi
}