Blame view
antigen.zsh
6.99 KB
|
e5dfac7ea
|
1 2 3 4 |
#!/bin/zsh # Each line in this string has the following entries separated by a space # character. |
|
280ec4481
|
5 |
# <repo-url>, <plugin-location>, <repo-local-clone-dir>, |
|
d535ba468
|
6 |
# <bundle-type> |
|
e5dfac7ea
|
7 |
# FIXME: Is not kept local by zsh! |
|
9dc631003
|
8 |
local _ANTIGEN_BUNDLE_RECORD="" |
|
e5dfac7ea
|
9 10 |
# Syntaxes |
|
280ec4481
|
11 |
# bundle <url> [<loc>=/] |
|
e5dfac7ea
|
12 13 14 15 16 |
bundle () {
# Bundle spec arguments' default values.
local url="$ANTIGEN_DEFAULT_REPO_URL"
local loc=/
|
|
d535ba468
|
17 |
local btype=plugin |
|
e5dfac7ea
|
18 19 |
# Set spec values based on the positional arguments.
|
|
280ec4481
|
20 |
local position_args='url loc' |
|
e5dfac7ea
|
21 22 |
local i=1
while ! [[ -z $1 || $1 == --*=* ]]; do
|
|
43bb2cef1
|
23 24 |
local arg_name="$(echo "$position_args" | cut -d\ -f$i)"
local arg_value="$1"
|
|
e5dfac7ea
|
25 26 27 28 |
eval "local $arg_name='$arg_value'"
shift
i=$(($i + 1))
done
|
|
1abf1faf6
|
29 30 31 32 33 |
# Check if url is just the plugin name. Super short syntax.
if [[ "$url" != */* ]]; then
loc="plugins/$url"
url="$ANTIGEN_DEFAULT_REPO_URL"
fi
|
|
e5dfac7ea
|
34 35 36 |
# Set spec values from keyword arguments, if any. The remaining arguments
# are all assumed to be keyword arguments.
while [[ $1 == --*=* ]]; do
|
|
43bb2cef1
|
37 38 |
local arg_name="$(echo "$1" | cut -d= -f1 | sed 's/^--//')"
local arg_value="$(echo "$1" | cut -d= -f2)"
|
|
e5dfac7ea
|
39 40 41 42 43 44 |
eval "local $arg_name='$arg_value'"
shift
done
# Resolve the url.
if [[ $url != git://* && $url != https://* ]]; then
|
|
bb140864c
|
45 |
url="${url%.git}"
|
|
bb140864c
|
46 |
url="https://github.com/$url.git" |
|
e5dfac7ea
|
47 48 49 |
fi
# Plugin's repo will be cloned here.
|
|
911cc8cb5
|
50 |
local clone_dir="$ADOTDIR/repos/$(echo "$url" \ |
|
e5dfac7ea
|
51 |
| sed -e 's/\.git$//' -e 's./.-SLASH-.g' -e 's.:.-COLON-.g')" |
|
e5dfac7ea
|
52 |
# Add it to the record. |
|
280ec4481
|
53 54 |
_ANTIGEN_BUNDLE_RECORD="$_ANTIGEN_BUNDLE_RECORD $url $loc $clone_dir $btype" |
|
e5dfac7ea
|
55 |
|
|
2ac7c0cb0
|
56 |
-antigen-ensure-repo "$url" "$clone_dir" |
|
c17d243a6
|
57 |
bundle-load "$clone_dir/$loc" "$btype" |
|
2ac7c0cb0
|
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
}
-antigen-ensure-repo () {
local update=false
if [[ $1 == --update ]]; then
update=true
shift
fi
local handled_repos=""
local install_bundles=""
local url="$1"
local clone_dir="$2"
if ! echo "$handled_repos" | grep -Fqm1 "$url"; then
if [[ ! -d $clone_dir ]]; then
git clone "$url" "$clone_dir"
elif $update; then
git --git-dir "$clone_dir/.git" pull
fi
handled_repos="$handled_repos
$url"
fi
|
|
e5dfac7ea
|
85 86 87 |
}
bundle-install () {
|
|
43bb2cef1
|
88 |
local update=false |
|
e5dfac7ea
|
89 |
if [[ $1 == --update ]]; then |
|
43bb2cef1
|
90 |
update=true |
|
64df9931b
|
91 |
shift |
|
e5dfac7ea
|
92 |
fi |
|
911cc8cb5
|
93 |
mkdir -p "$ADOTDIR/bundles" |
|
e5dfac7ea
|
94 95 |
local handled_repos=""
|
|
882de6912
|
96 |
local install_bundles="" |
|
e5dfac7ea
|
97 |
|
|
de4644c0f
|
98 99 100 |
if [[ $# != 0 ]]; then
# Record and install just the given plugin here and now.
bundle "$@"
|
|
9dc631003
|
101 |
install_bundles="$(-bundle-echo-record | tail -1)" |
|
de4644c0f
|
102 103 |
else
# Install all the plugins, previously recorded.
|
|
60d0dc571
|
104 |
install_bundles="$(-bundle-echo-record)" |
|
882de6912
|
105 |
fi |
|
de4644c0f
|
106 |
|
|
882de6912
|
107 108 |
# If the above `if` is directly piped to the below `while`, the contents
# inside the `if` construct are run in a new subshell, so changes to the
|
|
9dc631003
|
109 110 |
# `$_ANTIGEN_BUNDLE_RECORD` variable are lost after the `if` construct
# finishes. So, we need the temporary `$install_bundles` variable.
|
|
882de6912
|
111 |
echo "$install_bundles" | while read spec; do |
|
e5dfac7ea
|
112 113 114 115 116 |
local name="$(echo "$spec" | awk '{print $1}')"
local url="$(echo "$spec" | awk '{print $2}')"
local loc="$(echo "$spec" | awk '{print $3}')"
local clone_dir="$(echo "$spec" | awk '{print $4}')"
|
|
d535ba468
|
117 |
local btype="$(echo "$spec" | awk '{print $5}')"
|
|
e5dfac7ea
|
118 119 |
if [[ -z "$(echo "$handled_repos" | grep -Fm1 "$url")" ]]; then
|
|
78b101b2e
|
120 |
if [[ ! -d $clone_dir ]]; then |
|
e5dfac7ea
|
121 |
git clone "$url" "$clone_dir" |
|
78b101b2e
|
122 123 |
elif $update; then
git --git-dir "$clone_dir/.git" pull
|
|
e5dfac7ea
|
124 125 126 127 128 |
fi
handled_repos="$handled_repos
$url"
fi
|
|
d535ba468
|
129 |
bundle-load "$clone_dir/$loc" "$btype" |
|
e5dfac7ea
|
130 131 |
done
|
|
592f1460b
|
132 133 |
# Initialize completions after installing
bundle-apply
|
|
e5dfac7ea
|
134 |
} |
|
b05176f25
|
135 136 137 |
bundle-install! () {
bundle-install --update
}
|
|
d22fb4b90
|
138 |
bundle-cleanup () {
|
|
911cc8cb5
|
139 140 |
if [[ ! -d "$ADOTDIR/bundles" || \
"$(ls "$ADOTDIR/bundles/" | wc -l)" == 0 ]]; then
|
|
9dd10834e
|
141 142 143 |
echo "You don't have any bundles."
return 0
fi
|
|
911cc8cb5
|
144 |
# Find directores in ADOTDIR/bundles, that are not in the bundles record. |
|
d22fb4b90
|
145 |
local unidentified_bundles="$(comm -13 \ |
|
60d0dc571
|
146 |
<(-bundle-echo-record | awk '{print $1}' | sort) \
|
|
911cc8cb5
|
147 |
<(ls -1 "$ADOTDIR/bundles"))" |
|
d22fb4b90
|
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
if [[ -z $unidentified_bundles ]]; then
echo "You don't have any unidentified bundles."
return 0
fi
echo The following bundles are not recorded:
echo "$unidentified_bundles" | sed 's/^/ /'
echo -n '
Delete them all? [y/N] '
if read -q; then
echo
echo
echo "$unidentified_bundles" | while read name; do
echo -n Deleting $name...
|
|
911cc8cb5
|
164 |
rm -rf "$ADOTDIR/bundles/$name" |
|
d22fb4b90
|
165 166 167 168 169 170 171 |
echo ' done.'
done
else
echo
echo Nothing deleted.
fi
}
|
|
e5dfac7ea
|
172 |
bundle-load () {
|
|
e5dfac7ea
|
173 |
|
|
d535ba468
|
174 175 |
local location="$1"
local btype="$2"
|
|
e5dfac7ea
|
176 |
|
|
d535ba468
|
177 |
if [[ $btype == theme ]]; then |
|
e5dfac7ea
|
178 |
|
|
d535ba468
|
179 180 181 |
# Of course, if its a theme, the location would point to the script
# file.
source "$location"
|
|
e5dfac7ea
|
182 |
|
|
d535ba468
|
183 |
else |
|
e5dfac7ea
|
184 |
|
|
d535ba468
|
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
# Source the plugin script
# FIXME: I don't know. Looks very very ugly. Needs a better
# implementation once tests are ready.
local script_loc="$(ls "$location" | grep -m1 '.plugin.zsh$')"
if [[ -f $script_loc ]]; then
# If we have a `*.plugin.zsh`, source it.
source "$script_loc"
elif [[ ! -z "$(ls "$location" | grep -m1 '.zsh$')" ]]; then
# If there is no `*.plugin.zsh` file, source *all* the `*.zsh`
# files.
for script ($location/*.zsh) source "$script"
fi
# Add to $fpath, for completion(s)
fpath=($location $fpath)
fi
|
|
e5dfac7ea
|
202 |
|
|
e5dfac7ea
|
203 204 205 |
}
bundle-lib () {
|
|
d535ba468
|
206 |
bundle --loc=lib |
|
e5dfac7ea
|
207 208 209 210 211 |
}
bundle-theme () {
local url="$ANTIGEN_DEFAULT_REPO_URL"
local name="${1:-robbyrussell}"
|
|
d535ba468
|
212 |
bundle --loc=themes/$name.zsh-theme --btype=theme |
|
e5dfac7ea
|
213 |
} |
|
1af74ea9e
|
214 |
bundle-apply () {
|
|
e5dfac7ea
|
215 |
# Initialize completion. |
|
24fbcce0a
|
216 |
# TODO: Doesn't look like this is really necessary. Need to investigate. |
|
e5dfac7ea
|
217 218 |
compinit -i } |
|
df942673b
|
219 220 |
bundle-list () {
# List all currently installed bundles
|
|
9dc631003
|
221 |
if [[ -z "$_ANTIGEN_BUNDLE_RECORD" ]]; then |
|
df942673b
|
222 223 224 |
echo "You don't have any bundles." >&2
return 1
else
|
|
60d0dc571
|
225 |
-bundle-echo-record | awk '{print $1 " " $2 " " $3}'
|
|
df942673b
|
226 227 |
fi } |
|
bc9d20c7a
|
228 229 |
# Echo the bundle specs as in the record. The first line is not echoed since it # is a blank line. |
|
60d0dc571
|
230 |
-bundle-echo-record () {
|
|
9dc631003
|
231 |
echo "$_ANTIGEN_BUNDLE_RECORD" | sed -n '1!p' |
|
e5dfac7ea
|
232 233 234 |
}
-bundle-env-setup () {
|
|
3047bfeb7
|
235 |
# Pre-startup initializations |
|
e5dfac7ea
|
236 237 |
-set-default ANTIGEN_DEFAULT_REPO_URL \
https://github.com/robbyrussell/oh-my-zsh.git
|
|
911cc8cb5
|
238 |
-set-default ADOTDIR $HOME/.antigen |
|
3047bfeb7
|
239 240 241 242 243 244 |
# Load the compinit module
autoload -U compinit
# Without the following, `compdef` function is not defined.
compinit -i
|
|
e5dfac7ea
|
245 246 247 248 249 |
}
# Same as `export $1=$2`, but will only happen if the name specified by `$1` is
# not already set.
-set-default () {
|
|
43bb2cef1
|
250 251 |
local arg_name="$1"
local arg_value="$2"
|
|
e5dfac7ea
|
252 253 254 255 |
eval "test -z \"\$$arg_name\" && export $arg_name='$arg_value'" } -bundle-env-setup |