From 97acb609817ba44dbdc786a40a1f17cbe59b9a68 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 25 Sep 2022 18:42:13 +0530 Subject: [PATCH] Move completion package into cli --- gen-go-code.py | 2 +- tools/{ => cli}/completion/bash.go | 0 tools/{ => cli}/completion/files.go | 8 ++--- tools/{ => cli}/completion/files_test.go | 0 tools/{ => cli}/completion/fish.go | 0 tools/{ => cli}/completion/kitty.go | 2 +- tools/{ => cli}/completion/main.go | 15 +--------- tools/{ => cli}/completion/parse-args.go | 0 tools/{ => cli}/completion/types.go | 10 +++---- tools/{ => cli}/completion/zsh.go | 0 tools/cli/option-from-string.go | 10 +++++-- tools/cli/types.go | 38 +++++++++++++----------- tools/cmd/main.go | 15 ++++++++-- 13 files changed, 53 insertions(+), 47 deletions(-) rename tools/{ => cli}/completion/bash.go (100%) rename tools/{ => cli}/completion/files.go (97%) rename tools/{ => cli}/completion/files_test.go (100%) rename tools/{ => cli}/completion/fish.go (100%) rename tools/{ => cli}/completion/kitty.go (98%) rename tools/{ => cli}/completion/main.go (80%) rename tools/{ => cli}/completion/parse-args.go (100%) rename tools/{ => cli}/completion/types.go (95%) rename tools/{ => cli}/completion/zsh.go (100%) diff --git a/gen-go-code.py b/gen-go-code.py index 316299964..d084af392 100755 --- a/gen-go-code.py +++ b/gen-go-code.py @@ -361,7 +361,7 @@ func add_rc_global_opts(cmd *cli.Command) {{ def update_completion() -> None: orig = sys.stdout try: - with replace_if_needed('tools/completion/kitty_generated.go') as f: + with replace_if_needed('tools/cli/completion/kitty_generated.go') as f: sys.stdout = f generate_completions_for_kitty() finally: diff --git a/tools/completion/bash.go b/tools/cli/completion/bash.go similarity index 100% rename from tools/completion/bash.go rename to tools/cli/completion/bash.go diff --git a/tools/completion/files.go b/tools/cli/completion/files.go similarity index 97% rename from tools/completion/files.go rename to tools/cli/completion/files.go index 6512179cf..3f612528d 100644 --- a/tools/completion/files.go +++ b/tools/cli/completion/files.go @@ -234,7 +234,7 @@ func get_cwd_for_completion(relative_to relative_to) string { return "" } -func make_completer(title string, relative_to relative_to, patterns []string, f func(string, string, []string) []string) completion_func { +func make_completer(title string, relative_to relative_to, patterns []string, f func(string, string, []string) []string) CompletionFunc { lpats := make([]string, 0, len(patterns)) for _, p := range patterns { lpats = append(lpats, strings.ToLower(p)) @@ -253,15 +253,15 @@ func make_completer(title string, relative_to relative_to, patterns []string, f } } -func fnmatch_completer(title string, relative_to relative_to, patterns ...string) completion_func { +func fnmatch_completer(title string, relative_to relative_to, patterns ...string) CompletionFunc { return make_completer(title, relative_to, patterns, complete_by_fnmatch) } -func mimepat_completer(title string, relative_to relative_to, patterns ...string) completion_func { +func mimepat_completer(title string, relative_to relative_to, patterns ...string) CompletionFunc { return make_completer(title, relative_to, patterns, complete_by_mimepat) } -func directory_completer(title string, relative_to relative_to) completion_func { +func directory_completer(title string, relative_to relative_to) CompletionFunc { if title == "" { title = "Directories" } diff --git a/tools/completion/files_test.go b/tools/cli/completion/files_test.go similarity index 100% rename from tools/completion/files_test.go rename to tools/cli/completion/files_test.go diff --git a/tools/completion/fish.go b/tools/cli/completion/fish.go similarity index 100% rename from tools/completion/fish.go rename to tools/cli/completion/fish.go diff --git a/tools/completion/kitty.go b/tools/cli/completion/kitty.go similarity index 98% rename from tools/completion/kitty.go rename to tools/cli/completion/kitty.go index f691c62d7..6c01f7a17 100644 --- a/tools/completion/kitty.go +++ b/tools/cli/completion/kitty.go @@ -54,7 +54,7 @@ func complete_kitty(completions *Completions, word string, arg_num int) { } } -func complete_kitty_override(title string, names []string) completion_func { +func complete_kitty_override(title string, names []string) CompletionFunc { return func(completions *Completions, word string, arg_num int) { mg := completions.add_match_group(title) mg.NoTrailingSpace = true diff --git a/tools/completion/main.go b/tools/cli/completion/main.go similarity index 80% rename from tools/completion/main.go rename to tools/cli/completion/main.go index eb06a094b..b28dee463 100644 --- a/tools/completion/main.go +++ b/tools/cli/completion/main.go @@ -8,7 +8,6 @@ import ( "io" "os" - "kitty/tools/cli" "kitty/tools/tty" "kitty/tools/utils" ) @@ -45,7 +44,7 @@ func init() { var registered_exes = make(map[string]func(root *Command)) -func main(args []string) error { +func Main(args []string) error { output_type := "json" if len(args) > 0 { output_type = args[0] @@ -92,15 +91,3 @@ func main(args []string) error { } return err } - -func EntryPoint(tool_root *cli.Command) { - tool_root.AddSubCommand(&cli.Command{ - Name: "__complete__", Hidden: true, - Usage: "output_type [shell state...]", - ShortDescription: "Generate completions for kitty commands", - HelpText: "Generate completion candidates for kitty commands. The command line is read from STDIN. output_type can be one of the supported shells or 'json' for JSON output.", - Run: func(cmd *cli.Command, args []string) (ret int, err error) { - return ret, main(args) - }, - }) -} diff --git a/tools/completion/parse-args.go b/tools/cli/completion/parse-args.go similarity index 100% rename from tools/completion/parse-args.go rename to tools/cli/completion/parse-args.go diff --git a/tools/completion/types.go b/tools/cli/completion/types.go similarity index 95% rename from tools/completion/types.go rename to tools/cli/completion/types.go index a97981f4c..87041caef 100644 --- a/tools/completion/types.go +++ b/tools/cli/completion/types.go @@ -128,14 +128,14 @@ func (self *Completions) add_match_group(title string) *MatchGroup { return &ans } -type completion_func func(completions *Completions, word string, arg_num int) +type CompletionFunc func(completions *Completions, word string, arg_num int) type Option struct { Name string Aliases []string Description string Has_following_arg bool - Completion_for_arg completion_func + Completion_for_arg CompletionFunc } type CommandGroup struct { @@ -150,7 +150,7 @@ type Command struct { Options []*Option Groups []*CommandGroup - Completion_for_arg completion_func + Completion_for_arg CompletionFunc Stop_processing_at_arg int First_arg_may_not_be_subcommand bool Subcommand_must_be_first bool @@ -257,7 +257,7 @@ func (self *Command) GetCompletions(argv []string, init_completions func(*Comple return &ans } -func names_completer(title string, names ...string) completion_func { +func names_completer(title string, names ...string) CompletionFunc { return func(completions *Completions, word string, arg_num int) { mg := completions.add_match_group(title) for _, q := range names { @@ -268,7 +268,7 @@ func names_completer(title string, names ...string) completion_func { } } -func chain_completers(completers ...completion_func) completion_func { +func chain_completers(completers ...CompletionFunc) CompletionFunc { return func(completions *Completions, word string, arg_num int) { for _, f := range completers { f(completions, word, arg_num) diff --git a/tools/completion/zsh.go b/tools/cli/completion/zsh.go similarity index 100% rename from tools/completion/zsh.go rename to tools/cli/completion/zsh.go diff --git a/tools/cli/option-from-string.go b/tools/cli/option-from-string.go index 4ee92f71f..c08380b47 100644 --- a/tools/cli/option-from-string.go +++ b/tools/cli/option-from-string.go @@ -99,12 +99,15 @@ type multi_scan struct { var mpat *regexp.Regexp +func (self *Option) init_option() { + self.values_from_cmdline = make([]string, 0, 1) + self.parsed_values_from_cmdline = make([]any, 0, 1) +} func option_from_spec(spec OptionSpec) (*Option, error) { ans := Option{ - Help: spec.Help, - values_from_cmdline: make([]string, 0, 1), - parsed_values_from_cmdline: make([]any, 0, 1), + Help: spec.Help, } + ans.init_option() parts := strings.Split(spec.Name, " ") ans.Name = camel_case_dest(parts[0]) ans.Aliases = make([]Alias, len(parts)) @@ -173,6 +176,7 @@ func option_from_spec(spec OptionSpec) (*Option, error) { if ans.IsList { ans.parsed_default = []string{} } + ans.CompletionFunc = spec.CompletionFunc if ans.Aliases == nil || len(ans.Aliases) == 0 { return nil, fmt.Errorf("No --aliases specified for option") } diff --git a/tools/cli/types.go b/tools/cli/types.go index 68df10deb..45baf11f6 100644 --- a/tools/cli/types.go +++ b/tools/cli/types.go @@ -10,6 +10,7 @@ import ( "strconv" "strings" + "kitty/tools/cli/completion" "kitty/tools/utils" "golang.org/x/exp/slices" @@ -42,26 +43,28 @@ func (self *Alias) String() string { } type OptionSpec struct { - Name string - Type string - Dest string - Choices string - Depth int - Default string - Help string + Name string + Type string + Dest string + Choices string + Depth int + Default string + Help string + CompletionFunc *completion.CompletionFunc } type Option struct { - Name string - Aliases []Alias - Choices []string - Default string - OptionType OptionType - Hidden bool - Depth int - Help string - IsList bool - Parent *Command + Name string + Aliases []Alias + Choices []string + Default string + OptionType OptionType + Hidden bool + Depth int + Help string + IsList bool + Parent *Command + CompletionFunc *completion.CompletionFunc values_from_cmdline []string parsed_values_from_cmdline []any @@ -241,6 +244,7 @@ func (self *OptionGroup) Clone(parent *Command) *OptionGroup { ans := OptionGroup{Title: self.Title, Options: make([]*Option, len(self.Options))} for i, o := range self.Options { c := *o + c.init_option() c.Parent = parent ans.Options[i] = &c } diff --git a/tools/cmd/main.go b/tools/cmd/main.go index 650688bec..f24be8424 100644 --- a/tools/cmd/main.go +++ b/tools/cmd/main.go @@ -4,17 +4,28 @@ package main import ( "kitty/tools/cli" + "kitty/tools/cli/completion" "kitty/tools/cmd/at" - "kitty/tools/completion" ) +func completion_entry_point(tool_root *cli.Command) { + tool_root.AddSubCommand(&cli.Command{ + Name: "__complete__", Hidden: true, + Usage: "output_type [shell state...]", + ShortDescription: "Generate completions for kitty commands", + HelpText: "Generate completion candidates for kitty commands. The command line is read from STDIN. output_type can be one of the supported shells or 'json' for JSON output.", + Run: func(cmd *cli.Command, args []string) (ret int, err error) { + return ret, completion.Main(args) + }, + }) +} func main() { root := cli.NewRootCommand() root.ShortDescription = "Fast, statically compiled implementations for various kitty command-line tools" root.Usage = "command [command options] [command args]" at.EntryPoint(root) - completion.EntryPoint(root) + completion_entry_point(root) root.Exec() }