-
Notifications
You must be signed in to change notification settings - Fork 0
/
cute-dot.zsh
79 lines (63 loc) · 1.71 KB
/
cute-dot.zsh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/bin/zsh
setopt null_glob extended_glob
CYAN='\033[0;36m'
NC='\033[0m' # No Color
DOT_DIR=${0:a:h} # the directory of this script
pf_loc=() # profile locations
pf_pat=() # profile patterns
declare -A pf_map # <pf-name> : <idxes>
_add-pf() { # <pf-name> {<pf-loc> <pf-pat>}...
local name=${1%.pf}
for i in {2..$#@..2}; {
pf_loc+=($@[i])
pf_pat+=($@[i+1])
pf_map[$name]+="$#pf_loc "
}
}
alias -s pf='_add-pf'
_rsync-pat() { # <src> <dst> <pat>
cd $1 && rsync $=rsync_opt --relative $~=3 $2/
}
_sync() { # <pf-name>
for i in $=pf_map[$1]; {
local changes=$(_rsync-pat $pf_loc[i] $DOT_DIR/$1 $pf_pat[i])
if [[ $changes != '' ]] {
echo $CYAN"$1 <- ${(D)pf_loc[i]}"$NC
echo $changes
echo
}
}
}
_apply() { # <pf-name>
for i in $=pf_map[$1]; {
local changes=$(_rsync-pat $DOT_DIR/$1 $pf_loc[i] $pf_pat[i])
if [[ $changes != '' ]] {
echo $CYAN"$1 -> ${(D)pf_loc[i]}"$NC
echo $changes
echo
}
}
}
_for-each-pf() { # <func> [--all | <pf-name>...]
local func=$1; shift
if [[ $1 == --all ]] {
for i in ${(k)pf_map}; $func $i
} else {
for i in ${(u)@}; $func $i
}
}
cute-dot-list() { printf '%s\n' ${(ko)pf_map} }
cute-dot-sync() { _for-each-pf _sync $@ }
cute-dot-apply() { _for-each-pf _apply $@ }
# =============================== Config Begin =============================== #
# Rsync Options
rsync_opt='-rci --mkpath'
# Profile List
#
# Example:
#
# zsh.pf \
# ~ '.zshenv' \
# ~/.config/zsh '.zshrc *.zsh */^*.zwc'
# ================================ Config End ================================ #
cute-dot-$1 ${@:2}