Commit e5dfac7ea364fb9312c7567c02bb7c4ed422fdf4
0 parents
Initial commit. Working prototype.
Showing 1 changed file with 204 additions and 0 deletions Side-by-side Diff
antigen.zsh
| ... | ... | @@ -0,0 +1,204 @@ |
| 1 | +#!/bin/zsh | |
| 2 | + | |
| 3 | +# Each line in this string has the following entries separated by a space | |
| 4 | +# character. | |
| 5 | +# <bundle-name>, <repo-url>, <plugin-location>, <repo-local-clone-dir> | |
| 6 | +# FIXME: Is not kept local by zsh! | |
| 7 | +local bundles="" | |
| 8 | + | |
| 9 | +# Syntaxes | |
| 10 | +# bundle <url> [<loc>=/] [<name>] | |
| 11 | +bundle () { | |
| 12 | + | |
| 13 | + # Bundle spec arguments' default values. | |
| 14 | + local url="$ANTIGEN_DEFAULT_REPO_URL" | |
| 15 | + local loc=/ | |
| 16 | + local name= | |
| 17 | + local load=true | |
| 18 | + | |
| 19 | + # Set spec values based on the positional arguments. | |
| 20 | + local position_args='url loc name' | |
| 21 | + local i=1 | |
| 22 | + while ! [[ -z $1 || $1 == --*=* ]]; do | |
| 23 | + arg_name="$(echo "$position_args" | cut -d\ -f$i)" | |
| 24 | + arg_value="$1" | |
| 25 | + eval "local $arg_name='$arg_value'" | |
| 26 | + shift | |
| 27 | + i=$(($i + 1)) | |
| 28 | + done | |
| 29 | + | |
| 30 | + # Set spec values from keyword arguments, if any. The remaining arguments | |
| 31 | + # are all assumed to be keyword arguments. | |
| 32 | + while [[ $1 == --*=* ]]; do | |
| 33 | + arg_name="$(echo "$1" | cut -d= -f1 | sed 's/^--//')" | |
| 34 | + arg_value="$(echo "$1" | cut -d= -f2)" | |
| 35 | + eval "local $arg_name='$arg_value'" | |
| 36 | + shift | |
| 37 | + done | |
| 38 | + | |
| 39 | + # Resolve the url. | |
| 40 | + if [[ $url != git://* && $url != https://* ]]; then | |
| 41 | + url="https://github.com/$url.git" | |
| 42 | + name="$(basename "$url")" | |
| 43 | + fi | |
| 44 | + | |
| 45 | + # Plugin's repo will be cloned here. | |
| 46 | + local clone_dir="$ANTIGEN_REPO_CACHE/$(echo "$url" \ | |
| 47 | + | sed -e 's/\.git$//' -e 's./.-SLASH-.g' -e 's.:.-COLON-.g')" | |
| 48 | + | |
| 49 | + # Make an intelligent guess about the name of the plugin, if not already | |
| 50 | + # done or is explicitly specified. | |
| 51 | + if [[ -z $name ]]; then | |
| 52 | + name="$(basename $url/$loc)" | |
| 53 | + fi | |
| 54 | + | |
| 55 | + # Add it to the record. | |
| 56 | + bundles="$bundles\n$name $url $loc $clone_dir" | |
| 57 | + | |
| 58 | + # Load it, unless specified otherwise. | |
| 59 | + if $load; then | |
| 60 | + bundle-load "$name" | |
| 61 | + fi | |
| 62 | +} | |
| 63 | + | |
| 64 | +bundle-install () { | |
| 65 | + | |
| 66 | + if [[ $1 == --update ]]; then | |
| 67 | + local update=true | |
| 68 | + else | |
| 69 | + local update=false | |
| 70 | + fi | |
| 71 | + | |
| 72 | + mkdir -p "$ANTIGEN_BUNDLE_DIR" | |
| 73 | + | |
| 74 | + local handled_repos="" | |
| 75 | + | |
| 76 | + echo-non-empty "$bundles" | while read spec; do | |
| 77 | + | |
| 78 | + local name="$(echo "$spec" | awk '{print $1}')" | |
| 79 | + local url="$(echo "$spec" | awk '{print $2}')" | |
| 80 | + local loc="$(echo "$spec" | awk '{print $3}')" | |
| 81 | + local clone_dir="$(echo "$spec" | awk '{print $4}')" | |
| 82 | + | |
| 83 | + if [[ -z "$(echo "$handled_repos" | grep -Fm1 "$url")" ]]; then | |
| 84 | + if [[ -d $clone_dir ]]; then | |
| 85 | + git --git-dir "$clone_dir/.git" pull | |
| 86 | + else | |
| 87 | + git clone "$url" "$clone_dir" | |
| 88 | + fi | |
| 89 | + | |
| 90 | + handled_repos="$handled_repos\n$url" | |
| 91 | + fi | |
| 92 | + | |
| 93 | + if [[ $name != *.theme ]]; then | |
| 94 | + cp -R "$clone_dir/$loc" "$ANTIGEN_BUNDLE_DIR/$name" | |
| 95 | + else | |
| 96 | + mkdir -p "$ANTIGEN_BUNDLE_DIR/$name" | |
| 97 | + cp "$clone_dir/$loc" "$ANTIGEN_BUNDLE_DIR/$name" | |
| 98 | + fi | |
| 99 | + | |
| 100 | + bundle-load "$name" | |
| 101 | + | |
| 102 | + done | |
| 103 | + | |
| 104 | +} | |
| 105 | + | |
| 106 | +bundle-load () { | |
| 107 | + if [[ $1 == --init ]]; then | |
| 108 | + do_init=true | |
| 109 | + shift | |
| 110 | + else | |
| 111 | + do_init=false | |
| 112 | + fi | |
| 113 | + | |
| 114 | + name="$1" | |
| 115 | + bundle_dir="$ANTIGEN_BUNDLE_DIR/$name" | |
| 116 | + | |
| 117 | + # Source the plugin script | |
| 118 | + script_loc="$bundle_dir/$name.plugin.zsh" | |
| 119 | + if [[ -f $script_loc ]]; then | |
| 120 | + source "$script_loc" | |
| 121 | + fi | |
| 122 | + | |
| 123 | + # If the name of the plugin ends with `.lib`, all the *.zsh files in it are | |
| 124 | + # sourced. This is kind of a hack to source the libraries of oh-my-zsh. | |
| 125 | + if [[ $name == *.lib ]]; then | |
| 126 | + # FIXME: This throws an error if no files match the given glob pattern. | |
| 127 | + for lib ($bundle_dir/*.zsh) source $lib | |
| 128 | + fi | |
| 129 | + | |
| 130 | + # If the name ends with `.theme`, it is handled as if it were a zsh-theme | |
| 131 | + # plugin. | |
| 132 | + if [[ $name == *.theme ]]; then | |
| 133 | + source "$bundle_dir/${name%.theme}.zsh-theme" | |
| 134 | + fi | |
| 135 | + | |
| 136 | + # Add to $fpath, if it provides completion | |
| 137 | + if [[ -f "$bundle_dir/_$name" ]]; then | |
| 138 | + fpath=($bundle_dir $fpath) | |
| 139 | + fi | |
| 140 | + | |
| 141 | + if $do_init; then | |
| 142 | + bundle-init | |
| 143 | + fi | |
| 144 | +} | |
| 145 | + | |
| 146 | +bundle-lib () { | |
| 147 | + bundle --name=oh-my-zsh.lib --loc=lib | |
| 148 | +} | |
| 149 | + | |
| 150 | +bundle-theme () { | |
| 151 | + local url="$ANTIGEN_DEFAULT_REPO_URL" | |
| 152 | + local name="${1:-robbyrussell}" | |
| 153 | + bundle "$url" --name=$name.theme --loc=themes/$name.zsh-theme | |
| 154 | +} | |
| 155 | + | |
| 156 | +bundle-init () { | |
| 157 | + # Initialize completion. | |
| 158 | + # FIXME: Ensure this runs only once. | |
| 159 | + autoload -U compinit | |
| 160 | + compinit -i | |
| 161 | +} | |
| 162 | + | |
| 163 | +# A python command wrapper. Almost the same as `python -c`, but dedents the | |
| 164 | +# source string. | |
| 165 | +py () { | |
| 166 | + code="$1" | |
| 167 | + | |
| 168 | + # Find indentation from first line. | |
| 169 | + indent="$(echo "$code" | grep -m1 -v '^$' | grep -o '^\s*' | wc -c)" | |
| 170 | + | |
| 171 | + # Strip that many spaces in the start from each line. | |
| 172 | + if [[ $indent != 0 ]]; then | |
| 173 | + indent=$(($indent - 1)) | |
| 174 | + code="$(echo "$code" | sed "s/^\s\{$indent\}//")" | |
| 175 | + fi | |
| 176 | + | |
| 177 | + # Run the piece of code. | |
| 178 | + python -c "$code" | |
| 179 | +} | |
| 180 | + | |
| 181 | +# Does what it says. | |
| 182 | +echo-non-empty () { | |
| 183 | + echo "$@" | while read line; do | |
| 184 | + [[ $line != "" ]] && echo $line | |
| 185 | + done | |
| 186 | +} | |
| 187 | + | |
| 188 | +-bundle-env-setup () { | |
| 189 | + -set-default ANTIGEN_DEFAULT_REPO_URL \ | |
| 190 | + https://github.com/robbyrussell/oh-my-zsh.git | |
| 191 | + -set-default ANTIGEN_REPO_CACHE $HOME/.antigen/cache | |
| 192 | + -set-default ANTIGEN_BUNDLE_DIR $HOME/.antigen/bundles | |
| 193 | +} | |
| 194 | + | |
| 195 | +# Same as `export $1=$2`, but will only happen if the name specified by `$1` is | |
| 196 | +# not already set. | |
| 197 | +-set-default () { | |
| 198 | + arg_name="$1" | |
| 199 | + arg_value="$2" | |
| 200 | + eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'" | |
| 201 | +} | |
| 202 | + | |
| 203 | +-bundle-env-setup | |
| 204 | +bundle-init |