diff --git a/shell-integration/bash/kitty.bash b/shell-integration/bash/kitty.bash index cf11032e0..99b61faf8 100644 --- a/shell-integration/bash/kitty.bash +++ b/shell-integration/bash/kitty.bash @@ -215,7 +215,7 @@ _ksi_main() { builtin local limit # Send all words up to the word the cursor is currently on builtin let limit=1+$COMP_CWORD - src=$(builtin printf "%s\n" "${COMP_WORDS[@]:0:$limit}" | builtin command kitty +complete bash) + src=$(builtin printf "%s\n" "${COMP_WORDS[@]:0:$limit}" | builtin command kitty-tool __complete__ bash) if [[ $? == 0 ]]; then builtin eval "${src}" fi diff --git a/tools/completion/bash.go b/tools/completion/bash.go new file mode 100644 index 000000000..d80976202 --- /dev/null +++ b/tools/completion/bash.go @@ -0,0 +1,27 @@ +// License: GPLv3 Copyright: 2022, Kovid Goyal, + +package completion + +import ( + "fmt" + "strings" + + "kitty/tools/utils" +) + +var _ = fmt.Print + +func bash_output_serializer(completions []*Completions, shell_state map[string]string) ([]byte, error) { + output := strings.Builder{} + for _, mg := range completions[0].Groups { + for _, m := range mg.Matches { + fmt.Fprintln(&output, "COMPREPLY+=("+utils.QuoteStringForSH(m.Word)+")") + } + } + return []byte(output.String()), nil +} + +func init() { + input_parsers["bash"] = shell_input_parser + output_serializers["bash"] = bash_output_serializer +} diff --git a/tools/completion/zsh.go b/tools/completion/zsh.go index ff5454644..70da1c0f4 100644 --- a/tools/completion/zsh.go +++ b/tools/completion/zsh.go @@ -15,6 +15,21 @@ import ( var _ = fmt.Print +func shell_input_parser(data []byte, shell_state map[string]string) ([][]string, error) { + raw := string(data) + new_word := strings.HasSuffix(raw, "\n\n") + raw = strings.TrimRight(raw, "\n \t") + scanner := bufio.NewScanner(strings.NewReader(raw)) + words := make([]string, 0, 32) + for scanner.Scan() { + words = append(words, scanner.Text()) + } + if new_word { + words = append(words, "") + } + return [][]string{words}, nil +} + func zsh_input_parser(data []byte, shell_state map[string]string) ([][]string, error) { matcher := shell_state["_matcher"] q := "" @@ -32,18 +47,7 @@ func zsh_input_parser(data []byte, shell_state map[string]string) ([][]string, e // these matcher types break completion, so just abort in this case. return nil, fmt.Errorf("ZSH anchor based matching active, cannot complete") } - raw := string(data) - new_word := strings.HasSuffix(raw, "\n\n") - raw = strings.TrimRight(raw, "\n \t") - scanner := bufio.NewScanner(strings.NewReader(raw)) - words := make([]string, 0, 32) - for scanner.Scan() { - words = append(words, scanner.Text()) - } - if new_word { - words = append(words, "") - } - return [][]string{words}, nil + return shell_input_parser(data, shell_state) } func fmt_desc(word, desc string, max_word_len int, f *markup.Context, screen_width int) string {