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.
2019-12-01 16:00:47 -05:00
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
2021-07-11 16:58:15 -04:00
local zurl=${1} zmodule=${1:t} ztool zdir ztype zrev zarg
2022-01-25 09:32:50 -05:00
local -i zsubmodules=1 zfrozen=0 zdisabled=0
2020-07-02 18:16:44 -04:00
local -a zfpaths zfunctions zcmds
2021-07-11 16:58:15 -04:00
zstyle -s ':zim:zmodule' use 'ztool' || ztool=git
2019-12-01 16:00:47 -05:00
if [[ ${zurl} =~ ^[^:/]+: ]]; then
zmodule=${zmodule%.git}
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
if [[ ${1} == (-n|--name) ]]; then
if (( # < 2 )); then
2021-11-15 19:37:40 -05:00
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%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
2021-06-17 21:01:13 -04:00
zmodule=${${1%%/##}##/##}
2019-12-01 16:00:47 -05:00
shift
fi
2020-06-05 23:09:23 -04:00
if [[ ${zurl} == /* ]]; then
2021-06-17 21:01:13 -04:00
zdir=${zurl%%/##}
2021-09-23 15:29:40 -04:00
zurl=
2020-06-05 23:09:23 -04:00
else
zdir=${ZIM_HOME}/modules/${zmodule}
fi
2019-12-01 16:00:47 -05:00
while (( # > 0 )); do
case ${1} in
2021-04-03 10:35:28 -04:00
-b|--branch|-t|--tag|-u|--use|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd)
2019-12-01 16:00:47 -05:00
if (( # < 2 )); then
2021-11-15 19:37:40 -05:00
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%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)
2021-11-15 19:37:40 -05:00
if [[ -z ${zurl} ]] _zimfw_print -u2 -PR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zmodule}:%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
ztype=branch
zrev=${1}
;;
-t|--tag)
shift
ztype=tag
zrev=${1}
;;
2021-04-03 10:35:28 -04:00
-u|--use)
shift
ztool=${1}
;;
2022-01-25 09:32:50 -05:00
--no-submodules) zsubmodules=0 ;;
2019-12-01 16:00:47 -05:00
-z|--frozen) zfrozen=1 ;;
-f|--fpath)
shift
zarg=${1}
2020-02-03 20:43:36 -05:00
if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg}
2019-12-01 16:00:47 -05:00
zfpaths+=(${zarg})
;;
-a|--autoload)
shift
zfunctions+=(${1})
;;
-s|--source)
shift
zarg=${1}
2020-02-03 20:43:36 -05:00
if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg}
2020-07-02 18:16:44 -04:00
zcmds+=("source ${zarg:A}")
;;
-c|--cmd)
shift
zcmds+=(${1//{}/${zdir:A}})
2019-12-01 16:00:47 -05:00
;;
-d|--disabled) zdisabled=1 ;;
*)
2021-11-15 19:37:40 -05:00
print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%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-01-25 09:32:50 -05:00
_zmodules_zargs+=("${ztool}" "${_zargs_action}" "${zmodule}" "${zdir}" "${zurl}" "${ztype}" "${zrev}" "${zsubmodules}" "${zfrozen}" "${zdisabled}")
2021-09-19 14:37:13 -04:00
fi
if (( _zflags & 2 )); then
2019-12-03 07:07:59 -05:00
if (( zdisabled )); then
2021-09-23 12:36:38 -04:00
_zdisabled_dirs+=(${zdir})
2019-12-03 07:07:59 -05:00
else
2021-09-23 12:36:38 -04:00
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
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
2021-09-23 12:36:38 -04:00
zfpaths=(${zdir}/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))
2021-09-23 12:36:38 -04:00
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
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)
2021-08-10 10:56:25 -04:00
local -ra zscripts=(${zdir}/(init.zsh|${zmodule: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
2021-11-08 11:38:56 -05:00
_zimfw_print -u2 -PlR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zmodule}:%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
2020-07-02 18:16:44 -04:00
_zdirs+=(${zdir})
2021-09-21 09:27:56 -04:00
# 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})
2019-12-01 16:00:47 -05:00
fi
fi
}