diff options
author | Robin Jarry <robin@jarry.cc> | 2023-10-17 00:14:49 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2023-10-28 19:25:08 +0200 |
commit | 30851656591293ed2e19340ab78c937855a11143 (patch) | |
tree | f7c0aad888110163ebb21a9498784aea9f26f949 /commands | |
parent | 08ef572e08665ec3a06ea6ac315f3dd6d0eac5d1 (diff) | |
download | aerc-30851656591293ed2e19340ab78c937855a11143.tar.gz |
commands: remove command set completion api
Do not expose the completion of a command via its command set. Instead,
require a single command object to be resolved in order to execute it.
Extract the command names and the template terms completions in main.go.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Reviewed-by: Koni Marti <koni.marti@gmail.com>
Tested-by: Moritz Poldrack <moritz@poldrack.dev>
Tested-by: Inwit <inwit@sindominio.net>
Diffstat (limited to 'commands')
-rw-r--r-- | commands/commands.go | 62 | ||||
-rw-r--r-- | commands/prompt.go | 2 |
2 files changed, 14 insertions, 50 deletions
diff --git a/commands/commands.go b/commands/commands.go index c2137a58..d76194af 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -4,7 +4,6 @@ import ( "bytes" "errors" "reflect" - "sort" "strings" "unicode" @@ -153,11 +152,6 @@ func ExpandTemplates( func GetTemplateCompletion( cmd string, ) ([]string, string, bool) { - args, err := splitCmd(cmd) - if err != nil || len(args) == 0 { - return nil, "", false - } - countLeft := strings.Count(cmd, "{{") if countLeft == 0 { return nil, "", false @@ -197,48 +191,16 @@ func GetTemplateCompletion( } // GetCompletions returns the completion options and the command prefix -func (cmds *Commands) GetCompletions( - cmd string, +func GetCompletions( + cmd Command, args *opt.Args, ) (options []string, prefix string) { - log.Tracef("completing command: %s", cmd) - - // start completion - args, err := splitCmd(cmd) - if err != nil { - return - } - - // nothing entered, list all commands - if len(args) == 0 { - options = cmds.Names() - sort.Strings(options) - return - } - - // complete command name - spaceTerminated := cmd[len(cmd)-1] == ' ' - if len(args) == 1 && !spaceTerminated { - for _, n := range cmds.Names() { - options = append(options, n+" ") - } - options = CompletionFromList(options, args) - - return - } - - // look for command in dictionary - c, ok := cmds.dict()[args[0]] - if !ok { - return - } - // complete options var spec string - if provider, ok := c.(OptionsProvider); ok { + if provider, ok := cmd.(OptionsProvider); ok { spec = provider.Options() } - parser, err := newParser(cmd, spec, spaceTerminated) + parser, err := newParser(args.String(), spec, strings.HasSuffix(args.String(), " ")) if err != nil { log.Debugf("completion parser failed: %v", err) return @@ -256,15 +218,15 @@ func (cmds *Commands) GetCompletions( } options = append(options, option) } - prefix = cmd + prefix = args.String() case OPTION_ARGUMENT: - cmpl, ok := c.(OptionCompleter) + cmpl, ok := cmd.(OptionCompleter) if !ok { return } - stem := cmd + stem := args.String() if parser.arg != "" { - stem = strings.TrimSuffix(cmd, parser.arg) + stem = strings.TrimSuffix(stem, parser.arg) } pad := "" if !strings.HasSuffix(stem, " ") { @@ -277,14 +239,16 @@ func (cmds *Commands) GetCompletions( } prefix = stem case OPERAND: - stem := strings.Join(args[:parser.optind], " ") - for _, option := range c.Complete(args[1:]) { + clone := args.Clone() + clone.Cut(clone.Count() - parser.optind) + args.Shift(1) + for _, option := range cmd.Complete(args.Args()) { if strings.Contains(option, " ") { option = escape(option) } options = append(options, " "+option) } - prefix = stem + prefix = clone.String() } return diff --git a/commands/prompt.go b/commands/prompt.go index d42a6597..dd259c30 100644 --- a/commands/prompt.go +++ b/commands/prompt.go @@ -40,7 +40,7 @@ func (Prompt) Complete(args []string) []string { if hascommand { return nil } - cs, _ = GlobalCommands.GetCompletions(args[1]) + cs = GlobalCommands.Names() } if cs == nil { return nil |