feat(comp): Add completion for fish shell

Signed-off-by: Marc Khouzam <marc.khouzam@montreal.ca>
pull/7690/head
Marc Khouzam 6 years ago
parent 7dfd3d11f6
commit 0de8672adc

@ -23,10 +23,12 @@ import (
"github.com/pkg/errors"
"github.com/spf13/cobra"
"helm.sh/helm/v3/internal/completion"
)
const completionDesc = `
Generate autocompletions script for Helm for the specified shell (bash or zsh).
Generate autocompletions script for Helm for the specified shell (bash, zsh or fish).
This command can generate shell autocompletions. e.g.
@ -41,6 +43,7 @@ var (
completionShells = map[string]func(out io.Writer, cmd *cobra.Command) error{
"bash": runCompletionBash,
"zsh": runCompletionZsh,
"fish": runCompletionFish,
}
)
@ -52,7 +55,7 @@ func newCompletionCmd(out io.Writer) *cobra.Command {
cmd := &cobra.Command{
Use: "completion SHELL",
Short: "Generate autocompletions script for the specified shell (bash or zsh)",
Short: "Generate autocompletions script for the specified shell (bash, zsh or fish)",
Long: completionDesc,
RunE: func(cmd *cobra.Command, args []string) error {
return runCompletion(out, cmd, args)
@ -244,3 +247,86 @@ __helm_bash_source <(__helm_convert_bash_to_zsh)
out.Write([]byte(zshTail))
return nil
}
func runCompletionFish(out io.Writer, cmd *cobra.Command) error {
fishScript := fmt.Sprintf(`# fish completion for helm -*- shell-script -*-
function __helm_debug
set file "$BASH_COMP_DEBUG_FILE"
if test -n "$file"
echo "$argv" >> $file
end
end
function __helm_handle_completion
__helm_debug "Starting __helm_handle_completion with: $argv"
set -l args (string split " " "$argv")
__helm_debug "last arg: $args[-1]"
set -l emptyArg ""
if test -z "$args[-1]"
__helm_debug "Setting emptyArg"
set emptyArg \"\"
end
__helm_debug "emptyArg: $emptyArg"
set requestComp "$args[1] __complete $args[2..-1] $emptyArg"
__helm_debug "Calling $requestComp"
eval $requestComp 2> /dev/null
end
function __helm_get_completions
# Use the cache if possible
if not set -q __helm_cache_completions
set -g __helm_cache_completions (__helm_handle_completion (commandline))
__helm_debug "Populating completion cache with: $__helm_cache_completions"
end
set -l directive (string sub --start 2 $__helm_cache_completions[-1])
set -l comps $__helm_cache_completions[1..-2]
__helm_debug "Completions are: $comps"
__helm_debug "Directive is: $directive"
set -l compErr (math (math $directive / %[1]d) %% 2)
if test $compErr -eq 1
return 0
end
set -l nospace (math (math $directive / %[2]d) %% 2)
set -l nofiles (math (math $directive / %[3]d) %% 2)
__helm_debug "nospace: $nospace, nofiles: $nofiles"
for i in $comps
printf "%%s\n" $i
end
if test (count $comps) -eq 1; and test $nospace -ne 0
# To support the "nospace" directive we trick the shell
# by outputting an extra, longer completion.
printf "%%s\n" $comps[1].
end
# Return true if no file completion should be done
test (count $comps) -gt 0; or test $nofiles -ne 0
end
# Remove any pre-existing helm completions since we will be handling all of them
complete -c helm -e
# The order in which the below two lines are defined is very important so that the cache gets
# properly cleared at the very beginning of completions processing
#
# This completion will be run second as complete commands are added FILO. It should use the cache.
complete -c helm -n 'not __helm_get_completions'
# This completion will be run first as complete commands are added FILO. It first clears the cache.
complete -c helm -n 'set -e __helm_cache_completions; __helm_get_completions' -f -a '(__helm_get_completions)'
`, completion.BashCompDirectiveError, completion.BashCompDirectiveNoSpace, completion.BashCompDirectiveNoFileComp)
out.Write([]byte(fishScript))
return nil
}

Loading…
Cancel
Save