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 |