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.
This commit is contained in:
parent
282dc44aa6
commit
32381592fc
2 changed files with 27 additions and 6 deletions
|
@ -2,14 +2,20 @@ aerc-search(1)
|
||||||
|
|
||||||
# IMAP
|
# IMAP
|
||||||
|
|
||||||
*search* [-ru] <terms...>
|
*search* [-rubt] [-f <from>] <terms...>
|
||||||
Searches the current folder for <terms>. Each separate term is searched
|
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
|
*-r*: Search for read messages
|
||||||
|
|
||||||
*-u*: Search for unread 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
|
# NOTMUCH
|
||||||
|
|
||||||
*search* <query...>
|
*search* <query...>
|
||||||
|
|
|
@ -1,17 +1,20 @@
|
||||||
package imap
|
package imap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.sr.ht/~sircmpwn/getopt"
|
|
||||||
"github.com/emersion/go-imap"
|
"github.com/emersion/go-imap"
|
||||||
|
|
||||||
|
"git.sr.ht/~sircmpwn/getopt"
|
||||||
)
|
)
|
||||||
|
|
||||||
func parseSearch(args []string) (*imap.SearchCriteria, error) {
|
func parseSearch(args []string) (*imap.SearchCriteria, error) {
|
||||||
criteria := imap.NewSearchCriteria()
|
criteria := imap.NewSearchCriteria()
|
||||||
|
|
||||||
opts, optind, err := getopt.Getopts(args, "ruH:")
|
opts, optind, err := getopt.Getopts(args, "rubtH:f:")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
body := false
|
||||||
|
text := false
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
switch opt.Option {
|
switch opt.Option {
|
||||||
case 'r':
|
case 'r':
|
||||||
|
@ -20,10 +23,22 @@ func parseSearch(args []string) (*imap.SearchCriteria, error) {
|
||||||
criteria.WithoutFlags = append(criteria.WithoutFlags, imap.SeenFlag)
|
criteria.WithoutFlags = append(criteria.WithoutFlags, imap.SeenFlag)
|
||||||
case 'H':
|
case 'H':
|
||||||
// TODO
|
// TODO
|
||||||
|
case 'f':
|
||||||
|
criteria.Header.Add("From", opt.Value)
|
||||||
|
case 'b':
|
||||||
|
body = true
|
||||||
|
case 't':
|
||||||
|
text = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if text {
|
||||||
|
criteria.Text = args[optind:]
|
||||||
|
} else if body {
|
||||||
|
criteria.Body = args[optind:]
|
||||||
|
} else {
|
||||||
for _, arg := range args[optind:] {
|
for _, arg := range args[optind:] {
|
||||||
criteria.Header.Add("Subject", arg)
|
criteria.Header.Add("Subject", arg)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return criteria, nil
|
return criteria, nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue