X-Git-Url: https://arthur.barton.de/gitweb/?p=ax-zsh.git;a=blobdiff_plain;f=bin%2Faxzshctl;h=efc8a982f3d939f00ef8c13dc632c9067728046a;hp=c8aaf7da3e03cb62ad31223a8c81da759e80d35e;hb=HEAD;hpb=fea7687701a4988ffb67d1ed1d5ff32a8b97f5fb diff --git a/bin/axzshctl b/bin/axzshctl index c8aaf7d..943e464 100755 --- a/bin/axzshctl +++ b/bin/axzshctl @@ -1,7 +1,7 @@ #!/usr/bin/env zsh # # AX-ZSH: Alex' Modular ZSH Configuration -# Copyright (c) 2015-2020 Alexander Barton +# Copyright (c) 2015-2023 Alexander Barton # # Embedded ax-common compatibility functions ... @@ -22,12 +22,23 @@ function ax_error { function Version { echo "ax-zsh -- Modular configuration system for the Z shell (ZSH)" - echo "Copyright (c) 2015-2019 Alexander Barton ." + echo "Copyright (c) 2015-2023 Alexander Barton ." echo "Licensed under the terms of the MIT license, see LICENSE.md for details." echo "Homepage: " + echo + echo "Installation prefix: $AXZSH" + echo -n "Version: " if [[ -d "$AXZSH/.git" && -n "$commands[git]" ]]; then - echo -n "Version: Git ID " + echo -n "Git Commit-ID " ( cd "$AXZSH" && git describe --always ) + else + echo "unknown" + fi + echo -n "Active theme: " + if [[ -n "$AXZSH_THEME" ]]; then + echo "${AXZSH_THEME:A:t:r}" + else + echo "unknown" fi echo exit 0 @@ -47,6 +58,8 @@ function Usage { echo " Disable plugin(s)." echo " list-enabled" echo " List enabled plugins." + echo " plugin-help" + echo " Show help text for a plugin (when provided by the plugin)." echo echo " reset-plugins" echo " Reset active plugins to the default set." @@ -55,7 +68,7 @@ function Usage { echo " check-plugins" echo " Detect plugins which are \"useful\" on this system." echo - echo " set-theme |-" + echo " set-theme {|-}" echo " Set active theme to , or to the default." echo echo " upgrade" @@ -63,13 +76,25 @@ function Usage { echo " update-caches" echo " Force rebuild of all cache files." echo + echo " help" + echo " Show this help text." + echo " version" + echo " Show version and setup information." + echo exit 0 } function UpdatePluginCache { [[ -r "$AXZSH/cache" ]] || return 0 - [[ "$1" = "-v" ]] && ax_msg - "Updating plugin cache ..." + [[ "$1" = "-v" ]] && ax_msg - "Invalidating & updating caches ..." + + if [[ -d "$ZSH_CACHE_DIR" ]]; then + [[ "$1" = "-v" ]] && echo "Removing ZSH cache folder ..." + rm -fr "$ZSH_CACHE_DIR" + fi + + [[ "$1" = "-v" ]] && echo "Removing AX-ZSH cache files ..." rm -rf \ $AXZSH/cache/ax-io.cache \ $AXZSH/cache/zlogin.cache \ @@ -77,12 +102,15 @@ function UpdatePluginCache { $AXZSH/cache/zprofile.cache \ $AXZSH/cache/zshrc.cache \ || return 1 - echo "Regenerating cache files ..." - AXZSH_PLUGIN_CHECK=1 zsh -ilc '' >/dev/null + + echo "Regenerating AX-ZSH cache ..." + [[ -z "$AXZSH_DEBUG" ]] \ + && AXZSH_PLUGIN_CHECK=1 zsh -ilc '' >/dev/null \ + || AXZSH_PLUGIN_CHECK=1 zsh -ilc '' } function NormalizedPluginName { - if [[ "$1" =~ "^[[:alnum:]-]+/[[:alnum:]_-]+$" ]]; then + if [[ "$1" =~ "^@?[[:alnum:]-]+/[[:alnum:]_.-]+$" ]]; then echo "${1:gs/\//#}" elif [[ "$1" =~ "/" ]]; then echo "${1:t}" @@ -96,6 +124,10 @@ function EnableAXZSH { ln -s "$AXZSH/ax.zsh" "$f" \ || ax_error "Failed to create symbolic link for \"$f\"!" done + if [[ -z "$AXZSH_FPATH" ]]; then + echo "AX-ZSH was enabled. Now you should restart your shell, for example like this:" + echo "$ exec -l \"\$SHELL\"" + fi } function DisableAXZSH { @@ -113,13 +145,27 @@ function DisableAXZSH { function EnablePlugin { local plugin=$(NormalizedPluginName "$1") local dir="$AXZSH/active_plugins" + local name="$plugin" if [[ -h "$dir/$plugin" ]]; then ax_msg 1 "Plugin \"$1\" already active!" return 1 fi - if [[ "$1" =~ "^[[:alnum:]-]+/[[:alnum:]_-]+$" ]]; then + if [[ "$1" =~ "^@[[:alnum:]-]+/[[:alnum:]_.+-]+$" ]]; then + # GitHub plugin repository (like OhMyZsh) + local repo="${1##@}" + repo="${repo%/*}" + mkdir -p "$AXZSH/repos/@$repo" + if [[ ! -d "$AXZSH/repos/@$repo/plugins" ]]; then + ax_msg - "Cloning \"$repo\" from GitHub ..." + git clone --depth=1 "https://github.com/$repo/$repo.git" \ + "$AXZSH/repos/@$repo" \ + || ax_error "Failed to clone \"$repo\" repository!" + fi + plugin="@$repo/plugins/${1#*/}" + echo "Trying to enable \"$1\" ..." + elif [[ "$1" =~ "^[[:alnum:]-]+/[[:alnum:]_.-]+$" ]]; then # GitHub plugin mkdir -p "$AXZSH/repos" if [[ ! -e "$AXZSH/repos/$plugin" ]]; then @@ -138,6 +184,9 @@ function EnablePlugin { return 0 fi echo "Trying to enable \"$1\" as plugin ..." + elif ! [[ "$1" =~ "^[[:alnum:]_.-]+$" ]]; then + ax_error "Invalid plugin name!" + return 1 fi for dname ( @@ -154,12 +203,12 @@ function EnablePlugin { mkdir -p "$dir" if ! ( cd "$dir" || exit 9 - ln -s "$dname" "$PWD" + ln -s "$dname" "$PWD/$name" ); then ax_error "Failed to create link!" return 1 fi - ax_msg 0 "Plugin \"$plugin\" enabled." + ax_msg 0 "Plugin \"$1\" enabled." return 0 done @@ -203,6 +252,35 @@ function ListEnabledPlugins { return 0 } +function PluginHelp { + local plugin=$(NormalizedPluginName "$1") + local repo_plugin=$(echo "$plugin" | sed -e 's|#|/plugins/|') + local plugin_found= + + for plugin_d ( + "$plugin:A" + "$AXZSH/active_plugins/$plugin" + "$AXZSH/active_plugins/$repo_plugin" + "$AXZSH_PLUGIN_D/$plugin" + "$ZSH_CUSTOM/$plugin" + "$AXZSH/custom_plugins/$plugin" + "$AXZSH/repos/$plugin" + "$AXZSH/repos/$repo_plugin" + "$AXZSH/plugins/$plugin" + "$AXZSH/default_plugins/$plugin" + "$AXZSH/core/$plugin" + ); do + [[ -e "$plugin_d" ]] && plugin_found=1 + [[ -r "$plugin_d/README.md" ]] || continue + less "$plugin_d/README.md" + return 0 + done + [[ -n "$plugin_found" ]] \ + && echo "Plugin \"$1\" found, but no help available!" >&2 \ + || echo "Plugin \"$1\" not found!" >&2 + return 1 +} + function ResetPlugins { local dir="$AXZSH/active_plugins" local r1=0, r2=0 @@ -296,7 +374,12 @@ function UpgradeAXZSH { fi ax_msg - "Upgrading AX-ZSH in \"$AXZSH\" using git(1) ..." - ( cd "$AXZSH" && git pull --ff-only ) + ( + set -e + cd "$AXZSH" + git pull --ff-only || ax_error "Git pull failed!" + git log --pretty=format:"%C(yellow)%h %C(blue)%ar %C(green)%an %Creset%s" ORIG_HEAD.. + ) } function UpgradeForeignPlugins { @@ -310,8 +393,10 @@ function UpgradeForeignPlugins { if [[ -d "$dir/.git" ]]; then ax_msg - "Upgrading \"$name\" [git] ..." ( + set -e cd "$dir" - git pull --ff-only || ax_error "Pull failed!" + git pull --ff-only || ax_error "Git pull failed!" + git log --pretty=format:"%C(yellow)%h %C(blue)%ar %C(green)%an %Creset%s" ORIG_HEAD.. ) else ax_error "Unknown repository type!" @@ -330,9 +415,9 @@ function CheckPlugins { fi for p in $AXZSH/core/*/*.zshrc; do [[ "$(basename "$p")" == "01_zprofile.zshrc" ]] && continue - printf "# BEGIN: %s\nax_plugin_init()\n{\n" "$p" >>"$T" + printf "# BEGIN: %s\naxzsh_plugin_init()\n{\n" "$p" >>"$T" cat "$p" >>"$T" - printf "}\nax_plugin_init\n# END: %s\n\n" "$p" >>"$T" + printf "}\naxzsh_plugin_init\n# END: %s\n\n" "$p" >>"$T" done ax_msg - "Checking plugins ..." @@ -355,8 +440,8 @@ function CheckPlugins { ( AXZSH_PLUGIN_CHECK=1 source "$T" - ax_plugin_fnc() { source "$script" } - ax_plugin_fnc + axzsh_plugin_fnc() { source "$script" } + axzsh_plugin_fnc ); r=$? [[ $r -eq 0 ]] && new_plugin=$plugin break @@ -441,6 +526,10 @@ case "$cmd" in [[ $# -eq 0 ]] || Usage ListEnabledPlugins ;; + "plugin-help") + [[ $# -eq 1 ]] || Usage + PluginHelp "$1" + ;; "reset-plugins") [[ $# -eq 0 ]] || Usage ResetPlugins