summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2023-12-04 23:39:49 +0100
committerRobin Jarry <robin@jarry.cc>2024-01-20 21:56:25 +0100
commit159fb38daf5336758abc425447cf2c2ed51de59a (patch)
treee7be3bea878b12e441332f89d7bc3c63db477c05
parentd2817371867e94b621de4054b235d53312db8073 (diff)
downloadaerc-159fb38daf5336758abc425447cf2c2ed51de59a.tar.gz
aerc-159fb38daf5336758abc425447cf2c2ed51de59a.zip
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>
-rw-r--r--commands/account/account.go14
-rw-r--r--commands/account/cf.go6
-rw-r--r--commands/account/check-mail.go7
-rw-r--r--commands/account/clear.go7
-rw-r--r--commands/account/compose.go6
-rw-r--r--commands/account/connection.go7
-rw-r--r--commands/account/expand-folder.go7
-rw-r--r--commands/account/export-mbox.go6
-rw-r--r--commands/account/import-mbox.go6
-rw-r--r--commands/account/mkdir.go6
-rw-r--r--commands/account/next-folder.go7
-rw-r--r--commands/account/next-result.go7
-rw-r--r--commands/account/next.go54
-rw-r--r--commands/account/recover.go6
-rw-r--r--commands/account/rmdir.go7
-rw-r--r--commands/account/search.go6
-rw-r--r--commands/account/select.go7
-rw-r--r--commands/account/sort.go6
-rw-r--r--commands/account/split.go7
-rw-r--r--commands/account/view.go7
-rw-r--r--commands/cd.go6
-rw-r--r--commands/choose.go6
-rw-r--r--commands/close.go24
-rw-r--r--commands/commands.go146
-rw-r--r--commands/compose/abort.go7
-rw-r--r--commands/compose/attach-key.go7
-rw-r--r--commands/compose/attach.go6
-rw-r--r--commands/compose/cc-bcc.go7
-rw-r--r--commands/compose/compose.go14
-rw-r--r--commands/compose/detach.go6
-rw-r--r--commands/compose/edit.go7
-rw-r--r--commands/compose/encrypt.go7
-rw-r--r--commands/compose/header.go6
-rw-r--r--commands/compose/multipart.go6
-rw-r--r--commands/compose/next-field.go7
-rw-r--r--commands/compose/postpone.go6
-rw-r--r--commands/compose/send.go6
-rw-r--r--commands/compose/sign.go7
-rw-r--r--commands/compose/switch.go6
-rw-r--r--commands/ct.go6
-rw-r--r--commands/eml.go6
-rw-r--r--commands/exec.go6
-rw-r--r--commands/global.go10
-rw-r--r--commands/help.go6
-rw-r--r--commands/move-tab.go6
-rw-r--r--commands/msg/archive.go6
-rw-r--r--commands/msg/copy.go6
-rw-r--r--commands/msg/delete.go7
-rw-r--r--commands/msg/envelope.go7
-rw-r--r--commands/msg/fold.go7
-rw-r--r--commands/msg/forward.go6
-rw-r--r--commands/msg/invite.go7
-rw-r--r--commands/msg/mark.go8
-rw-r--r--commands/msg/modify-labels.go6
-rw-r--r--commands/msg/move.go6
-rw-r--r--commands/msg/msg.go14
-rw-r--r--commands/msg/pipe.go6
-rw-r--r--commands/msg/read.go6
-rw-r--r--commands/msg/recall.go7
-rw-r--r--commands/msg/reply.go6
-rw-r--r--commands/msg/toggle-thread-context.go7
-rw-r--r--commands/msg/toggle-threads.go7
-rw-r--r--commands/msg/unsubscribe.go7
-rw-r--r--commands/msgview/close.go21
-rw-r--r--commands/msgview/msgview.go14
-rw-r--r--commands/msgview/next-part.go7
-rw-r--r--commands/msgview/next.go83
-rw-r--r--commands/msgview/open-link.go6
-rw-r--r--commands/msgview/open.go7
-rw-r--r--commands/msgview/save.go6
-rw-r--r--commands/msgview/toggle-headers.go7
-rw-r--r--commands/msgview/toggle-key-passthrough.go7
-rw-r--r--commands/new-account.go6
-rw-r--r--commands/next-tab.go6
-rw-r--r--commands/patch/apply.go4
-rw-r--r--commands/patch/cd.go5
-rw-r--r--commands/patch/delete.go4
-rw-r--r--commands/patch/find.go4
-rw-r--r--commands/patch/init.go5
-rw-r--r--commands/patch/list.go5
-rw-r--r--commands/patch/patch.go51
-rw-r--r--commands/patch/rebase.go5
-rw-r--r--commands/patch/remove.go4
-rw-r--r--commands/patch/switch.go4
-rw-r--r--commands/patch/term.go4
-rw-r--r--commands/pin-tab.go6
-rw-r--r--commands/prompt.go8
-rw-r--r--commands/pwd.go6
-rw-r--r--commands/quit.go6
-rw-r--r--commands/send-keys.go6
-rw-r--r--commands/suspend.go6
-rw-r--r--commands/term.go6
-rw-r--r--commands/terminal/close.go21
-rw-r--r--commands/terminal/terminal.go14
-rw-r--r--commands/z.go6
-rw-r--r--main.go111
96 files changed, 665 insertions, 435 deletions
diff --git a/commands/account/account.go b/commands/account/account.go
deleted file mode 100644
index fc17fa2d..00000000
--- a/commands/account/account.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package account
-
-import (
- "git.sr.ht/~rjarry/aerc/commands"
-)
-
-var AccountCommands *commands.Commands
-
-func register(cmd commands.Command) {
- if AccountCommands == nil {
- AccountCommands = commands.NewCommands()
- }
- AccountCommands.Register(cmd)
-}
diff --git a/commands/account/cf.go b/commands/account/cf.go
index 579ddd72..2f32e8bc 100644
--- a/commands/account/cf.go
+++ b/commands/account/cf.go
@@ -23,7 +23,11 @@ type ChangeFolder struct {
func init() {
history = make(map[string]string)
- register(ChangeFolder{})
+ commands.Register(ChangeFolder{})
+}
+
+func (ChangeFolder) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (ChangeFolder) Aliases() []string {
diff --git a/commands/account/check-mail.go b/commands/account/check-mail.go
index d31b2648..bc41a935 100644
--- a/commands/account/check-mail.go
+++ b/commands/account/check-mail.go
@@ -4,12 +4,17 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type CheckMail struct{}
func init() {
- register(CheckMail{})
+ commands.Register(CheckMail{})
+}
+
+func (CheckMail) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (CheckMail) Aliases() []string {
diff --git a/commands/account/clear.go b/commands/account/clear.go
index dec6bcd2..46335431 100644
--- a/commands/account/clear.go
+++ b/commands/account/clear.go
@@ -4,6 +4,7 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/state"
)
@@ -12,7 +13,11 @@ type Clear struct {
}
func init() {
- register(Clear{})
+ commands.Register(Clear{})
+}
+
+func (Clear) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (Clear) Aliases() []string {
diff --git a/commands/account/compose.go b/commands/account/compose.go
index fe86a179..e45f77c3 100644
--- a/commands/account/compose.go
+++ b/commands/account/compose.go
@@ -24,7 +24,11 @@ type Compose struct {
}
func init() {
- register(Compose{})
+ commands.Register(Compose{})
+}
+
+func (Compose) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (c *Compose) ParseHeader(arg string) error {
diff --git a/commands/account/connection.go b/commands/account/connection.go
index d633c1ce..75171cf4 100644
--- a/commands/account/connection.go
+++ b/commands/account/connection.go
@@ -4,6 +4,7 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/state"
"git.sr.ht/~rjarry/aerc/worker/types"
)
@@ -11,7 +12,11 @@ import (
type Connection struct{}
func init() {
- register(Connection{})
+ commands.Register(Connection{})
+}
+
+func (Connection) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (Connection) Aliases() []string {
diff --git a/commands/account/expand-folder.go b/commands/account/expand-folder.go
index c264872a..5bb686e0 100644
--- a/commands/account/expand-folder.go
+++ b/commands/account/expand-folder.go
@@ -4,12 +4,17 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type ExpandCollapseFolder struct{}
func init() {
- register(ExpandCollapseFolder{})
+ commands.Register(ExpandCollapseFolder{})
+}
+
+func (ExpandCollapseFolder) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (ExpandCollapseFolder) Aliases() []string {
diff --git a/commands/account/export-mbox.go b/commands/account/export-mbox.go
index 6a36d375..53f22d87 100644
--- a/commands/account/export-mbox.go
+++ b/commands/account/export-mbox.go
@@ -22,7 +22,11 @@ type ExportMbox struct {
}
func init() {
- register(ExportMbox{})
+ commands.Register(ExportMbox{})
+}
+
+func (ExportMbox) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (ExportMbox) Aliases() []string {
diff --git a/commands/account/import-mbox.go b/commands/account/import-mbox.go
index c38aeb8f..2d9c81f9 100644
--- a/commands/account/import-mbox.go
+++ b/commands/account/import-mbox.go
@@ -23,7 +23,11 @@ type ImportMbox struct {
}
func init() {
- register(ImportMbox{})
+ commands.Register(ImportMbox{})
+}
+
+func (ImportMbox) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (ImportMbox) Aliases() []string {
diff --git a/commands/account/mkdir.go b/commands/account/mkdir.go
index 7e49ad8b..c08c6d4b 100644
--- a/commands/account/mkdir.go
+++ b/commands/account/mkdir.go
@@ -15,7 +15,11 @@ type MakeDir struct {
}
func init() {
- register(MakeDir{})
+ commands.Register(MakeDir{})
+}
+
+func (MakeDir) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (MakeDir) Aliases() []string {
diff --git a/commands/account/next-folder.go b/commands/account/next-folder.go
index f44abdc1..c16a7717 100644
--- a/commands/account/next-folder.go
+++ b/commands/account/next-folder.go
@@ -4,6 +4,7 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type NextPrevFolder struct {
@@ -11,7 +12,11 @@ type NextPrevFolder struct {
}
func init() {
- register(NextPrevFolder{})
+ commands.Register(NextPrevFolder{})
+}
+
+func (NextPrevFolder) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (NextPrevFolder) Aliases() []string {
diff --git a/commands/account/next-result.go b/commands/account/next-result.go
index d624e559..f36ba941 100644
--- a/commands/account/next-result.go
+++ b/commands/account/next-result.go
@@ -4,13 +4,18 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/ui"
)
type NextPrevResult struct{}
func init() {
- register(NextPrevResult{})
+ commands.Register(NextPrevResult{})
+}
+
+func (NextPrevResult) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (NextPrevResult) Aliases() []string {
diff --git a/commands/account/next.go b/commands/account/next.go
index 142f6151..262e308d 100644
--- a/commands/account/next.go
+++ b/commands/account/next.go
@@ -2,11 +2,16 @@ package account
import (
"errors"
+ "fmt"
"strconv"
"strings"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
+ "git.sr.ht/~rjarry/aerc/lib"
"git.sr.ht/~rjarry/aerc/lib/ui"
+ "git.sr.ht/~rjarry/aerc/models"
+ "git.sr.ht/~rjarry/aerc/worker/types"
)
type NextPrevMsg struct {
@@ -15,7 +20,11 @@ type NextPrevMsg struct {
}
func init() {
- register(NextPrevMsg{})
+ commands.Register(NextPrevMsg{})
+}
+
+func (NextPrevMsg) Context() commands.CommandContext {
+ return commands.ACCOUNT | commands.MESSAGE_VIEWER
}
func (np *NextPrevMsg) ParseAmount(arg string) error {
@@ -40,23 +49,48 @@ func (np NextPrevMsg) Execute(args []string) error {
if acct == nil {
return errors.New("No account selected")
}
+ store := acct.Store()
+ if store == nil {
+ return fmt.Errorf("No message store set.")
+ }
n := np.Amount
if np.Percent {
n = int(float64(acct.Messages().Height()) * (float64(n) / 100.0))
}
if args[0] == "prev-message" || args[0] == "prev" {
- store := acct.Store()
- if store != nil {
- store.NextPrev(-n)
- ui.Invalidate()
- }
+ store.NextPrev(-n)
} else {
- store := acct.Store()
- if store != nil {
- store.NextPrev(n)
- ui.Invalidate()
+ store.NextPrev(n)
+ }
+
+ if mv, ok := app.SelectedTabContent().(*app.MessageViewer); ok {
+ reloadViewer := func(nextMsg *models.MessageInfo) {
+ lib.NewMessageStoreView(nextMsg, mv.MessageView().SeenFlagSet(),
+ store, app.CryptoProvider(), app.DecryptKeys,
+ func(view lib.MessageView, err error) {
+ if err != nil {
+ app.PushError(err.Error())
+ return
+ }
+ nextMv := app.NewMessageViewer(acct, view)
+ app.ReplaceTab(mv, nextMv,
+ nextMsg.Envelope.Subject, true)
+ })
+ }
+ if nextMsg := store.Selected(); nextMsg != nil {
+ reloadViewer(nextMsg)
+ } else {
+ store.FetchHeaders([]uint32{store.SelectedUid()},
+ func(msg types.WorkerMessage) {
+ if m, ok := msg.(*types.MessageInfo); ok {
+ reloadViewer(m.Info)
+ }
+ })
}
}
+
+ ui.Invalidate()
+
return nil
}
diff --git a/commands/account/recover.go b/commands/account/recover.go
index a2170edd..f38d9920 100644
--- a/commands/account/recover.go
+++ b/commands/account/recover.go
@@ -20,7 +20,11 @@ type Recover struct {
}
func init() {
- register(Recover{})
+ commands.Register(Recover{})
+}
+
+func (Recover) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (Recover) Aliases() []string {
diff --git a/commands/account/rmdir.go b/commands/account/rmdir.go
index 8bf4d6b2..00366bd0 100644
--- a/commands/account/rmdir.go
+++ b/commands/account/rmdir.go
@@ -5,6 +5,7 @@ import (
"time"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/models"
"git.sr.ht/~rjarry/aerc/worker/types"
)
@@ -14,7 +15,11 @@ type RemoveDir struct {
}
func init() {
- register(RemoveDir{})
+ commands.Register(RemoveDir{})
+}
+
+func (RemoveDir) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (RemoveDir) Aliases() []string {
diff --git a/commands/account/search.go b/commands/account/search.go
index 10481e8e..be3b125f 100644
--- a/commands/account/search.go
+++ b/commands/account/search.go
@@ -34,7 +34,11 @@ type SearchFilter struct {
}
func init() {
- register(SearchFilter{})
+ commands.Register(SearchFilter{})
+}
+
+func (SearchFilter) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (SearchFilter) Aliases() []string {
diff --git a/commands/account/select.go b/commands/account/select.go
index 884b4bce..cbaaf6e9 100644
--- a/commands/account/select.go
+++ b/commands/account/select.go
@@ -4,6 +4,7 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type SelectMessage struct {
@@ -11,7 +12,11 @@ type SelectMessage struct {
}
func init() {
- register(SelectMessage{})
+ commands.Register(SelectMessage{})
+}
+
+func (SelectMessage) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (SelectMessage) Aliases() []string {
diff --git a/commands/account/sort.go b/commands/account/sort.go
index 3103a388..0e80aec8 100644
--- a/commands/account/sort.go
+++ b/commands/account/sort.go
@@ -18,7 +18,11 @@ type Sort struct {
}
func init() {
- register(Sort{})
+ commands.Register(Sort{})
+}
+
+func (Sort) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (Sort) Aliases() []string {
diff --git a/commands/account/split.go b/commands/account/split.go
index 8690d99a..4b01da2d 100644
--- a/commands/account/split.go
+++ b/commands/account/split.go
@@ -6,6 +6,7 @@ import (
"strings"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type Split struct {
@@ -14,7 +15,11 @@ type Split struct {
}
func init() {
- register(Split{})
+ commands.Register(Split{})
+}
+
+func (Split) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (s *Split) ParseSize(arg string) error {
diff --git a/commands/account/view.go b/commands/account/view.go
index 87705a1a..4177b906 100644
--- a/commands/account/view.go
+++ b/commands/account/view.go
@@ -5,6 +5,7 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib"
"git.sr.ht/~rjarry/aerc/lib/state"
"git.sr.ht/~rjarry/aerc/lib/templates"
@@ -16,7 +17,11 @@ type ViewMessage struct {
}
func init() {
- register(ViewMessage{})
+ commands.Register(ViewMessage{})
+}
+
+func (ViewMessage) Context() commands.CommandContext {
+ return commands.ACCOUNT
}
func (ViewMessage) Aliases() []string {
diff --git a/commands/cd.go b/commands/cd.go
index cd206c3c..1d71882f 100644
--- a/commands/cd.go
+++ b/commands/cd.go
@@ -15,7 +15,11 @@ type ChangeDirectory struct {
}
func init() {
- register(ChangeDirectory{})
+ Register(ChangeDirectory{})
+}
+
+func (ChangeDirectory) Context() CommandContext {
+ return GLOBAL
}
func (ChangeDirectory) Aliases() []string {
diff --git a/commands/choose.go b/commands/choose.go
index 19958dce..4ecff0ea 100644
--- a/commands/choose.go
+++ b/commands/choose.go
@@ -11,7 +11,11 @@ type Choose struct {
}
func init() {
- register(Choose{})
+ Register(Choose{})
+}
+
+func (Choose) Context() CommandContext {
+ return GLOBAL
}
func (Choose) Aliases() []string {
diff --git a/commands/close.go b/commands/close.go
new file mode 100644
index 00000000..c74a705e
--- /dev/null
+++ b/commands/close.go
@@ -0,0 +1,24 @@
+package commands
+
+import (
+ "git.sr.ht/~rjarry/aerc/app"
+)
+
+type Close struct{}
+
+func init() {
+ Register(Close{})
+}
+
+func (Close) Context() CommandContext {
+ return MESSAGE_VIEWER | TERMINAL
+}
+
+func (Close) Aliases() []string {
+ return []string{"close"}
+}
+
+func (Close) Execute([]string) error {
+ app.RemoveTab(app.SelectedTabContent(), true)
+ return nil
+}
diff --git a/commands/commands.go b/commands/commands.go
index 3270bee6..fa8ef287 100644
--- a/commands/commands.go
+++ b/commands/commands.go
@@ -19,56 +19,148 @@ import (
"git.sr.ht/~rjarry/aerc/models"
)
+type CommandContext uint32
+
+const (
+ NONE = 1 << iota
+ // available everywhere
+ GLOBAL
+ // only when a message list is focused
+ ACCOUNT
+ // only when a message composer is focused
+ COMPOSE
+ // only when a message list or message viewer is focused
+ MESSAGE
+ // only when a message viewer is focused
+ MESSAGE_VIEWER
+ // only when a terminal
+ TERMINAL
+)
+
+func CurrentContext() CommandContext {
+ var context CommandContext = GLOBAL
+
+ switch app.SelectedTabContent().(type) {
+ case *app.AccountView:
+ context |= ACCOUNT | MESSAGE
+ case *app.Composer:
+ context |= COMPOSE
+ case *app.MessageViewer:
+ context |= COMPOSE | MESSAGE | MESSAGE_VIEWER
+ case *app.Terminal:
+ context |= TERMINAL
+ }
+
+ return context
+}
+
type Command interface {
+ Context() CommandContext
Aliases() []string
Execute([]string) error
}
-type Commands map[string]Command
+var allCommands map[string]Command
-func NewCommands() *Commands {
- cmds := Commands(make(map[string]Command))
- return &cmds
+func Register(cmd Command) {
+ if allCommands == nil {
+ allCommands = make(map[string]Command)
+ }
+ for _, alias := range cmd.Aliases() {
+ if allCommands[alias] != nil {
+ panic("duplicate command alias: " + alias)
+ }
+ allCommands[alias] = cmd
+ }
}
-func (cmds *Commands) dict() map[string]Command {
- return map[string]Command(*cmds)
+func ActiveCommands() []Command {
+ var cmds []Command
+ context := CurrentContext()
+
+ for _, cmd := range allCommands {
+ if cmd.Context()&context != 0 {
+ cmds = append(cmds, cmd)
+ }
+ }
+
+ return cmds
}
-func (cmds *Commands) Names() []string {
- names := make([]string, 0)
+func ActiveCommandNames() []string {
+ var names []string
+ context := CurrentContext()
- for k := range cmds.dict() {
- names = append(names, k)
+ for alias, cmd := range allCommands {
+ if cmd.Context()&context != 0 {
+ names = append(names, alias)
+ }
}
+
return names
}
-func (cmds *Commands) ByName(name string) Command {
- if cmd, ok := cmds.dict()[name]; ok {
- return cmd
- }
- return nil
+type NoSuchCommand string
+
+func (err NoSuchCommand) Error() string {
+ return "Unknown command " + string(err)
}
-func (cmds *Commands) Register(cmd Command) {
- // TODO enforce unique aliases, until then, duplicate each
- if len(cmd.Aliases()) < 1 {
- return
+// Expand non-ambiguous command abbreviations.
+//
+// q --> quit
+// ar --> archive
+// im --> import-mbox
+func ExpandAbbreviations(name string) (string, Command, error) {
+ context := CurrentContext()
+ name = strings.TrimLeft(name, ":")
+
+ cmd, found := allCommands[name]
+ if found && cmd.Context()&context != 0 {
+ return name, cmd, nil
}
- for _, alias := range cmd.Aliases() {
- cmds.dict()[alias] = cmd
+
+ var candidate Command
+ var candidateName string
+
+ for alias, cmd := range allCommands {
+ if cmd.Context()&context == 0 || !strings.HasPrefix(alias, name) {
+ continue
+ }
+ if candidate != nil {
+ // We have more than one command partially
+ // matching the input.
+ return name, nil, NoSuchCommand(name)
+ }
+ // We have a partial match.
+ candidate = cmd
+ candidateName = alias
}
-}
-type NoSuchCommand string
+ if candidate == nil {
+ return name, nil, NoSuchCommand(name)
+ }
-func (err NoSuchCommand) Error() string {
- return "Unknown command " + string(err)
+ return candidateName, candidate, nil
}
-type CommandSource interface {
- Commands() *Commands
+func ResolveCommand(
+ cmdline string, acct *config.AccountConfig, msg *models.MessageInfo,
+) (string, Command, error) {
+ cmdline, err := ExpandTemplates(cmdline, acct, msg)
+ if err != nil {
+ return "", nil, err
+ }
+ name, rest, didCut := strings.Cut(cmdline, " ")
+ name, cmd, err := ExpandAbbreviations(name)
+ if err != nil {
+ return "", nil, err
+ }
+ cmdline = name
+ if didCut {
+ cmdline += " " + rest
+ }
+ return cmdline, cmd, nil
}
func templateData(
diff --git a/commands/compose/abort.go b/commands/compose/abort.go
index cde43f46..f446c306 100644
--- a/commands/compose/abort.go
+++ b/commands/compose/abort.go
@@ -2,12 +2,17 @@ package compose
import (
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type Abort struct{}
func init() {
- register(Abort{})
+ commands.Register(Abort{})
+}
+
+func (Abort) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Abort) Aliases() []string {
diff --git a/commands/compose/attach-key.go b/commands/compose/attach-key.go
index 6ba5eae0..047b9c08 100644
--- a/commands/compose/attach-key.go
+++ b/commands/compose/attach-key.go
@@ -2,12 +2,17 @@ package compose
import (
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type AttachKey struct{}
func init() {
- register(AttachKey{})
+ commands.Register(AttachKey{})
+}
+
+func (AttachKey) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (AttachKey) Aliases() []string {
diff --git a/commands/compose/attach.go b/commands/compose/attach.go
index 52ce55cb..cb59eb5f 100644
--- a/commands/compose/attach.go
+++ b/commands/compose/attach.go
@@ -28,7 +28,11 @@ type Attach struct {
}
func init() {
- register(Attach{})
+ commands.Register(Attach{})
+}
+
+func (Attach) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Attach) Aliases() []string {
diff --git a/commands/compose/cc-bcc.go b/commands/compose/cc-bcc.go
index dd5e9614..d54a9895 100644
--- a/commands/compose/cc-bcc.go
+++ b/commands/compose/cc-bcc.go
@@ -2,6 +2,7 @@ package compose
import (
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type CC struct {
@@ -9,7 +10,11 @@ type CC struct {
}
func init() {
- register(CC{})
+ commands.Register(CC{})
+}
+
+func (CC) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (CC) Aliases() []string {
diff --git a/commands/compose/compose.go b/commands/compose/compose.go
deleted file mode 100644
index f325e4e2..00000000
--- a/commands/compose/compose.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package compose
-
-import (
- "git.sr.ht/~rjarry/aerc/commands"
-)
-
-var ComposeCommands *commands.Commands
-
-func register(cmd commands.Command) {
- if ComposeCommands == nil {
- ComposeCommands = commands.NewCommands()
- }
- ComposeCommands.Register(cmd)
-}
diff --git a/commands/compose/detach.go b/commands/compose/detach.go
index 0ac3334e..36c7c314 100644
--- a/commands/compose/detach.go
+++ b/commands/compose/detach.go
@@ -12,7 +12,11 @@ type Detach struct {
}
func init() {
- register(Detach{})
+ commands.Register(Detach{})
+}
+
+func (Detach) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Detach) Aliases() []string {
diff --git a/commands/compose/edit.go b/commands/compose/edit.go
index 1929f45a..45c55046 100644
--- a/commands/compose/edit.go
+++ b/commands/compose/edit.go
@@ -4,6 +4,7 @@ import (
"errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/config"
)
@@ -13,7 +14,11 @@ type Edit struct {
}
func init() {
- register(Edit{})
+ commands.Register(Edit{})
+}
+
+func (Edit) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Edit) Aliases() []string {
diff --git a/commands/compose/encrypt.go b/commands/compose/encrypt.go
index ee902f6e..5e52f821 100644
--- a/commands/compose/encrypt.go
+++ b/commands/compose/encrypt.go
@@ -2,12 +2,17 @@ package compose
import (
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type Encrypt struct{}
func init() {
- register(Encrypt{})
+ commands.Register(Encrypt{})
+}
+
+func (Encrypt) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Encrypt) Aliases() []string {
diff --git a/commands/compose/header.go b/commands/compose/header.go
index 3283d4e3..839896c3 100644
--- a/commands/compose/header.go
+++ b/commands/compose/header.go
@@ -26,7 +26,11 @@ var headers = []string{
}
func init() {
- register(Header{})
+ commands.Register(Header{})
+}
+
+func (Header) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Header) Aliases() []string {
diff --git a/commands/compose/multipart.go b/commands/compose/multipart.go
index a004ea2b..13fe8ca3 100644
--- a/commands/compose/multipart.go
+++ b/commands/compose/multipart.go
@@ -15,7 +15,11 @@ type Multipart struct {
}
func init() {
- register(Multipart{})
+ commands.Register(Multipart{})
+}
+
+func (Multipart) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Multipart) Aliases() []string {
diff --git a/commands/compose/next-field.go b/commands/compose/next-field.go
index 396c1ce1..6c96cd94 100644
--- a/commands/compose/next-field.go
+++ b/commands/compose/next-field.go
@@ -2,12 +2,17 @@ package compose
import (
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type NextPrevField struct{}
func init() {
- register(NextPrevField{})
+ commands.Register(NextPrevField{})
+}
+
+func (NextPrevField) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (NextPrevField) Aliases() []string {
diff --git a/commands/compose/postpone.go b/commands/compose/postpone.go
index 098b7039..a869417b 100644
--- a/commands/compose/postpone.go
+++ b/commands/compose/postpone.go
@@ -18,7 +18,11 @@ type Postpone struct {
}
func init() {
- register(Postpone{})
+ commands.Register(Postpone{})
+}
+
+func (Postpone) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Postpone) Aliases() []string {
diff --git a/commands/compose/send.go b/commands/compose/send.go
index c642c356..dfd531ee 100644
--- a/commands/compose/send.go
+++ b/commands/compose/send.go
@@ -33,7 +33,11 @@ type Send struct {
}
func init() {
- register(Send{})
+ commands.Register(Send{})
+}
+
+func (Send) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Send) Aliases() []string {
diff --git a/commands/compose/sign.go b/commands/compose/sign.go
index faeceed4..692ef108 100644
--- a/commands/compose/sign.go
+++ b/commands/compose/sign.go
@@ -4,12 +4,17 @@ import (
"time"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type Sign struct{}
func init() {
- register(Sign{})
+ commands.Register(Sign{})
+}
+
+func (Sign) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (Sign) Aliases() []string {
diff --git a/commands/compose/switch.go b/commands/compose/switch.go
index c71716e0..c9d1013c 100644
--- a/commands/compose/switch.go
+++ b/commands/compose/switch.go
@@ -18,7 +18,11 @@ type SwitchAccount struct {
}
func init() {
- register(SwitchAccount{})
+ commands.Register(SwitchAccount{})
+}
+
+func (SwitchAccount) Context() commands.CommandContext {
+ return commands.COMPOSE
}
func (SwitchAccount) Aliases() []string {
diff --git a/commands/ct.go b/commands/ct.go
index 9948e691..1f99c6a5 100644
--- a/commands/ct.go
+++ b/commands/ct.go
@@ -13,7 +13,11 @@ type ChangeTab struct {
}
func init() {
- register(ChangeTab{})
+ Register(ChangeTab{})
+}
+
+func (ChangeTab) Context() CommandContext {
+ return GLOBAL
}
func (ChangeTab) Aliases() []string {
diff --git a/commands/eml.go b/commands/eml.go
index ebf3abfa..a786942c 100644
--- a/commands/eml.go
+++ b/commands/eml.go
@@ -16,7 +16,11 @@ type Eml struct {
}
func init() {
- register(Eml{})
+ Register(Eml{})
+}
+
+func (Eml) Context() CommandContext {
+ return GLOBAL
}
func (Eml) Aliases() []string {
diff --git a/commands/exec.go b/commands/exec.go
index 2a3ed5f5..874b2714 100644
--- a/commands/exec.go
+++ b/commands/exec.go
@@ -15,7 +15,11 @@ type ExecCmd struct {
}
func init() {
- register(ExecCmd{})
+ Register(ExecCmd{})
+}
+
+func (ExecCmd) Context() CommandContext {
+ return GLOBAL
}
func (ExecCmd) Aliases() []string {
diff --git a/commands/global.go b/commands/global.go
deleted file mode 100644
index ec7d623c..00000000
--- a/commands/global.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package commands
-
-var GlobalCommands *Commands
-
-func register(cmd Command) {
- if GlobalCommands == nil {
- GlobalCommands = NewCommands()
- }
- GlobalCommands.Register(cmd)
-}
diff --git a/commands/help.go b/commands/help.go
index 3d8d5ecf..ce86e3ac 100644
--- a/commands/help.go
+++ b/commands/help.go
@@ -29,7 +29,11 @@ var pages = []string{
}
func init() {
- register(Help{})
+ Register(Help{})
+}
+
+func (Help) Context() CommandContext {
+ return GLOBAL
}
func (Help) Aliases() []string {
diff --git a/commands/move-tab.go b/commands/move-tab.go
index 7ebe269c..c8e1b99a 100644
--- a/commands/move-tab.go
+++ b/commands/move-tab.go
@@ -13,7 +13,11 @@ type MoveTab struct {
}
func init() {
- register(MoveTab{})
+ Register(MoveTab{})
+}
+
+func (MoveTab) Context() CommandContext {
+ return GLOBAL
}
func (m *MoveTab) ParseIndex(arg string) error {
diff --git a/commands/msg/archive.go b/commands/msg/archive.go
index a46cc986..13f53290 100644
--- a/commands/msg/archive.go
+++ b/commands/msg/archive.go
@@ -35,7 +35,11 @@ func (a *Archive) ParseArchiveType(arg string) error {
}
func init() {
- register(Archive{})
+ commands.Register(Archive{})
+}
+
+func (Archive) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Archive) Aliases() []string {
diff --git a/commands/msg/copy.go b/commands/msg/copy.go
index f91d885b..3620238a 100644
--- a/commands/msg/copy.go
+++ b/commands/msg/copy.go
@@ -15,7 +15,11 @@ type Copy struct {
}
func init() {
- register(Copy{})
+ commands.Register(Copy{})
+}
+
+func (Copy) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Copy) Aliases() []string {
diff --git a/commands/msg/delete.go b/commands/msg/delete.go
index 869c6888..19f44b43 100644
--- a/commands/msg/delete.go
+++ b/commands/msg/delete.go
@@ -5,6 +5,7 @@ import (
"time"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/config"
"git.sr.ht/~rjarry/aerc/lib"
"git.sr.ht/~rjarry/aerc/lib/ui"
@@ -15,7 +16,11 @@ import (
type Delete struct{}
func init() {
- register(Delete{})
+ commands.Register(Delete{})
+}
+
+func (Delete) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Delete) Aliases() []string {
diff --git a/commands/msg/envelope.go b/commands/msg/envelope.go
index 62a266b0..24867fc1 100644
--- a/commands/msg/envelope.go
+++ b/commands/msg/envelope.go
@@ -6,6 +6,7 @@ import (
"strings"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/format"
"git.sr.ht/~rjarry/aerc/log"
"git.sr.ht/~rjarry/aerc/models"
@@ -18,7 +19,11 @@ type Envelope struct {
}
func init() {
- register(Envelope{})
+ commands.Register(Envelope{})
+}
+
+func (Envelope) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Envelope) Aliases() []string {
diff --git a/commands/msg/fold.go b/commands/msg/fold.go
index e8eb7741..057d454e 100644
--- a/commands/msg/fold.go
+++ b/commands/msg/fold.go
@@ -3,6 +3,7 @@ package msg
import (
"errors"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/ui"
)
@@ -12,7 +13,11 @@ type Fold struct {
}
func init() {
- register(Fold{})
+ commands.Register(Fold{})
+}
+
+func (Fold) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Fold) Aliases() []string {
diff --git a/commands/msg/forward.go b/commands/msg/forward.go
index 20e945c1..093ca2e2 100644
--- a/commands/msg/forward.go
+++ b/commands/msg/forward.go
@@ -33,7 +33,11 @@ type forward struct {
}
func init() {
- register(forward{})
+ commands.Register(forward{})
+}
+
+func (forward) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (forward) Aliases() []string {
diff --git a/commands/msg/invite.go b/commands/msg/invite.go
index 12bea93e..862af23c 100644
--- a/commands/msg/invite.go
+++ b/commands/msg/invite.go
@@ -6,6 +6,7 @@ import (
"io"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/config"
"git.sr.ht/~rjarry/aerc/lib"
"git.sr.ht/~rjarry/aerc/lib/calendar"
@@ -21,7 +22,11 @@ type invite struct {
}
func init() {
- register(invite{})
+ commands.Register(invite{})
+}
+
+func (invite) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (invite) Aliases() []string {
diff --git a/commands/msg/mark.go b/commands/msg/mark.go
index 9547548f..f86c3413 100644
--- a/commands/msg/mark.go
+++ b/commands/msg/mark.go
@@ -2,6 +2,8 @@ package msg
import (
"fmt"
+
+ "git.sr.ht/~rjarry/aerc/commands"
)
type Mark struct {
@@ -13,7 +15,11 @@ type Mark struct {
}
func init() {
- register(Mark{})
+ commands.Register(Mark{})
+}
+
+func (Mark) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Mark) Aliases() []string {
diff --git a/commands/msg/modify-labels.go b/commands/msg/modify-labels.go
index 8cc72f2a..e2637805 100644
--- a/commands/msg/modify-labels.go
+++ b/commands/msg/modify-labels.go
@@ -13,7 +13,11 @@ type ModifyLabels struct {
}
func init() {
- register(ModifyLabels{})
+ commands.Register(ModifyLabels{})
+}
+
+func (ModifyLabels) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (ModifyLabels) Aliases() []string {
diff --git a/commands/msg/move.go b/commands/msg/move.go
index 4eac1c14..000e2b2a 100644
--- a/commands/msg/move.go
+++ b/commands/msg/move.go
@@ -19,7 +19,11 @@ type Move struct {
}
func init() {
- register(Move{})
+ commands.Register(Move{})
+}
+
+func (Move) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Move) Aliases() []string {
diff --git a/commands/msg/msg.go b/commands/msg/msg.go
deleted file mode 100644
index 65a40562..00000000
--- a/commands/msg/msg.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package msg
-
-import (
- "git.sr.ht/~rjarry/aerc/commands"
-)
-
-var MessageCommands *commands.Commands
-
-func register(cmd commands.Command) {
- if MessageCommands == nil {
- MessageCommands = commands.NewCommands()
- }
- MessageCommands.Register(cmd)
-}
diff --git a/commands/msg/pipe.go b/commands/msg/pipe.go
index ee5cd965..8b47c418 100644
--- a/commands/msg/pipe.go
+++ b/commands/msg/pipe.go
@@ -25,7 +25,11 @@ type Pipe struct {
}
func init() {
- register(Pipe{})
+ commands.Register(Pipe{})
+}
+
+func (Pipe) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Pipe) Aliases() []string {
diff --git a/commands/msg/read.go b/commands/msg/read.go
index e682a156..b487d8a8 100644
--- a/commands/msg/read.go
+++ b/commands/msg/read.go
@@ -19,7 +19,11 @@ type FlagMsg struct {
}
func init() {
- register(FlagMsg{})
+ commands.Register(FlagMsg{})
+}
+
+func (FlagMsg) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (FlagMsg) Aliases() []string {
diff --git a/commands/msg/recall.go b/commands/msg/recall.go
index a676010a..059fe558 100644
--- a/commands/msg/recall.go
+++ b/commands/msg/recall.go
@@ -11,6 +11,7 @@ import (
"github.com/pkg/errors"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/config"
"git.sr.ht/~rjarry/aerc/lib"
"git.sr.ht/~rjarry/aerc/log"
@@ -24,7 +25,11 @@ type Recall struct {
}
func init() {
- register(Recall{})
+ commands.Register(Recall{})
+}
+
+func (Recall) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (Recall) Aliases() []string {
diff --git a/commands/msg/reply.go b/commands/msg/reply.go
index 333b3e3a..04c2eba5 100644
--- a/commands/msg/reply.go
+++ b/commands/msg/reply.go
@@ -34,7 +34,11 @@ type reply struct {
}
func init() {
- register(reply{})
+ commands.Register(reply{})
+}
+
+func (reply) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (reply) Aliases() []string {
diff --git a/commands/msg/toggle-thread-context.go b/commands/msg/toggle-thread-context.go
index 4b87eaa8..dfae3a22 100644
--- a/commands/msg/toggle-thread-context.go
+++ b/commands/msg/toggle-thread-context.go
@@ -1,13 +1,18 @@
package msg
import (
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/ui"
)
type ToggleThreadContext struct{}
func init() {
- register(ToggleThreadContext{})
+ commands.Register(ToggleThreadContext{})
+}
+
+func (ToggleThreadContext) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (ToggleThreadContext) Aliases() []string {
diff --git a/commands/msg/toggle-threads.go b/commands/msg/toggle-threads.go
index d2933bba..21accc2c 100644
--- a/commands/msg/toggle-threads.go
+++ b/commands/msg/toggle-threads.go
@@ -1,6 +1,7 @@
package msg
import (
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/state"
"git.sr.ht/~rjarry/aerc/lib/ui"
)
@@ -8,7 +9,11 @@ import (
type ToggleThreads struct{}
func init() {
- register(ToggleThreads{})
+ commands.Register(ToggleThreads{})
+}
+
+func (ToggleThreads) Context() commands.CommandContext {
+ return commands.MESSAGE
}
func (ToggleThreads) Aliases() []string {
diff --git a/commands/msg/unsubscribe.go b/commands/msg/unsubscribe.go
index c6a0b23f..7ba497b4 100644
--- a/commands/msg/unsubscribe.go
+++ b/commands/msg/unsubscribe.go
@@ -9,6 +9,7 @@ import (
"time"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/config"
"git.sr.ht/~rjarry/aerc/lib"
"git.sr.ht/~rjarry/aerc/log"
@@ -23,7 +24,11 @@ type Unsubscribe struct {
}
func init() {
- register(Unsubscribe{})
+ commands.Register(Unsubscribe{})
+}
+
+func (Unsubscribe) Context() commands.CommandContext {
+ return commands.MESSAGE
}
// Aliases returns a list of aliases for the :unsubscribe command
diff --git a/commands/msgview/close.go b/commands/msgview/close.go
deleted file mode 100644
index 95960ef3..00000000
--- a/commands/msgview/close.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package msgview
-
-import (
- "git.sr.ht/~rjarry/aerc/app"
-)
-
-type Close struct{}
-
-func init() {
- register(Close{})
-}
-
-func (Close) Aliases() []string {
- return []string{"close"}
-}
-
-func (Close) Execute(args []string) error {
- mv, _ := app.SelectedTabContent().(*app.MessageViewer)
- app.RemoveTab(mv, true)
- return nil
-}
diff --git a/commands/msgview/msgview.go b/commands/msgview/msgview.go
deleted file mode 100644
index fb32d8e1..00000000
--- a/commands/msgview/msgview.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package msgview
-
-import (
- "git.sr.ht/~rjarry/aerc/commands"
-)
-
-var MessageViewCommands *commands.Commands
-
-func register(cmd commands.Command) {
- if MessageViewCommands == nil {
- MessageViewCommands = commands.NewCommands()
- }
- MessageViewCommands.Register(cmd)
-}
diff --git a/commands/msgview/next-part.go b/commands/msgview/next-part.go
index 77eb008d..b5375d75 100644
--- a/commands/msgview/next-part.go
+++ b/commands/msgview/next-part.go
@@ -2,6 +2,7 @@ package msgview
import (
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type NextPrevPart struct {
@@ -9,7 +10,11 @@ type NextPrevPart struct {
}
func init() {
- register(NextPrevPart{})
+ commands.Register(NextPrevPart{})
+}
+
+func (NextPrevPart) Context() commands.CommandContext {
+ return commands.MESSAGE_VIEWER
}
func (NextPrevPart) Aliases() []string {
diff --git a/commands/msgview/next.go b/commands/msgview/next.go
deleted file mode 100644
index c953cd5d..00000000
--- a/commands/msgview/next.go
+++ /dev/null
@@ -1,83 +0,0 @@
-package msgview
-
-import (
- "errors"
- "fmt"
- "strconv"
- "strings"
-
- "git.sr.ht/~rjarry/aerc/app"
- "git.sr.ht/~rjarry/aerc/commands/account"
- "git.sr.ht/~rjarry/aerc/lib"
- "git.sr.ht/~rjarry/aerc/models"
- "git.sr.ht/~rjarry/aerc/worker/types"
-)
-
-type NextPrevMsg struct {
- Amount int `opt:"n" default:"1" metavar:"N[%]" action:"ParseAmount"`
- Percent bool
-}
-
-func init() {
- register(NextPrevMsg{})
-}
-
-func (np *NextPrevMsg) ParseAmount(arg string) error {
- if strings.HasSuffix(arg, "%") {
- np.Percent = true
- arg = strings.TrimSuffix(arg, "%")
- }
- i, err := strconv.ParseInt(arg, 10, 64)
- if err != nil {
- return err
- }
- np.Amount = int(i)
- return nil
-}
-
-func (NextPrevMsg) Aliases() []string {
- return []string{"next", "next-message", "prev", "prev-message"}
-}
-
-func (np NextPrevMsg) Execute(args []string) error {
- cmd := account.NextPrevMsg{Amount: np.Amount, Percent: np.Percent}
- err := cmd.Execute(args)
- if err != nil {
- return err
- }
-
- mv, _ := app.SelectedTabContent().(*app.MessageViewer)
- acct := mv.SelectedAccount()
- if acct == nil {
- return errors.New("No account selected")
- }
- store := mv.Store()
- if store == nil {
- return fmt.Errorf("Cannot perform action. No message store set.")
- }
- executeNextPrev := func(nextMsg *models.MessageInfo) {
- lib.NewMessageStoreView(nextMsg, mv.MessageView().SeenFlagSet(),
- store, app.CryptoProvider(), app.DecryptKeys,
- func(view lib.MessageView, err error) {
- if err != nil {
- app.PushError(err.Error())
- return
- }
- nextMv := app.NewMessageViewer(acct, view)
- app.ReplaceTab(mv, nextMv,
- nextMsg.Envelope.Subject, true)
- })
- }
- if nextMsg := store.Selected(); nextMsg != nil {
- executeNextPrev(nextMsg)
- } else {
- store.FetchHeaders([]uint32{store.SelectedUid()},
- func(msg types.WorkerMessage) {
- if m, ok := msg.(*types.MessageInfo); ok {
- executeNextPrev(m.Info)
- }
- })
- }
-
- return nil
-}
diff --git a/commands/msgview/open-link.go b/commands/msgview/open-link.go
index b13f5d4f..e64e6e2f 100644
--- a/commands/msgview/open-link.go
+++ b/commands/msgview/open-link.go
@@ -16,7 +16,11 @@ type OpenLink struct {
}
func init() {
- register(OpenLink{})
+ commands.Register(OpenLink{})
+}
+
+func (OpenLink) Context() commands.CommandContext {
+ return commands.MESSAGE_VIEWER
}
func (OpenLink) Aliases() []string {
diff --git a/commands/msgview/open.go b/commands/msgview/open.go
index a8443404..3943b21a 100644
--- a/commands/msgview/open.go
+++ b/commands/msgview/open.go
@@ -8,6 +8,7 @@ import (
"path/filepath"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib"
"git.sr.ht/~rjarry/aerc/log"
)
@@ -18,7 +19,11 @@ type Open struct {
}
func init() {
- register(Open{})
+ commands.Register(Open{})
+}
+
+func (Open) Context() commands.CommandContext {
+ return commands.MESSAGE_VIEWER
}
func (Open) Options() string {
diff --git a/commands/msgview/save.go b/commands/msgview/save.go
index bcaf9eb2..d9320293 100644
--- a/commands/msgview/save.go
+++ b/commands/msgview/save.go
@@ -26,7 +26,11 @@ type Save struct {
}
func init() {
- register(Save{})
+ commands.Register(Save{})
+}
+
+func (Save) Context() commands.CommandContext {
+ return commands.MESSAGE_VIEWER
}
func (Save) Options() string {
diff --git a/commands/msgview/toggle-headers.go b/commands/msgview/toggle-headers.go
index 37f5b22f..201fce90 100644
--- a/commands/msgview/toggle-headers.go
+++ b/commands/msgview/toggle-headers.go
@@ -2,12 +2,17 @@ package msgview
import (
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
)
type ToggleHeaders struct{}
func init() {
- register(ToggleHeaders{})
+ commands.Register(ToggleHeaders{})
+}
+
+func (ToggleHeaders) Context() commands.CommandContext {
+ return commands.MESSAGE_VIEWER
}
func (ToggleHeaders) Aliases() []string {
diff --git a/commands/msgview/toggle-key-passthrough.go b/commands/msgview/toggle-key-passthrough.go
index b4c5f2c7..1b3f8628 100644
--- a/commands/msgview/toggle-key-passthrough.go
+++ b/commands/msgview/toggle-key-passthrough.go
@@ -2,13 +2,18 @@ package msgview
import (
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/state"
)
type ToggleKeyPassthrough struct{}
func init() {
- register(ToggleKeyPassthrough{})
+ commands.Register(ToggleKeyPassthrough{})
+}
+
+func (ToggleKeyPassthrough) Context() commands.CommandContext {
+ return commands.MESSAGE_VIEWER
}
func (ToggleKeyPassthrough) Aliases() []string {
diff --git a/commands/new-account.go b/commands/new-account.go
index 1a14a821..5a5499df 100644
--- a/commands/new-account.go
+++ b/commands/new-account.go
@@ -9,7 +9,11 @@ type NewAccount struct {
}
func init() {
- register(NewAccount{})
+ Register(NewAccount{})
+}
+
+func (NewAccount) Context() CommandContext {
+ return GLOBAL
}
func (NewAccount) Aliases() []string {
diff --git a/commands/next-tab.go b/commands/next-tab.go
index f1f34d22..adab95ae 100644
--- a/commands/next-tab.go
+++ b/commands/next-tab.go
@@ -9,7 +9,11 @@ type NextPrevTab struct {
}
func init() {
- register(NextPrevTab{})
+ Register(NextPrevTab{})
+}
+
+func (NextPrevTab) Context() CommandContext {
+ return GLOBAL
}
func (NextPrevTab) Aliases() []string {
diff --git a/commands/patch/apply.go b/commands/patch/apply.go
index 2806b7d1..5ffe86d1 100644
--- a/commands/patch/apply.go
+++ b/commands/patch/apply.go
@@ -24,6 +24,10 @@ func init() {
register(Apply{})
}
+func (Apply) Context() commands.CommandContext {
+ return commands.MESSAGE
+}
+
func (Apply) Aliases() []string {
return []string{"apply"}
}
diff --git a/commands/patch/cd.go b/commands/patch/cd.go
index 86a2db3e..bbca1eba 100644
--- a/commands/patch/cd.go
+++ b/commands/patch/cd.go
@@ -6,6 +6,7 @@ import (
"time"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/pama"
)
@@ -15,6 +16,10 @@ func init() {
register(Cd{})
}
+func (Cd) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (Cd) Aliases() []string {
return []string{"cd"}
}
diff --git a/commands/patch/delete.go b/commands/patch/delete.go
index 2e51ab7c..24351f7c 100644
--- a/commands/patch/delete.go
+++ b/commands/patch/delete.go
@@ -18,6 +18,10 @@ func init() {
register(Delete{})
}
+func (Delete) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (Delete) Aliases() []string {
return []string{"delete"}
}
diff --git a/commands/patch/find.go b/commands/patch/find.go
index 9579e1f8..a508551d 100644
--- a/commands/patch/find.go
+++ b/commands/patch/find.go
@@ -23,6 +23,10 @@ func init() {
register(Find{})
}
+func (Find) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (Find) Aliases() []string {
return []string{"find"}
}
diff --git a/commands/patch/init.go b/commands/patch/init.go
index 328fcd9f..de0c6e45 100644
--- a/commands/patch/init.go
+++ b/commands/patch/init.go
@@ -5,6 +5,7 @@ import (
"os"
"path/filepath"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib/pama"
)
@@ -17,6 +18,10 @@ func init() {
register(Init{})
}
+func (Init) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (Init) Aliases() []string {
return []string{"init"}
}
diff --git a/commands/patch/list.go b/commands/patch/list.go
index 6dcc06e8..73461f2e 100644
--- a/commands/patch/list.go
+++ b/commands/patch/list.go
@@ -8,6 +8,7 @@ import (
"time"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/config"
"git.sr.ht/~rjarry/aerc/lib/pama"
"git.sr.ht/~rjarry/aerc/lib/pama/models"
@@ -24,6 +25,10 @@ func init() {
register(List{})
}
+func (List) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (List) Aliases() []string {
return []string{"list", "ls"}
}
diff --git a/commands/patch/patch.go b/commands/patch/patch.go
index 0807c1fa..25d7850a 100644
--- a/commands/patch/patch.go
+++ b/commands/patch/patch.go
@@ -8,32 +8,31 @@ import (
"git.sr.ht/~rjarry/go-opt"
)
-var (
- PatchCommands *commands.Commands
- subCommands *commands.Commands
-)
+var subCommands map[string]commands.Command
func register(cmd commands.Command) {
if subCommands == nil {
- subCommands = commands.NewCommands()
+ subCommands = make(map[string]commands.Command)
+ }
+ for _, alias := range cmd.Aliases() {
+ if subCommands[alias] != nil {
+ panic("duplicate sub command alias: " + alias)
+ }
+ subCommands[alias] = cmd
}
- subCommands.Register(cmd)
}
-func registerPatch(cmd commands.Command) {
- if PatchCommands == nil {
- PatchCommands = commands.NewCommands()
- }
- PatchCommands.Register(cmd)
+type Patch struct {
+ SubCmd commands.Command `opt:"command" action:"ParseSub" complete:"CompleteSubNames"`
+ Args string `opt:"..." required:"false" complete:"CompleteSubArgs"`
}
func init() {
- registerPatch(Patch{})
+ commands.Register(Patch{})
}
-type Patch struct {
- SubCmd commands.Command `opt:"command" action:"ParseSub" complete:"CompleteSubNames"`
- Args string `opt:"..." required:"false" complete:"CompleteSubArgs"`
+func (Patch) Context() commands.CommandContext {
+ return commands.GLOBAL
}
func (Patch) Aliases() []string {
@@ -41,16 +40,26 @@ func (Patch) Aliases() []string {
}
func (p *Patch) ParseSub(arg string) error {
- p.SubCmd = subCommands.ByName(arg)
- if p.SubCmd == nil {
- return fmt.Errorf("%s unknown sub-command", arg)
+ cmd, ok := subCommands[arg]
+ if ok {
+ context := commands.CurrentContext()
+ if cmd.Context()&context != 0 {
+ p.SubCmd = cmd
+ return nil
+ }
}
- return nil
+ return fmt.Errorf("%s unknown sub-command", arg)
}
func (*Patch) CompleteSubNames(arg string) []string {
- options := subCommands.Names()
- return commands.FilterList(options, arg, nil)
+ context := commands.CurrentContext()
+ options := make([]string, 0, len(subCommands))
+ for alias, cmd := range subCommands {
+ if cmd.Context()&context != 0 {
+ options = append(options, alias)
+ }
+ }
+ return commands.FilterList(options, arg, commands.QuoteSpace)
}
func (p *Patch) CompleteSubArgs(arg string) []string {
diff --git a/commands/patch/rebase.go b/commands/patch/rebase.go
index 10da2a63..6ef43299 100644
--- a/commands/patch/rebase.go
+++ b/commands/patch/rebase.go
@@ -12,6 +12,7 @@ import (
"time"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/config"
"git.sr.ht/~rjarry/aerc/lib/pama"
"git.sr.ht/~rjarry/aerc/lib/pama/models"
@@ -27,6 +28,10 @@ func init() {
register(Rebase{})
}
+func (Rebase) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (Rebase) Aliases() []string {
return []string{"rebase"}
}
diff --git a/commands/patch/remove.go b/commands/patch/remove.go
index 6697177b..29849e51 100644
--- a/commands/patch/remove.go
+++ b/commands/patch/remove.go
@@ -18,6 +18,10 @@ func init() {
register(Remove{})
}
+func (Remove) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (Remove) Aliases() []string {
return []string{"remove"}
}
diff --git a/commands/patch/switch.go b/commands/patch/switch.go
index b1193be7..aab2acb6 100644
--- a/commands/patch/switch.go
+++ b/commands/patch/switch.go
@@ -18,6 +18,10 @@ func init() {
register(Switch{})
}
+func (Switch) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (Switch) Aliases() []string {
return []string{"switch"}
}
diff --git a/commands/patch/term.go b/commands/patch/term.go
index f2c50b15..f9f79be1 100644
--- a/commands/patch/term.go
+++ b/commands/patch/term.go
@@ -13,6 +13,10 @@ func init() {
register(Term{})
}
+func (Term) Context() commands.CommandContext {
+ return commands.GLOBAL
+}
+
func (Term) Aliases() []string {
return []string{"term"}
}
diff --git a/commands/pin-tab.go b/commands/pin-tab.go
index d5013bf6..aaac356d 100644
--- a/commands/pin-tab.go
+++ b/commands/pin-tab.go
@@ -7,7 +7,11 @@ import (
type PinTab struct{}
func init() {
- register(PinTab{})
+ Register(PinTab{})
+}
+
+func (PinTab) Context() CommandContext {
+ return GLOBAL
}
func (PinTab) Aliases() []string {
diff --git a/commands/prompt.go b/commands/prompt.go
index 4fcf8a80..9ab2aac1 100644
--- a/commands/prompt.go
+++ b/commands/prompt.go
@@ -12,7 +12,11 @@ type Prompt struct {
}
func init() {
- register(Prompt{})
+ Register(Prompt{})
+}
+
+func (Prompt) Context() CommandContext {
+ return GLOBAL
}
func (Prompt) Aliases() []string {
@@ -20,7 +24,7 @@ func (Prompt) Aliases() []string {
}
func (*Prompt) CompleteCommand(arg string) []string {
- return FilterList(GlobalCommands.Names(), arg, nil)
+ return FilterList(ActiveCommandNames(), arg, nil)
}
func (p Prompt) Execute(args []string) error {
diff --git a/commands/pwd.go b/commands/pwd.go
index 2b1961a1..fb1d04f1 100644
--- a/commands/pwd.go
+++ b/commands/pwd.go
@@ -10,7 +10,11 @@ import (
type PrintWorkDir struct{}
func init() {
- register(PrintWorkDir{})
+ Register(PrintWorkDir{})
+}
+
+func (PrintWorkDir) Context() CommandContext {
+ return GLOBAL
}
func (PrintWorkDir) Aliases() []string {
diff --git a/commands/quit.go b/commands/quit.go
index e96c9253..aa996422 100644
--- a/commands/quit.go
+++ b/commands/quit.go
@@ -11,7 +11,11 @@ type Quit struct {
}
func init() {
- register(Quit{})
+ Register(Quit{})
+}
+
+func (Quit) Context() CommandContext {
+ return GLOBAL
}
func (Quit) Aliases() []string {
diff --git a/commands/send-keys.go b/commands/send-keys.go
index bb872a33..a7b6dee9 100644
--- a/commands/send-keys.go
+++ b/commands/send-keys.go
@@ -12,7 +12,11 @@ type SendKeys struct {
}
func init() {
- register(SendKeys{})
+ Register(SendKeys{})
+}
+
+func (SendKeys) Context() CommandContext {
+ return GLOBAL
}
func (SendKeys) Aliases() []string {
diff --git a/commands/suspend.go b/commands/suspend.go
index a8996441..52198774 100644
--- a/commands/suspend.go
+++ b/commands/suspend.go
@@ -5,7 +5,11 @@ import "git.sr.ht/~rjarry/aerc/lib/ui"
type Suspend struct{}
func init() {
- register(Suspend{})
+ Register(Suspend{})
+}
+
+func (Suspend) Context() CommandContext {
+ return GLOBAL
}
func (Suspend) Aliases() []string {
diff --git a/commands/term.go b/commands/term.go
index d115cd25..e8b1919d 100644
--- a/commands/term.go
+++ b/commands/term.go
@@ -15,7 +15,11 @@ type Term struct {
}
func init() {
- register(Term{})
+ Register(Term{})
+}
+
+func (Term) Context() CommandContext {
+ return GLOBAL
}
func (Term) Aliases() []string {
diff --git a/commands/terminal/close.go b/commands/terminal/close.go
deleted file mode 100644
index 610a8463..00000000
--- a/commands/terminal/close.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package terminal
-
-import (
- "git.sr.ht/~rjarry/aerc/app"
-)
-
-type Close struct{}
-
-func init() {
- register(Close{})
-}
-
-func (Close) Aliases() []string {
- return []string{"close"}
-}
-
-func (Close) Execute(args []string) error {
- term, _ := app.SelectedTabContent().(*app.Terminal)
- term.Close()
- return nil
-}
diff --git a/commands/terminal/terminal.go b/commands/terminal/terminal.go
deleted file mode 100644
index edc8429f..00000000
--- a/commands/terminal/terminal.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package terminal
-
-import (
- "git.sr.ht/~rjarry/aerc/commands"
-)
-
-var TerminalCommands *commands.Commands
-
-func register(cmd commands.Command) {
- if TerminalCommands == nil {
- TerminalCommands = commands.NewCommands()
- }
- TerminalCommands.Register(cmd)
-}
diff --git a/commands/z.go b/commands/z.go
index a2363ae2..ef26ae9c 100644
--- a/commands/z.go
+++ b/commands/z.go
@@ -30,10 +30,14 @@ func ZoxideQuery(args []string) (string, error) {
func init() {
_, err := exec.LookPath("zoxide")
if err == nil {
- register(Zoxide{})
+ Register(Zoxide{})
}
}
+func (Zoxide) Context() CommandContext {
+ return GLOBAL
+}
+
func (Zoxide) Aliases() []string {
return []string{"z"}
}
diff --git a/main.go b/main.go
index a7e2980d..ad926a63 100644
--- a/main.go
+++ b/main.go
@@ -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)