-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmarkgate.zsh
142 lines (121 loc) · 3.03 KB
/
markgate.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/bin/zsh
#-------------------#
# GENERAL VARIABLES #
#-------------------#
_MARKGATE_CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/markgate"
[ -f "$_MARKGATE_CACHE" ] || touch $_MARKGATE_CACHE
#-------------#
# HELP DIALOG #
#-------------#
gh(){
while read ;do
printf "%s\n" "$REPLY"
done <<-HELP
MarkGate: Mark your Directories for easy access
FUNCTION:
ga <name> <DIR> Add new mark to Markgate
gj <name> Jumb to giving mark
gr <name> ... Remove one or multi Marks
gs <name> ... Display list of marks
gh Show this help dialog
HELP
return 0
}
#--------------#
# ADD NEW MARK #
#--------------#
ga(){
(( $# > 2 )) && gh
name="$1"
dir="$2"
if [ ! -d "$dir" ]; then
printf "%s\n" "MarkGate: '$dir' No Such directory " >&2
return 2
fi
while IFS=':' read -A line ;do
if [ "$line[1]" = "$name" ]; then
printf "%s\n" "MarkGate: '$name' Mark already Exist" >&2
return 2
elif [ "$line[2]" = "$dir" ]; then
printf "%s\n" "MarkGate: '$dir' Directory already marked as '$line[1]'" >&2
return 2
fi
done < $_MARKGATE_CACHE
printf "%s:%s\n" "$name" "$dir" >> $_MARKGATE_CACHE
printf "%s\n" "MarkGate: '$name' Mark created "
unset name dir line
}
#----------------#
# JUMB TO A MARK #
#----------------#
gj(){
(( $# > 1 )) && gh
name="$1"
while IFS=':' read -A line ;do
if [ "$line[1]" = "$name" ]; then
builtin cd "$line[2]"
Jumb=true
break
fi
done < $_MARKGATE_CACHE
if [ -z "$Jumb" ]; then
printf "%s\n" "MarkGate: '$name' No such Mark"
return 2
fi
unset line Jumb
}
#---------------#
# REMOVE A MARK #
#---------------#
gr(){
[ -z "$1" ] && gh
for name in $@ ; do
while IFS=":" read -A line ;do
if [ "$line[1]" = "$name" ]; then
sed -i "/^$name/d" $_MARKGATE_CACHE
printf "%s\n" "'$name' Remove Mark"
Remove=true
break
fi
done < $_MARKGATE_CACHE
if [ -z "$Remove" ]; then
printf "%s\n" "MarkGate: '$name' No such Mark"
fi
unset Remove
done
unset line name
}
#--------------------#
# SHOW LIST OF MARKS #
#--------------------#
gs(){
if [ -z "$1" ]; then
column -t -s ':' $_MARKGATE_CACHE
else
for name in $@ ;do
while IFS=':' read -A line ; do
if [[ $line[1] =~ $name ]]; then
printf "%s %15s" "$line[1]" "$line[2]"
fi
done < $_MARKGATE_CACHE
done
fi
}
#----------------#
# ZSH COMPLETION #
#----------------#
_markgate(){
while IFS=':' read -A line ; do
ListMark+=( "$line[1]" )
done < $_MARKGATE_CACHE
if (( ${#ListMark[@]} > 0 )); then
reply=( ${ListMark[@]} )
fi
unset line ListMark
}
#------------------#
# APPLY COMPLETION #
#------------------#
compctl -K _markgate gj
compctl -K _markgate gr
compctl -K _markgate gs