-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompleter-lib.sh
168 lines (139 loc) · 3.39 KB
/
completer-lib.sh
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/usr/bin/env bash
readonly COMPLETION_FOLDER=$HOME/.bash-completer
readonly PROGRAMS_FOLDER=$COMPLETION_FOLDER/programs
# create the appropriate env for the completion system
# $1 program name
install() {
local program=$1
mkdir -p $PROGRAMS_FOLDER/$program
return 0
}
# $1 program name
createEnv() {
local program=$1
install $program
return 0
}
# Gets the stream name where completion will be stored
# $1 program name
# $2 context
getStream() {
echo "$PROGRAMS_FOLDER/$1/$2.cpl"
return 0
}
# Prints the current version of bash-completer
printVersion() {
cat "$COMPLETION_FOLDER/VERSION"
}
# Records values for completion for a program in a specific context
# $1 program name
# $2 context
# $@ values
record() {
local readonly program="$1"
local readonly context="$2"
shift 2
createEnv $program
local readonly stream="$(getStream $program $context)"
# Clear stream from previous values
> $stream
for value in $@
do
echo $value >> $stream
done
return 0
}
# Checks if the recorded completion is up-to-date
# $1 program name
# $2 context
checkCompletion() {
local readonly program="$1"
local readonly context="$2"
local readonly stream="$(getStream $program $context)"
[ ! -e $stream ] && stream=''
local readonly casedContext=${context//-/@}
$program --__complete "$casedContext" --__stream "$stream"
return $?
}
# Checks if the recorded completion is up-to-date
# $1 program name
# $2 context
getCompletion() {
local readonly program="$1"
local readonly context="$2"
local readonly stream="$(getStream $program $context)"
if [ -e $stream ]
then
cat $stream
return 0
else
return 1
fi
}
# Checks if the recorded completion is up-to-date
# $1 program name
# $2 context
doCompletion() {
local readonly program="$1"
local readonly context="$2"
values=$(checkCompletion $program $context)
exitCode=$?
# it fails or there is no completion to expect
[[ $exitCode > 2 ]] && exit $exitCode
if [ $exitCode -eq 2 ]
then
echo $values
return 0
else
if [ $exitCode -eq 1 ]
then
record $program $context $values
echo $values
return 0
else
getCompletion $program $context
return $?
fi
fi
}
readonly REGISTRATION_FILE=$COMPLETION_FOLDER/__registered-programs
# Registers a program for completion
# $1 program
register() {
local readonly program="$1"
[ -e $REGISTRATION_FILE ] && presence=$(grep -cE "program:${program}$" $REGISTRATION_FILE) || presence=0
# Add the program to the list
[[ $presence = 0 ]] && echo "complete -F __completer $program # program:$program" >> $REGISTRATION_FILE
return 0
}
# Registers a program for completion
# $1 program
unregister() {
[ ! -e $REGISTRATION_FILE ] && return 0
local readonly program="$1"
local readonly nbOfRemainingLines=$(grep -cvE "^.*# program:${program}$" $REGISTRATION_FILE)
if [[ $nbOfRemainingLines = 0 ]]
then
> $REGISTRATION_FILE
else
local clearFile=0
while read line
do
[[ $clearFile = 0 ]] && clearFile=1 && > $REGISTRATION_FILE
echo $line >> $REGISTRATION_FILE
done < <(grep -vE "^.*# program:${program}$" $REGISTRATION_FILE)
fi
return 0
}
listRecordedPrograms() {
local programs=
[ -e "$REGISTRATION_FILE" ] && programs=$(cat "$REGISTRATION_FILE")
if [ -n "$programs" ]
then
echo $programs
else
echo 'No program registered'
fi
}
# local variables
# mode: shell-script