--- /dev/null
+active_plugins/
Configuration
-------------
-AX-ZSH can be configured using settings in a `$HOME/.zshenv` file.
-
-The following configuration variables are supported:
-
-* `AXZSH_PLUGIN_D`: Optional directory for additional plugins.
-* `axzsh_default_plugins`: Array of default plugins, that will be loaded in
- addition to the core plugins. You can reset this array to disable(!) loading
- of these default plugins. Currently these plugins are loaded by default:
- * byebye
- * correction
- * grep
- * history
- * less
- * ls
- * prompt
- * ssh
- * std_aliases
- * std_env
- * std_options
-* `axzsh_plugins`: Optional array of addiutional (non-core and non-default)
- plugins to load.
-
-Example for a `$HOME/.zshenv` file:
-
-```
-# Add additinal custom plugin search path
-export AXZSH_PLUGIN_D="/opt/ax-zsh-plugins"
-
-# Disable all default plugins
-axzsh_default_plugins=()
-
-# Add additional plugins
-axzsh_plugins=(
- editor_select
- homebrew
-)
-```
-
-Note: it should *not* be necessary to disable the default plugins! The above
-is an example only!
+Plugins are loaded when they are linked into the `$AXZSH/active_plugins/`
+directory.
+
+AX-ZSH doesn't use `~/.zshenv` in any way. So you can use this file for your
+own purposes (for example, to set up some environment variables that AX-ZSH
+relays on). In addition, AX-ZSH reads the optional files `~/.zprofile.local`,
+`~/.zshrc.local`, `~/.zlogin.local`, and `~/.zlogout.local` after its own
+core initialization files when present.
Environment Variables
# - $1: plugin name
# - $2: plugin type (optional; defaults to "zshrc")
function axzsh_load_plugin {
- plugin="$1"
+ dname="$(readlink "$1")" || dname="$1"
+ plugin="$(basename "$dname")"
[[ -z "$2" ]] && type="zshrc" || type="$2"
+ fname="$dname/$plugin.$type"
- for dname (
- "$AXZSH_PLUGIN_D/$plugin"
- "$ZSH_CUSTOM/$plugin"
- "$AXZSH/plugins/$plugin"
- "$AXZSH/default_plugins/$plugin"
- "$AXZSH/core/$plugin"
- ); do
- [[ ! -d "$dname" ]] && continue
-
- fname="$dname/$plugin.$type"
- if [[ ! -r "$fname" && "$type" == "zshrc" ]]; then
- if [[ -r "$dname/$plugin.plugin.zsh" ]]; then
- # Oh My ZSH plugin
- type="plugin.zsh"
- fname="$dname/$plugin.plugin.zsh"
- elif [[ -r "$dname/init.zsh" ]]; then
- # Prezto module
- type="init.zsh"
- fname="$dname/init.zsh"
- fi
+ if [[ ! -d "$dname" ]]; then
+ # Plugin not found!
+ if [[ -f "$HOME/.axzsh.debug" ]]; then
+ # Show error message for all stages in "debug mode":
+ echo "AX-ZSH plugin \"$plugin\" not found (type \"$type\")!" >&2
+ elif [[ "$type" == "zshrc" ]]; then
+ # Show error message for the "zshrc" stage:
+ echo "AX-ZSH plugin \"$plugin\" not found, skipped!" >&2
fi
+ return 1
+ fi
- if [[ -r "$fname" ]]; then
- [[ -f "$HOME/.axzsh.debug" ]] \
- && echo " - $plugin ($type) ..."
- source "$fname"
- return 0
+ if [[ ! -r "$fname" && "$type" == "zshrc" ]]; then
+ if [[ -r "$dname/$plugin.plugin.zsh" ]]; then
+ # Oh My ZSH plugin
+ type="plugin.zsh"
+ fname="$dname/$plugin.plugin.zsh"
+ elif [[ -r "$dname/init.zsh" ]]; then
+ # Prezto module
+ type="init.zsh"
+ fname="$dname/init.zsh"
fi
- return 0
- done
- # Plugin not found!
- if [[ -f "$HOME/.axzsh.debug" ]]; then
- # Show error message for all stages in "debug mode":
- echo "AX-ZSH plugin \"$plugin\" not found (type \"$type\")!" >&2
- elif [[ "$type" == "zshrc" ]]; then
- # Show error message for the "zshrc" stage:
- echo "AX-ZSH plugin \"$plugin\" not found, skipped!" >&2
fi
- return 1
+
+ if [[ -r "$fname" ]]; then
+ [[ -f "$HOME/.axzsh.debug" ]] \
+ && echo " - $plugin ($type) ..."
+ source "$fname"
+ fi
+
+ # It is a success, even if only the plugin directory (and no script!)
+ # exists at all! Rationale: The script could be of an other type ...
+ return 0
}
# Make sure that "AXZSH" variable is set and exported
fi
fi
-# Setup list of default plugins if not set already. This allows users to
-# overwrite this list in their "~/.zshenv" file, for example.
-typeset -U axzsh_default_plugins
-if ! typeset +m axzsh_default_plugins | fgrep array >/dev/null 2>&1; then
- axzsh_default_plugins=(
- $AXZSH/default_plugins/*
- )
-fi
-
# Setup list of plugins to load:
typeset -U plugin_list
plugin_list=(
- $AXZSH/core/[0-5]*
- $axzsh_default_plugins
- $axzsh_plugins
- $plugins
- $AXZSH/core/[6-9]*
+ "$AXZSH/core/"[0-5]*
+ "$AXZSH/active_plugins/"*
+ "$AXZSH/core/"[6-9]*
)
# Read in all the plugins for the current "type":
for plugin ($plugin_list); do
- axzsh_load_plugin "$(basename "$plugin")" "$script_type"
+ axzsh_load_plugin "$plugin" "$script_type"
done
unset script_name script_type plugin
unset plugin_list
--- /dev/null
+#!/bin/zsh
+#
+# AX-ZSH: Alex' Modular ZSH Configuration
+# Copyright (c) 2015 Alexander Barton <alex@barton.de>
+#
+
+function Usage {
+ echo "$NAME <command> [...]"
+ echo
+ echo " enable-plugin <p> [<p> [...]]"
+ echo " Enable plugin(s)."
+ echo
+ echo " disable-plugin <p> [<p> [...]]"
+ echo " Disable plugin(s)."
+ echo
+ echo " reset-plugins"
+ echo " Reset active plugins to the default list."
+ echo
+ exit 2
+}
+
+function Verbose {
+ echo "* $@"
+}
+
+function Warning {
+ echo "! $@"
+}
+
+function EnablePlugin {
+ local dir="$AXZSH/active_plugins"
+
+ if [[ -h "$dir/$1" ]]; then
+ Warning "Plugin \"$1\" already active!"
+ return 1
+ fi
+
+ for dname (
+ "$AXZSH_PLUGIN_D/$plugin"
+ "$ZSH_CUSTOM/$plugin"
+ "$AXZSH/plugins/$plugin"
+ "$AXZSH/default_plugins/$plugin"
+ "$AXZSH/core/$plugin"
+ ); do
+ [[ ! -d "$dname" ]] && continue
+ mkdir -p "$dir"
+ (
+ cd "$dir" || exit 9
+ ln -sv "$dname" "$PWD"
+ )
+ return $?
+ done
+
+ Warning "Plugin \"$1\" not found!"
+ return 1
+}
+
+function DisablePlugin {
+ local dir="$AXZSH/active_plugins"
+
+ if [[ ! -h "$dir/$1" ]]; then
+ Warning "Plugin \"$1\" not active?"
+ return 1
+ fi
+
+ rm -v "$dir/$1"
+ return $?
+}
+
+function ResetPlugins {
+ local dir="$AXZSH/active_plugins"
+
+ if [[ -e "$dir" ]]; then
+ Verbose "Removing all symbolic links in $dir ..."
+ find "$dir" -type l -print -delete
+ fi
+
+ Verbose "Activating (linking) default plugins ..."
+ mkdir -p "$dir"
+ (
+ cd "$dir" || exit 9
+ ln -sv "$AXZSH/default_plugins/"* "$PWD"
+ )
+ return $?
+}
+
+NAME="$(basename "$0")"
+
+[[ $# -gt 0 ]] || Usage
+
+if [[ -z "$AXZSH" || ! -d "$AXZSH" ]]; then
+ echo "$NAME: Oops, \"AXZSH\" is not set or invalid!"
+ exit 3
+fi
+
+cmd="$1"
+shift
+
+case "$cmd" in
+ "enable-plugin")
+ [[ $# -gt 0 ]] || Usage
+ for plugin in "$@"; do
+ EnablePlugin "$plugin"
+ done
+ ;;
+ "disable-plugin")
+ [[ $# -gt 0 ]] || Usage
+ for plugin in "$@"; do
+ DisablePlugin "$plugin"
+ done
+ ;;
+ "reset-plugins")
+ [[ $# -eq 0 ]] || Usage
+ ResetPlugins
+ ;;
+ *)
+ Usage
+esac
--- /dev/null
+# AX-ZSH: Alex' Modular ZSH Configuration
+# 50_axzsh.zshrc: Initialize AX-ZSH
+
+alias axzshctl="nocorrect zsh $AXZSH/bin/axzshctl"
safe_rm "$f" || exit 1
ln -sv "$AXZSH/ax.zsh" "$f" || exit 1
done
+
+if [ ! -d "$AXZSH/active_plugins" ]; then
+ echo "* Initializing plugin directory \"$AXZSH/active_plugins\" ..."
+ zsh "$AXZSH/bin/axzshctl" reset-plugins
+else
+ echo "* Plugin directory \"$AXZSH/active_plugins\" already exists. Ok."
+fi