aboutsummaryrefslogtreecommitdiffstats
path: root/commands/account
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2023-10-22 23:23:18 +0200
committerRobin Jarry <robin@jarry.cc>2023-10-28 19:25:10 +0200
commitabe228b14d97d8d47e8ff4406de387fac45cfe68 (patch)
tree56117403d1ae32d7253f86bab01a944a3cf225b9 /commands/account
parent30851656591293ed2e19340ab78c937855a11143 (diff)
downloadaerc-abe228b14d97d8d47e8ff4406de387fac45cfe68.tar.gz
commands: use completion from go-opt
Implement command completion with complete struct field tags from the get-opt library introduced earlier. Changelog-changed: Improved command completion. 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/account')
-rw-r--r--commands/account/cf.go6
-rw-r--r--commands/account/check-mail.go4
-rw-r--r--commands/account/clear.go4
-rw-r--r--commands/account/compose.go11
-rw-r--r--commands/account/connection.go4
-rw-r--r--commands/account/expand-folder.go4
-rw-r--r--commands/account/export-mbox.go6
-rw-r--r--commands/account/import-mbox.go7
-rw-r--r--commands/account/mkdir.go29
-rw-r--r--commands/account/next-folder.go4
-rw-r--r--commands/account/next-result.go4
-rw-r--r--commands/account/next.go4
-rw-r--r--commands/account/recover.go7
-rw-r--r--commands/account/rmdir.go4
-rw-r--r--commands/account/search.go41
-rw-r--r--commands/account/select.go4
-rw-r--r--commands/account/sort.go56
-rw-r--r--commands/account/split.go4
-rw-r--r--commands/account/view.go4
19 files changed, 57 insertions, 150 deletions
diff --git a/commands/account/cf.go b/commands/account/cf.go
index 59203a89..d73d4978 100644
--- a/commands/account/cf.go
+++ b/commands/account/cf.go
@@ -11,7 +11,7 @@ import (
var history map[string]string
type ChangeFolder struct {
- Folder string `opt:"..." metavar:"<folder>"`
+ Folder string `opt:"folder" complete:"CompleteFolder"`
}
func init() {
@@ -23,8 +23,8 @@ func (ChangeFolder) Aliases() []string {
return []string{"cf"}
}
-func (ChangeFolder) Complete(args []string) []string {
- return commands.GetFolders(args)
+func (*ChangeFolder) CompleteFolder(arg string) []string {
+ return commands.GetFolders(arg)
}
func (c ChangeFolder) Execute(args []string) error {
diff --git a/commands/account/check-mail.go b/commands/account/check-mail.go
index a8d80a66..d31b2648 100644
--- a/commands/account/check-mail.go
+++ b/commands/account/check-mail.go
@@ -16,10 +16,6 @@ func (CheckMail) Aliases() []string {
return []string{"check-mail"}
}
-func (CheckMail) Complete(args []string) []string {
- return nil
-}
-
func (CheckMail) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/clear.go b/commands/account/clear.go
index fd209d07..dec6bcd2 100644
--- a/commands/account/clear.go
+++ b/commands/account/clear.go
@@ -19,10 +19,6 @@ func (Clear) Aliases() []string {
return []string{"clear"}
}
-func (Clear) Complete(args []string) []string {
- return nil
-}
-
func (c Clear) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/compose.go b/commands/account/compose.go
index 81eb3de0..fe86a179 100644
--- a/commands/account/compose.go
+++ b/commands/account/compose.go
@@ -11,12 +11,13 @@ import (
"github.com/emersion/go-message/mail"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/config"
)
type Compose struct {
Headers string `opt:"-H" action:"ParseHeader"`
- Template string `opt:"-T"`
+ Template string `opt:"-T" complete:"CompleteTemplate"`
Edit bool `opt:"-e"`
NoEdit bool `opt:"-E"`
Body string `opt:"..." required:"false"`
@@ -37,12 +38,12 @@ func (c *Compose) ParseHeader(arg string) error {
return nil
}
-func (Compose) Aliases() []string {
- return []string{"compose"}
+func (*Compose) CompleteTemplate(arg string) []string {
+ return commands.GetTemplates(arg)
}
-func (Compose) Complete(args []string) []string {
- return nil
+func (Compose) Aliases() []string {
+ return []string{"compose"}
}
func (c Compose) Execute(args []string) error {
diff --git a/commands/account/connection.go b/commands/account/connection.go
index b9cd887b..d633c1ce 100644
--- a/commands/account/connection.go
+++ b/commands/account/connection.go
@@ -18,10 +18,6 @@ func (Connection) Aliases() []string {
return []string{"connect", "disconnect"}
}
-func (Connection) Complete(args []string) []string {
- return nil
-}
-
func (c Connection) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/expand-folder.go b/commands/account/expand-folder.go
index f26da70a..c264872a 100644
--- a/commands/account/expand-folder.go
+++ b/commands/account/expand-folder.go
@@ -16,10 +16,6 @@ func (ExpandCollapseFolder) Aliases() []string {
return []string{"expand-folder", "collapse-folder"}
}
-func (ExpandCollapseFolder) Complete(args []string) []string {
- return nil
-}
-
func (ExpandCollapseFolder) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/export-mbox.go b/commands/account/export-mbox.go
index 00e03ca6..14d9290e 100644
--- a/commands/account/export-mbox.go
+++ b/commands/account/export-mbox.go
@@ -17,7 +17,7 @@ import (
)
type ExportMbox struct {
- Filename string `opt:"filename"`
+ Filename string `opt:"filename" complete:"CompleteFilename"`
}
func init() {
@@ -28,8 +28,8 @@ func (ExportMbox) Aliases() []string {
return []string{"export-mbox"}
}
-func (ExportMbox) Complete(args []string) []string {
- return commands.CompletePath(filepath.Join(args...))
+func (*ExportMbox) CompleteFilename(arg string) []string {
+ return commands.CompletePath(arg)
}
func (e ExportMbox) Execute(args []string) error {
diff --git a/commands/account/import-mbox.go b/commands/account/import-mbox.go
index b3ad2a08..774dfa8f 100644
--- a/commands/account/import-mbox.go
+++ b/commands/account/import-mbox.go
@@ -6,7 +6,6 @@ import (
"fmt"
"io"
"os"
- "path/filepath"
"sync/atomic"
"time"
@@ -19,7 +18,7 @@ import (
)
type ImportMbox struct {
- Filename string `opt:"filename"`
+ Filename string `opt:"filename" complete:"CompleteFilename"`
}
func init() {
@@ -30,8 +29,8 @@ func (ImportMbox) Aliases() []string {
return []string{"import-mbox"}
}
-func (ImportMbox) Complete(args []string) []string {
- return commands.CompletePath(filepath.Join(args...))
+func (*ImportMbox) CompleteFilename(arg string) []string {
+ return commands.CompletePath(arg)
}
func (i ImportMbox) Execute(args []string) error {
diff --git a/commands/account/mkdir.go b/commands/account/mkdir.go
index 9beeb01a..3e546ace 100644
--- a/commands/account/mkdir.go
+++ b/commands/account/mkdir.go
@@ -2,15 +2,15 @@ package account
import (
"errors"
- "strings"
"time"
"git.sr.ht/~rjarry/aerc/app"
+ "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/worker/types"
)
type MakeDir struct {
- Folder string `opt:"..." metavar:"<folder>"`
+ Folder string `opt:"folder" complete:"CompleteFolder"`
}
func init() {
@@ -21,26 +21,15 @@ func (MakeDir) Aliases() []string {
return []string{"mkdir"}
}
-func (MakeDir) Complete(args []string) []string {
- if len(args) == 0 {
+func (*MakeDir) CompleteFolder(arg string) []string {
+ acct := app.SelectedAccount()
+ if acct == nil {
return nil
}
- name := strings.Join(args, " ")
-
- list := app.SelectedAccount().Directories().List()
- inboxes := make([]string, len(list))
- copy(inboxes, list)
-
- // remove inboxes that don't match and append the path separator to all
- // others
- for i := len(inboxes) - 1; i >= 0; i-- {
- if !strings.HasPrefix(inboxes[i], name) && name != "" {
- inboxes = append(inboxes[:i], inboxes[i+1:]...)
- continue
- }
- inboxes[i] += app.SelectedAccount().Worker().PathSeparator()
- }
- return inboxes
+ return commands.FilterList(
+ acct.Directories().List(), arg, "",
+ app.SelectedAccount().Worker().PathSeparator(),
+ app.SelectedAccountUiConfig().FuzzyComplete)
}
func (m MakeDir) Execute(args []string) error {
diff --git a/commands/account/next-folder.go b/commands/account/next-folder.go
index 1b5651c8..f44abdc1 100644
--- a/commands/account/next-folder.go
+++ b/commands/account/next-folder.go
@@ -18,10 +18,6 @@ func (NextPrevFolder) Aliases() []string {
return []string{"next-folder", "prev-folder"}
}
-func (NextPrevFolder) Complete(args []string) []string {
- return nil
-}
-
func (np NextPrevFolder) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/next-result.go b/commands/account/next-result.go
index e841899f..d624e559 100644
--- a/commands/account/next-result.go
+++ b/commands/account/next-result.go
@@ -17,10 +17,6 @@ func (NextPrevResult) Aliases() []string {
return []string{"next-result", "prev-result"}
}
-func (NextPrevResult) Complete(args []string) []string {
- return nil
-}
-
func (NextPrevResult) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/next.go b/commands/account/next.go
index 14679b1b..142f6151 100644
--- a/commands/account/next.go
+++ b/commands/account/next.go
@@ -35,10 +35,6 @@ func (NextPrevMsg) Aliases() []string {
return []string{"next", "next-message", "prev", "prev-message"}
}
-func (NextPrevMsg) Complete(args []string) []string {
- return nil
-}
-
func (np NextPrevMsg) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/recover.go b/commands/account/recover.go
index dae3d807..cba6e0cb 100644
--- a/commands/account/recover.go
+++ b/commands/account/recover.go
@@ -16,7 +16,7 @@ type Recover struct {
Force bool `opt:"-f"`
Edit bool `opt:"-e"`
NoEdit bool `opt:"-E"`
- File string `opt:"file"`
+ File string `opt:"file" complete:"CompleteFile"`
}
func init() {
@@ -31,7 +31,7 @@ func (Recover) Options() string {
return "feE"
}
-func (r Recover) Complete(args []string) []string {
+func (*Recover) CompleteFile(arg string) []string {
// file name of temp file is hard-coded in the NewComposer() function
files, err := filepath.Glob(
filepath.Join(os.TempDir(), "aerc-compose-*.eml"),
@@ -39,8 +39,7 @@ func (r Recover) Complete(args []string) []string {
if err != nil {
return nil
}
- return commands.CompletionFromList(files,
- commands.Operands(args, r.Options()))
+ return commands.CompletionFromList(files, arg)
}
func (r Recover) Execute(args []string) error {
diff --git a/commands/account/rmdir.go b/commands/account/rmdir.go
index 36bfc699..398f375f 100644
--- a/commands/account/rmdir.go
+++ b/commands/account/rmdir.go
@@ -20,10 +20,6 @@ func (RemoveDir) Aliases() []string {
return []string{"rmdir"}
}
-func (RemoveDir) Complete(args []string) []string {
- return nil
-}
-
func (r RemoveDir) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/search.go b/commands/account/search.go
index bb5617c0..ca1b9684 100644
--- a/commands/account/search.go
+++ b/commands/account/search.go
@@ -23,12 +23,12 @@ type SearchFilter struct {
Body bool `opt:"-b"`
All bool `opt:"-a"`
Headers textproto.MIMEHeader `opt:"-H" action:"ParseHeader" metavar:"<header>:<value>"`
- WithFlags models.Flags `opt:"-x" action:"ParseFlag"`
- WithoutFlags models.Flags `opt:"-X" action:"ParseNotFlag"`
- To []string `opt:"-t" action:"ParseTo"`
- From []string `opt:"-f" action:"ParseFrom"`
- Cc []string `opt:"-c" action:"ParseCc"`
- StartDate time.Time `opt:"-d" action:"ParseDate"`
+ WithFlags models.Flags `opt:"-x" action:"ParseFlag" complete:"CompleteFlag"`
+ WithoutFlags models.Flags `opt:"-X" action:"ParseNotFlag" complete:"CompleteFlag"`
+ To []string `opt:"-t" action:"ParseTo" complete:"CompleteAddress"`
+ From []string `opt:"-f" action:"ParseFrom" complete:"CompleteAddress"`
+ Cc []string `opt:"-c" action:"ParseCc" complete:"CompleteAddress"`
+ StartDate time.Time `opt:"-d" action:"ParseDate" complete:"CompleteDate"`
EndDate time.Time
Terms string `opt:"..." required:"false"`
}
@@ -37,33 +37,20 @@ func init() {
register(SearchFilter{})
}
-func (SearchFilter) Options() string {
- return "rubax:X:t:H:f:c:d:"
-}
-
func (SearchFilter) Aliases() []string {
return []string{"search", "filter"}
}
-func (s SearchFilter) CompleteOption(
- r rune,
- search string,
-) []string {
- var valid []string
- switch r {
- case 'x', 'X':
- valid = commands.GetFlagList()
- case 't', 'f', 'c':
- valid = commands.GetAddress(search)
- case 'd':
- valid = commands.GetDateList()
- default:
- }
- return commands.CompletionFromList(valid, []string{search})
+func (*SearchFilter) CompleteFlag(arg string) []string {
+ return commands.CompletionFromList(commands.GetFlagList(), arg)
}
-func (SearchFilter) Complete(args []string) []string {
- return nil
+func (*SearchFilter) CompleteAddress(arg string) []string {
+ return commands.CompletionFromList(commands.GetAddress(arg), arg)
+}
+
+func (*SearchFilter) CompleteDate(arg string) []string {
+ return commands.CompletionFromList(commands.GetDateList(), arg)
}
func (s *SearchFilter) ParseRead(arg string) error {
diff --git a/commands/account/select.go b/commands/account/select.go
index efd8f53b..884b4bce 100644
--- a/commands/account/select.go
+++ b/commands/account/select.go
@@ -18,10 +18,6 @@ func (SelectMessage) Aliases() []string {
return []string{"select", "select-message"}
}
-func (SelectMessage) Complete(args []string) []string {
- return nil
-}
-
func (s SelectMessage) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/sort.go b/commands/account/sort.go
index 2adfbf19..ccccab25 100644
--- a/commands/account/sort.go
+++ b/commands/account/sort.go
@@ -2,7 +2,6 @@ package account
import (
"errors"
- "strings"
"git.sr.ht/~rjarry/aerc/app"
"git.sr.ht/~rjarry/aerc/commands"
@@ -13,6 +12,9 @@ import (
type Sort struct {
Unused struct{} `opt:"-"`
+ // these fields are only used for completion
+ Reverse bool `opt:"-r"`
+ Criteria []string `opt:"criteria" complete:"CompleteCriteria"`
}
func init() {
@@ -23,46 +25,20 @@ func (Sort) Aliases() []string {
return []string{"sort"}
}
-func (Sort) Complete(args []string) []string {
- supportedCriteria := []string{
- "arrival",
- "cc",
- "date",
- "from",
- "read",
- "size",
- "subject",
- "to",
- "flagged",
- }
- if len(args) == 0 {
- return supportedCriteria
- }
- last := args[len(args)-1]
- var completions []string
- currentPrefix := strings.Join(args, " ") + " "
- // if there is a completed criteria or option then suggest all again
- for _, criteria := range append(supportedCriteria, "-r") {
- if criteria == last {
- for _, criteria := range supportedCriteria {
- completions = append(completions, currentPrefix+criteria)
- }
- return completions
- }
- }
+var supportedCriteria = []string{
+ "arrival",
+ "cc",
+ "date",
+ "from",
+ "read",
+ "size",
+ "subject",
+ "to",
+ "flagged",
+}
- currentPrefix = strings.Join(args[:len(args)-1], " ")
- if len(args) > 1 {
- currentPrefix += " "
- }
- // last was beginning an option
- if last == "-" {
- return []string{currentPrefix + "-r"}
- }
- // the last item is not complete
- completions = commands.FilterList(supportedCriteria, last, currentPrefix,
- app.SelectedAccountUiConfig().FuzzyComplete)
- return completions
+func (*Sort) CompleteCriteria(arg string) []string {
+ return commands.CompletionFromList(supportedCriteria, arg)
}
func (Sort) Execute(args []string) error {
diff --git a/commands/account/split.go b/commands/account/split.go
index 4774297f..8690d99a 100644
--- a/commands/account/split.go
+++ b/commands/account/split.go
@@ -33,10 +33,6 @@ func (Split) Aliases() []string {
return []string{"split", "vsplit", "hsplit"}
}
-func (Split) Complete(args []string) []string {
- return nil
-}
-
func (s Split) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
diff --git a/commands/account/view.go b/commands/account/view.go
index 701a7738..0cdc175d 100644
--- a/commands/account/view.go
+++ b/commands/account/view.go
@@ -19,10 +19,6 @@ func (ViewMessage) Aliases() []string {
return []string{"view-message", "view"}
}
-func (ViewMessage) Complete(args []string) []string {
- return nil
-}
-
func (v ViewMessage) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {