diff --git a/tools/completion/bash.go b/tools/completion/bash.go index f85ef1bb3..92e940490 100644 --- a/tools/completion/bash.go +++ b/tools/completion/bash.go @@ -22,7 +22,12 @@ func bash_output_serializer(completions []*Completions, shell_state map[string]s return []byte(output.String()), nil } +func bash_init_completions(completions *Completions) { + completions.split_on_equals = true +} + func init() { input_parsers["bash"] = shell_input_parser output_serializers["bash"] = bash_output_serializer + init_completions["bash"] = bash_init_completions } diff --git a/tools/completion/main.go b/tools/completion/main.go index fea56a658..fdfc2b322 100644 --- a/tools/completion/main.go +++ b/tools/completion/main.go @@ -38,6 +38,7 @@ type serializer_func func(completions []*Completions, shell_state map[string]str var input_parsers = make(map[string]parser_func, 4) var output_serializers = make(map[string]serializer_func, 4) +var init_completions = make(map[string]func(*Completions), 4) func init() { input_parsers["json"] = json_input_parser @@ -84,7 +85,7 @@ func main(args []string) error { all_completions := make([]*Completions, 0, 1) for _, argv := range all_argv { - all_completions = append(all_completions, root.GetCompletions(argv)) + all_completions = append(all_completions, root.GetCompletions(argv, init_completions[output_type])) } output, err := output_serializer(all_completions, shell_state) if err == nil { diff --git a/tools/completion/parse-args.go b/tools/completion/parse-args.go index eafe0ebb1..6020d9a2b 100644 --- a/tools/completion/parse-args.go +++ b/tools/completion/parse-args.go @@ -153,9 +153,15 @@ func default_parse_args(cmd *Command, words []string, completions *Completions) } } if is_last_word { + if completions.split_on_equals && word == "=" { + word = "" + } complete_word(word, completions, only_args_allowed, expecting_arg_for, arg_num) } else { if expecting_arg_for != nil { + if completions.split_on_equals && word == "=" { + continue + } expecting_arg_for = nil continue } diff --git a/tools/completion/types.go b/tools/completion/types.go index 86d95cdb5..a97981f4c 100644 --- a/tools/completion/types.go +++ b/tools/completion/types.go @@ -107,6 +107,8 @@ type Completions struct { all_words []string // all words passed to parse_args() current_word_idx int // index of current word in all_words current_word_idx_in_parent int // index of current word in parents command line 1 for first word after parent + + split_on_equals bool // true if the cmdline is split on = (BASH does this because readline does this) } func (self *Completions) add_prefix_to_all_matches(prefix string) { @@ -229,8 +231,11 @@ func (self *Command) add_option(opt *Option) { self.Options = append(self.Options, opt) } -func (self *Command) GetCompletions(argv []string) *Completions { +func (self *Command) GetCompletions(argv []string, init_completions func(*Completions)) *Completions { ans := Completions{Groups: make([]*MatchGroup, 0, 4)} + if init_completions != nil { + init_completions(&ans) + } if len(argv) > 0 { exe := argv[0] cmd := self.find_subcommand_with_name(exe)