diff options
author | Robin Jarry <robin@jarry.cc> | 2023-12-04 23:39:49 +0100 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2024-01-20 21:56:25 +0100 |
commit | 159fb38daf5336758abc425447cf2c2ed51de59a (patch) | |
tree | e7be3bea878b12e441332f89d7bc3c63db477c05 /main.go | |
parent | d2817371867e94b621de4054b235d53312db8073 (diff) | |
download | aerc-159fb38daf5336758abc425447cf2c2ed51de59a.tar.gz |
commands: refactor registration
Register all commands with the same function and store them in the same
map.
Use bit flags to determine in which contexts each command should be
available.
Remove duplicate commands now that the same command can be exposed in
multiple contexts.
Refactor API to allow executing commands from other commands without
import cycles.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Tested-by: Johannes Thyssen Tishman <johannes@thyssentishman.com>
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 111 |
1 files changed, 12 insertions, 99 deletions
@@ -18,12 +18,6 @@ import ( "git.sr.ht/~rjarry/aerc/app" "git.sr.ht/~rjarry/aerc/commands" - "git.sr.ht/~rjarry/aerc/commands/account" - "git.sr.ht/~rjarry/aerc/commands/compose" - "git.sr.ht/~rjarry/aerc/commands/msg" - "git.sr.ht/~rjarry/aerc/commands/msgview" - "git.sr.ht/~rjarry/aerc/commands/patch" - "git.sr.ht/~rjarry/aerc/commands/terminal" "git.sr.ht/~rjarry/aerc/config" "git.sr.ht/~rjarry/aerc/lib/crypto" "git.sr.ht/~rjarry/aerc/lib/hooks" @@ -33,98 +27,22 @@ import ( "git.sr.ht/~rjarry/aerc/log" "git.sr.ht/~rjarry/aerc/models" "git.sr.ht/~rjarry/aerc/worker/types" -) - -func getCommands(selected ui.Drawable) []*commands.Commands { - switch selected.(type) { - case *app.AccountView: - return []*commands.Commands{ - account.AccountCommands, - msg.MessageCommands, - commands.GlobalCommands, - patch.PatchCommands, - } - case *app.Composer: - return []*commands.Commands{ - compose.ComposeCommands, - commands.GlobalCommands, - patch.PatchCommands, - } - case *app.MessageViewer: - return []*commands.Commands{ - msgview.MessageViewCommands, - msg.MessageCommands, - commands.GlobalCommands, - patch.PatchCommands, - } - case *app.Terminal: - return []*commands.Commands{ - terminal.TerminalCommands, - commands.GlobalCommands, - patch.PatchCommands, - } - default: - return []*commands.Commands{ - commands.GlobalCommands, - patch.PatchCommands, - } - } -} -// Expand non-ambiguous command abbreviations. -// -// q --> quit -// ar --> archive -// im --> import-mbox -func expandAbbreviations(name string, sets []*commands.Commands) (string, commands.Command) { - var candidateCmd commands.Command - candidateName := name - - for _, set := range sets { - cmd := set.ByName(name) - if cmd != nil { - // Direct match, return it directly. - return name, cmd - } - // Check for partial matches. - for _, n := range set.Names() { - if !strings.HasPrefix(n, name) { - continue - } - if candidateCmd != nil { - // We have more than one command partially - // matching the input. We can't expand such an - // abbreviation, so return the command as is so - // it can raise an error later. - return name, nil - } - // We have a partial match. - candidateName = n - candidateCmd = set.ByName(n) - } - } - return candidateName, candidateCmd -} + _ "git.sr.ht/~rjarry/aerc/commands/account" + _ "git.sr.ht/~rjarry/aerc/commands/compose" + _ "git.sr.ht/~rjarry/aerc/commands/msg" + _ "git.sr.ht/~rjarry/aerc/commands/msgview" + _ "git.sr.ht/~rjarry/aerc/commands/patch" +) func execCommand( cmdline string, acct *config.AccountConfig, msg *models.MessageInfo, ) error { - cmdline, err := commands.ExpandTemplates(cmdline, acct, msg) + cmdline, cmd, err := commands.ResolveCommand(cmdline, acct, msg) if err != nil { return err } - cmdline = strings.TrimLeft(cmdline, ":") - name, rest, didCut := strings.Cut(cmdline, " ") - cmds := getCommands(app.SelectedTabContent()) - name, cmd := expandAbbreviations(name, cmds) - if cmd == nil { - return commands.NoSuchCommand(name) - } - cmdline = name - if didCut { - cmdline += " " + rest - } err = commands.ExecuteCommand(cmd, cmdline) if errors.As(err, new(commands.ErrorExit)) { ui.Exit() @@ -134,8 +52,6 @@ func execCommand( } func getCompletions(cmdline string) ([]string, string) { - cmdline = strings.TrimLeft(cmdline, ":") - // complete template terms if options, prefix, ok := commands.GetTemplateCompletion(cmdline); ok { sort.Strings(options) @@ -143,16 +59,13 @@ func getCompletions(cmdline string) ([]string, string) { } args := opt.LexArgs(cmdline) - cmds := getCommands(app.SelectedTabContent()) if args.Count() < 2 && args.TrailingSpace() == "" { // complete command names var completions []string - for _, set := range cmds { - for _, n := range set.Names() { - if strings.HasPrefix(n, cmdline) { - completions = append(completions, n+" ") - } + for _, name := range commands.ActiveCommandNames() { + if strings.HasPrefix(name, cmdline) { + completions = append(completions, name+" ") } } sort.Strings(completions) @@ -160,8 +73,8 @@ func getCompletions(cmdline string) ([]string, string) { } // complete command arguments - _, cmd := expandAbbreviations(args.Arg(0), cmds) - if cmd == nil { + _, cmd, err := commands.ExpandAbbreviations(args.Arg(0)) + if err != nil { return nil, cmdline } return commands.GetCompletions(cmd, args) |