@@ -53,7 +53,7 @@ function __%[1]s_perform_completion
53
53
__%[1]s_debug "last arg: $lastArg"
54
54
55
55
# Disable ActiveHelp which is not supported for fish shell
56
- set -l requestComp "%[9 ]s=0 $args[1] %[3]s $args[2..-1] $lastArg"
56
+ set -l requestComp "%[10 ]s=0 $args[1] %[3]s $args[2..-1] $lastArg"
57
57
58
58
__%[1]s_debug "Calling $requestComp"
59
59
set -l results (eval $requestComp 2> /dev/null)
@@ -89,6 +89,60 @@ function __%[1]s_perform_completion
89
89
printf "%%s\n" "$directiveLine"
90
90
end
91
91
92
+ # this function limits calls to __%[1]s_perform_completion, by caching the result behind $__%[1]s_perform_completion_once_result
93
+ function __%[1]s_perform_completion_once
94
+ __%[1]s_debug "Starting __%[1]s_perform_completion_once"
95
+
96
+ if test -n "$__%[1]s_perform_completion_once_result"
97
+ __%[1]s_debug "Seems like a valid result already exists, skipping __%[1]s_perform_completion"
98
+ return 0
99
+ end
100
+
101
+ set --global __%[1]s_perform_completion_once_result (__%[1]s_perform_completion)
102
+ if test -z "$__%[1]s_perform_completion_once_result"
103
+ __%[1]s_debug "No completions, probably due to a failure"
104
+ return 1
105
+ end
106
+
107
+ __%[1]s_debug "Performed completions and set __%[1]s_perform_completion_once_result"
108
+ return 0
109
+ end
110
+
111
+ # this function is used to clear the $__%[1]s_perform_completion_once_result variable after completions are run
112
+ function __%[1]s_clear_perform_completion_once_result
113
+ __%[1]s_debug ""
114
+ __%[1]s_debug "========= clearing previously set __%[1]s_perform_completion_once_result variable =========="
115
+ set --erase __%[1]s_perform_completion_once_result
116
+ __%[1]s_debug "Succesfully erased the variable __%[1]s_perform_completion_once_result"
117
+ end
118
+
119
+ function __%[1]s_requires_order_preservation
120
+ __%[1]s_debug ""
121
+ __%[1]s_debug "========= checking if order preservation is required =========="
122
+
123
+ __%[1]s_perform_completion_once
124
+ if test -z "$__%[1]s_perform_completion_once_result"
125
+ __%[1]s_debug "Error determining if order preservation is required"
126
+ return 1
127
+ end
128
+
129
+ set -l directive (string sub --start 2 $__%[1]s_perform_completion_once_result[-1])
130
+ __%[1]s_debug "Directive is: $directive"
131
+
132
+ set -l shellCompDirectiveKeepOrder %[9]d
133
+ set -l keeporder (math (math --scale 0 $directive / $shellCompDirectiveKeepOrder) %% 2)
134
+ __%[1]s_debug "Keeporder is: $keeporder"
135
+
136
+ if test $keeporder -ne 0
137
+ __%[1]s_debug "This does require order preservation"
138
+ return 0
139
+ end
140
+
141
+ __%[1]s_debug "This doesn't require order preservation"
142
+ return 1
143
+ end
144
+
145
+
92
146
# This function does two things:
93
147
# - Obtain the completions and store them in the global __%[1]s_comp_results
94
148
# - Return false if file completion should be performed
@@ -99,17 +153,17 @@ function __%[1]s_prepare_completions
99
153
# Start fresh
100
154
set --erase __%[1]s_comp_results
101
155
102
- set -l results ( __%[1]s_perform_completion)
103
- __%[1]s_debug "Completion results: $results "
156
+ __%[1]s_perform_completion_once
157
+ __%[1]s_debug "Completion results: $__%[1]s_perform_completion_once_result "
104
158
105
- if test -z "$results "
159
+ if test -z "$__%[1]s_perform_completion_once_result "
106
160
__%[1]s_debug "No completion, probably due to a failure"
107
161
# Might as well do file completion, in case it helps
108
162
return 1
109
163
end
110
164
111
- set -l directive (string sub --start 2 $results [-1])
112
- set --global __%[1]s_comp_results $results [1..-2]
165
+ set -l directive (string sub --start 2 $__%[1]s_perform_completion_once_result [-1])
166
+ set --global __%[1]s_comp_results $__%[1]s_perform_completion_once_result [1..-2]
113
167
114
168
__%[1]s_debug "Completions are: $__%[1]s_comp_results"
115
169
__%[1]s_debug "Directive is: $directive"
@@ -205,13 +259,17 @@ end
205
259
# Remove any pre-existing completions for the program since we will be handling all of them.
206
260
complete -c %[2]s -e
207
261
262
+ # this will get called after the two calls below and clear the $__%[1]s_perform_completion_once_result global
263
+ complete -c %[2]s -n '__%[1]s_clear_perform_completion_once_result'
208
264
# The call to __%[1]s_prepare_completions will setup __%[1]s_comp_results
209
265
# which provides the program's completion choices.
210
- complete -c %[2]s -n '__%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results'
211
-
266
+ # If this doesn't require order preservation, we don't use the -k flag
267
+ complete -c %[2]s -n 'not __%[1]s_requires_order_preservation && __%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results'
268
+ # otherwise we use the -k flag
269
+ complete -k -c %[2]s -n '__%[1]s_requires_order_preservation && __%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results'
212
270
` , nameForVar , name , compCmd ,
213
271
ShellCompDirectiveError , ShellCompDirectiveNoSpace , ShellCompDirectiveNoFileComp ,
214
- ShellCompDirectiveFilterFileExt , ShellCompDirectiveFilterDirs , activeHelpEnvVar (name )))
272
+ ShellCompDirectiveFilterFileExt , ShellCompDirectiveFilterDirs , ShellCompDirectiveKeepOrder , activeHelpEnvVar (name )))
215
273
}
216
274
217
275
// GenFishCompletion generates fish completion file and writes to the passed writer.
0 commit comments