diff options
author | Robin Jarry <robin@jarry.cc> | 2023-10-22 23:23:18 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2023-10-28 19:25:10 +0200 |
commit | abe228b14d97d8d47e8ff4406de387fac45cfe68 (patch) | |
tree | 56117403d1ae32d7253f86bab01a944a3cf225b9 /commands/account | |
parent | 30851656591293ed2e19340ab78c937855a11143 (diff) | |
download | aerc-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.go | 6 | ||||
-rw-r--r-- | commands/account/check-mail.go | 4 | ||||
-rw-r--r-- | commands/account/clear.go | 4 | ||||
-rw-r--r-- | commands/account/compose.go | 11 | ||||
-rw-r--r-- | commands/account/connection.go | 4 | ||||
-rw-r--r-- | commands/account/expand-folder.go | 4 | ||||
-rw-r--r-- | commands/account/export-mbox.go | 6 | ||||
-rw-r--r-- | commands/account/import-mbox.go | 7 | ||||
-rw-r--r-- | commands/account/mkdir.go | 29 | ||||
-rw-r--r-- | commands/account/next-folder.go | 4 | ||||
-rw-r--r-- | commands/account/next-result.go | 4 | ||||
-rw-r--r-- | commands/account/next.go | 4 | ||||
-rw-r--r-- | commands/account/recover.go | 7 | ||||
-rw-r--r-- | commands/account/rmdir.go | 4 | ||||
-rw-r--r-- | commands/account/search.go | 41 | ||||
-rw-r--r-- | commands/account/select.go | 4 | ||||
-rw-r--r-- | commands/account/sort.go | 56 | ||||
-rw-r--r-- | commands/account/split.go | 4 | ||||
-rw-r--r-- | commands/account/view.go | 4 |
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 { |