Allow modules to be loaded from multiple places (#1458)

* Allow modules to be loaded from multiple places
* Add setting for user specified module dirs

This is initial work for the contrib repo, mentioned in #1424
This commit is contained in:
Kaleb Elwert 2017-11-12 16:01:39 -08:00 committed by GitHub
parent ad79f78fbe
commit ce349dff81
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 20 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
*.zwc
*.zwc.old
modules/*/cache.zsh
contrib

View file

@ -72,35 +72,57 @@ function zprezto-update {
# Loads Prezto modules.
function pmodload {
local -a pmodules
local -a pmodule_dirs
local -a locations
local pmodule
local pmodule_location
local pfunction_glob='^([_.]*|prompt_*_setup|README*|*~)(-.N:t)'
# Load in any additional directories and warn if they don't exist
zstyle -a ':prezto:load' pmodule-dirs 'user_pmodule_dirs'
for user_dir in "$user_pmodule_dirs[@]"; do
if [[ ! -d "$user_dir" ]]; then
echo "$0: Missing user module dir: $user_dir"
fi
done
pmodule_dirs=("$ZPREZTODIR/modules" "$ZPREZTODIR/contrib" "$user_pmodule_dirs[@]")
# $argv is overridden in the anonymous function.
pmodules=("$argv[@]")
# Add functions to $fpath.
fpath=(${pmodules:+$ZPREZTODIR/modules/${^pmodules}/functions(/FN)} $fpath)
function {
local pfunction
# Extended globbing is needed for listing autoloadable function directories.
setopt LOCAL_OPTIONS EXTENDED_GLOB
# Load Prezto functions.
for pfunction in $ZPREZTODIR/modules/${^pmodules}/functions/$~pfunction_glob; do
autoload -Uz "$pfunction"
done
}
# Load Prezto modules.
for pmodule in "$pmodules[@]"; do
if zstyle -t ":prezto:module:$pmodule" loaded 'yes' 'no'; then
continue
elif [[ ! -d "$ZPREZTODIR/modules/$pmodule" ]]; then
print "$0: no such module: $pmodule" >&2
continue
else
locations=(${pmodule_dirs:+${^pmodule_dirs}/$pmodule(/FN)})
if (( ${#locations} > 1 )); then
print "$0: conflicting module locations: $locations"
continue
elif (( ${#locations} < 1 )); then
print "$0: no such module: $pmodule"
continue
fi
# Grab the full path to this module
pmodule_location=${locations[1]}
# Add functions to $fpath.
fpath=(${pmodule_location}/functions(/FN) $fpath)
function {
local pfunction
# Extended globbing is needed for listing autoloadable function directories.
setopt LOCAL_OPTIONS EXTENDED_GLOB
# Load Prezto functions.
for pfunction in ${pmodule_location}/functions/$~pfunction_glob; do
autoload -Uz "$pfunction"
done
}
if [[ -s "$ZPREZTODIR/modules/$pmodule/init.zsh" ]]; then
source "$ZPREZTODIR/modules/$pmodule/init.zsh"
fi
@ -109,7 +131,7 @@ function pmodload {
zstyle ":prezto:module:$pmodule" loaded 'yes'
else
# Remove the $fpath entry.
fpath[(r)${ZPREZTODIR}/modules/${pmodule}/functions]=()
fpath[(r)${pmodule_location}/functions]=()
function {
local pfunction
@ -119,7 +141,7 @@ function pmodload {
setopt LOCAL_OPTIONS EXTENDED_GLOB
# Unload Prezto functions.
for pfunction in $ZPREZTODIR/modules/$pmodule/functions/$~pfunction_glob; do
for pfunction in ${pmodule_location}/functions/$~pfunction_glob; do
unfunction "$pfunction"
done
}

View file

@ -15,6 +15,9 @@
# Color output (auto set to 'no' on dumb terminals).
zstyle ':prezto:*:*' color 'yes'
# Add additional directories to load prezto modules from
# zstyle ':prezto:load' pmodule-dirs $HOME/.zprezto-contrib
# Set the Zsh modules to load (man zshmodules).
# zstyle ':prezto:load' zmodule 'attr' 'stat'