Commit e5dfac7ea364fb9312c7567c02bb7c4ed422fdf4
0 parents
Initial commit. Working prototype.
Showing 1 changed file with 204 additions and 0 deletions Inline Diff
antigen.zsh
| File was created | 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 | ||
| 205 |