diff --git a/shell-integration/fish/vendor_completions.d/clone-in-kitty.fish b/shell-integration/fish/vendor_completions.d/clone-in-kitty.fish index 6da0144a5..168708df8 100644 --- a/shell-integration/fish/vendor_completions.d/clone-in-kitty.fish +++ b/shell-integration/fish/vendor_completions.d/clone-in-kitty.fish @@ -1,7 +1,7 @@ function __ksi_completions set --local ct (commandline --current-token) set --local tokens (commandline --tokenize --cut-at-cursor --current-process) - printf "%s\n" $tokens $ct | command kitty +complete fish2 + printf "%s\n" $tokens $ct | command kitty-tool __complete__ fish end complete -f -c clone-in-kitty -a "(__ksi_completions)" diff --git a/shell-integration/fish/vendor_completions.d/edit-in-kitty.fish b/shell-integration/fish/vendor_completions.d/edit-in-kitty.fish index 153490453..eac30a1ca 100644 --- a/shell-integration/fish/vendor_completions.d/edit-in-kitty.fish +++ b/shell-integration/fish/vendor_completions.d/edit-in-kitty.fish @@ -1,7 +1,7 @@ function __ksi_completions set --local ct (commandline --current-token) set --local tokens (commandline --tokenize --cut-at-cursor --current-process) - printf "%s\n" $tokens $ct | command kitty +complete fish2 + printf "%s\n" $tokens $ct | command kitty-tool __complete__ fish end complete -f -c edit-in-kitty -a "(__ksi_completions)" diff --git a/shell-integration/fish/vendor_completions.d/kitty.fish b/shell-integration/fish/vendor_completions.d/kitty.fish index 7734d975f..9b80dfa41 100644 --- a/shell-integration/fish/vendor_completions.d/kitty.fish +++ b/shell-integration/fish/vendor_completions.d/kitty.fish @@ -1,7 +1,7 @@ function __ksi_completions set --local ct (commandline --current-token) set --local tokens (commandline --tokenize --cut-at-cursor --current-process) - printf "%s\n" $tokens $ct | command kitty +complete fish2 + printf "%s\n" $tokens $ct | command kitty-tool __complete__ fish | source - end complete -f -c kitty -a "(__ksi_completions)" diff --git a/tools/completion/fish.go b/tools/completion/fish.go new file mode 100644 index 000000000..040aebbb0 --- /dev/null +++ b/tools/completion/fish.go @@ -0,0 +1,45 @@ +// License: GPLv3 Copyright: 2022, Kovid Goyal, + +package completion + +import ( + "fmt" + "strings" + + "kitty/tools/cli/markup" + "kitty/tools/utils" +) + +var _ = fmt.Print + +func fish_output_serializer(completions []*Completions, shell_state map[string]string) ([]byte, error) { + output := strings.Builder{} + f := func(format string, args ...interface{}) { fmt.Fprintf(&output, format+"\n", args...) } + n := completions[0].Delegate.NumToRemove + fm := markup.New(false) // fish freaks out if there are escape codes in the description strings + if n > 0 { + words := make([]string, len(completions[0].all_words)-n+1) + words[0] = completions[0].Delegate.Command + copy(words[1:], completions[0].all_words[n:]) + for i, w := range words { + words[i] = fmt.Sprintf("(string escape -- %s)", utils.QuoteStringForFish(w)) + } + cmdline := strings.Join(words, " ") + f("set __ksi_cmdline " + cmdline) + f("complete -C \"$__ksi_cmdline\"") + f("set --erase __ksi_cmdline") + } else { + for _, mg := range completions[0].Groups { + for _, m := range mg.Matches { + f("echo -- %s", utils.QuoteStringForFish(m.Word+"\t"+fm.Prettify(m.Description))) + } + } + } + // debugf("%#v", output.String()) + return []byte(output.String()), nil +} + +func init() { + input_parsers["fish"] = shell_input_parser + output_serializers["fish"] = fish_output_serializer +} diff --git a/tools/completion/main.go b/tools/completion/main.go index fdfc2b322..ac184971f 100644 --- a/tools/completion/main.go +++ b/tools/completion/main.go @@ -74,6 +74,7 @@ func main(args []string) error { if err != nil { return err } + // debugf("%#v", string(data)) all_argv, err := input_parser(data, shell_state) if err != nil { return err