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 |