@@ -53,7 +53,7 @@ function __%[1]s_perform_completion
5353 __%[1]s_debug "last arg: $lastArg"
5454
5555 # 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"
5757
5858 __%[1]s_debug "Calling $requestComp"
5959 set -l results (eval $requestComp 2> /dev/null)
@@ -89,6 +89,60 @@ function __%[1]s_perform_completion
8989 printf "%%s\n" "$directiveLine"
9090end
9191
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+
92146# This function does two things:
93147# - Obtain the completions and store them in the global __%[1]s_comp_results
94148# - Return false if file completion should be performed
@@ -99,17 +153,17 @@ function __%[1]s_prepare_completions
99153 # Start fresh
100154 set --erase __%[1]s_comp_results
101155
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 "
104158
105- if test -z "$results "
159+ if test -z "$__%[1]s_perform_completion_once_result "
106160 __%[1]s_debug "No completion, probably due to a failure"
107161 # Might as well do file completion, in case it helps
108162 return 1
109163 end
110164
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]
113167
114168 __%[1]s_debug "Completions are: $__%[1]s_comp_results"
115169 __%[1]s_debug "Directive is: $directive"
@@ -205,13 +259,17 @@ end
205259# Remove any pre-existing completions for the program since we will be handling all of them.
206260complete -c %[2]s -e
207261
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'
208264# The call to __%[1]s_prepare_completions will setup __%[1]s_comp_results
209265# 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'
212270` , nameForVar , name , compCmd ,
213271 ShellCompDirectiveError , ShellCompDirectiveNoSpace , ShellCompDirectiveNoFileComp ,
214- ShellCompDirectiveFilterFileExt , ShellCompDirectiveFilterDirs , activeHelpEnvVar (name )))
272+ ShellCompDirectiveFilterFileExt , ShellCompDirectiveFilterDirs , ShellCompDirectiveKeepOrder , activeHelpEnvVar (name )))
215273}
216274
217275// GenFishCompletion generates fish completion file and writes to the passed writer.
0 commit comments