diff options
author | Jeffas <dev@jeffas.io> | 2019-09-09 21:37:45 +0100 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-09-11 12:24:27 -0400 |
commit | 32381592fc335bc26a06cee847df926b9f6e6c06 (patch) | |
tree | a3dd53ab5ff30986ca76601c2f64fb33dfe57986 | |
parent | 282dc44aa67773b608cace43587ecd2c140689a4 (diff) | |
download | aerc-32381592fc335bc26a06cee847df926b9f6e6c06.tar.gz |
Add new search behaviour for imap
This patch adds search behaviour to allow searching in the body of the
messages, the entire text (body + header), and searching just the from
header.
-rw-r--r-- | doc/aerc-search.1.scd | 10 | ||||
-rw-r--r-- | worker/imap/search.go | 23 |
2 files changed, 27 insertions, 6 deletions
diff --git a/doc/aerc-search.1.scd b/doc/aerc-search.1.scd index c86ed6ab..def9d3df 100644 --- a/doc/aerc-search.1.scd +++ b/doc/aerc-search.1.scd @@ -2,14 +2,20 @@ aerc-search(1) # IMAP -*search* [-ru] <terms...> +*search* [-rubt] [-f <from>] <terms...> Searches the current folder for <terms>. Each separate term is searched - case-insensitively among subject lines. + case-insensitively among subject lines if *-b* or *-t* are not provided. *-r*: Search for read messages *-u*: Search for unread messages + *-b*: Search in the body of the messages + + *-t*: Search in the entire text of the messages + + *-f <from>*: Search for messages from <from> + # NOTMUCH *search* <query...> diff --git a/worker/imap/search.go b/worker/imap/search.go index 4decf1b5..939516dd 100644 --- a/worker/imap/search.go +++ b/worker/imap/search.go @@ -1,17 +1,20 @@ package imap import ( - "git.sr.ht/~sircmpwn/getopt" "github.com/emersion/go-imap" + + "git.sr.ht/~sircmpwn/getopt" ) func parseSearch(args []string) (*imap.SearchCriteria, error) { criteria := imap.NewSearchCriteria() - opts, optind, err := getopt.Getopts(args, "ruH:") + opts, optind, err := getopt.Getopts(args, "rubtH:f:") if err != nil { return nil, err } + body := false + text := false for _, opt := range opts { switch opt.Option { case 'r': @@ -20,10 +23,22 @@ func parseSearch(args []string) (*imap.SearchCriteria, error) { criteria.WithoutFlags = append(criteria.WithoutFlags, imap.SeenFlag) case 'H': // TODO + case 'f': + criteria.Header.Add("From", opt.Value) + case 'b': + body = true + case 't': + text = true } } - for _, arg := range args[optind:] { - criteria.Header.Add("Subject", arg) + if text { + criteria.Text = args[optind:] + } else if body { + criteria.Body = args[optind:] + } else { + for _, arg := range args[optind:] { + criteria.Header.Add("Subject", arg) + } } return criteria, nil } |