diff options
Diffstat (limited to 'commands/account')
-rw-r--r-- | commands/account/cf.go | 89 |
1 files changed, 66 insertions, 23 deletions
diff --git a/commands/account/cf.go b/commands/account/cf.go index ff44c6a3..579ddd72 100644 --- a/commands/account/cf.go +++ b/commands/account/cf.go @@ -3,6 +3,7 @@ package account import ( "errors" "reflect" + "time" "git.sr.ht/~rjarry/aerc/app" "git.sr.ht/~rjarry/aerc/commands" @@ -16,7 +17,8 @@ import ( var history map[string]string type ChangeFolder struct { - Folder string `opt:"..." complete:"CompleteFolder"` + Account bool `opt:"-a"` + Folder string `opt:"..." complete:"CompleteFolder"` } func init() { @@ -28,8 +30,20 @@ func (ChangeFolder) Aliases() []string { return []string{"cf"} } -func (*ChangeFolder) CompleteFolder(arg string) []string { - acct := app.SelectedAccount() +func (c *ChangeFolder) CompleteFolder(arg string) []string { + var acct *app.AccountView + + args := opt.LexArgs(c.Folder) + if c.Account { + accountName, _ := args.ArgSafe(0) + if args.Count() <= 1 && arg == accountName { + return commands.FilterList( + app.AccountNames(), arg, commands.QuoteSpace) + } + acct, _ = app.Account(accountName) + } else { + acct = app.SelectedAccount() + } if acct == nil { return nil } @@ -45,46 +59,75 @@ func (*ChangeFolder) CompleteFolder(arg string) []string { ) } -func (c ChangeFolder) Execute(args []string) error { - acct := app.SelectedAccount() - if acct == nil { - return errors.New("No account selected") +func (c ChangeFolder) Execute([]string) error { + var target string + var acct *app.AccountView + + args := opt.LexArgs(c.Folder) + + if c.Account { + names, err := args.ShiftSafe(1) + if err != nil { + return errors.New("<account> is required. Usage: cf -a <account> <folder>") + } + acct, err = app.Account(names[0]) + if err != nil { + return err + } + } else { + acct = app.SelectedAccount() + if acct == nil { + return errors.New("No account selected") + } } - var target string + if args.Count() == 0 { + return errors.New("<folder> is required. Usage: cf [-a <account>] <folder>") + } notmuch, _ := handlers.GetHandlerForScheme("notmuch", new(types.Worker)) if reflect.TypeOf(notmuch) == reflect.TypeOf(acct.Worker().Backend) { // With notmuch, :cf can change to a "dynamic folder" that // contains the result of a query. Preserve the entered // arguments verbatim. - target = c.Folder + target = args.String() } else { - parts := opt.SplitArgs(c.Folder) - if len(parts) != 1 { - return errors.New("Unexpected argument(s). Usage: cf <folder>") + if args.Count() != 1 { + return errors.New("Unexpected argument(s). Usage: cf [-a <account>] <folder>") } - target = parts[0] + target = args.Arg(0) } - previous := acct.Directories().Selected() + finalize := func(msg types.WorkerMessage) { + // As we're waiting for the worker to report status we must run + // the rest of the actions in this callback. + switch msg := msg.(type) { + case *types.Error: + app.PushError(msg.Error.Error()) + case *types.Done: + curAccount := app.SelectedAccount() + previous := curAccount.Directories().Selected() + history[curAccount.Name()] = previous + // reset store filtering if we switched folders + store := acct.Store() + if store != nil { + store.ApplyClear() + acct.SetStatus(state.SearchFilterClear()) + } + // focus account tab + acct.Select() + } + } if target == "-" { if dir, ok := history[acct.Name()]; ok { - acct.Directories().Select(dir) + acct.Directories().Open(dir, 0*time.Second, finalize) } else { return errors.New("No previous folder to return to") } } else { - acct.Directories().Select(target) + acct.Directories().Open(target, 0*time.Second, finalize) } - history[acct.Name()] = previous - // reset store filtering if we switched folders - store := acct.Store() - if store != nil { - store.ApplyClear() - acct.SetStatus(state.SearchFilterClear()) - } return nil } |