Add sorting functionality
There is a command and config option. The criteria are a list of the sort criterion and each can be individually reversed. This only includes support for sorting in the maildir backend currently. The other backends are not supported in this patch.
This commit is contained in:
parent
43435ba06c
commit
90d26da58a
9 changed files with 491 additions and 8 deletions
commands/account
85
commands/account/sort.go
Normal file
85
commands/account/sort.go
Normal file
|
@ -0,0 +1,85 @@
|
|||
package account
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
"git.sr.ht/~sircmpwn/aerc/lib/sort"
|
||||
"git.sr.ht/~sircmpwn/aerc/widgets"
|
||||
)
|
||||
|
||||
type Sort struct{}
|
||||
|
||||
func init() {
|
||||
register(Sort{})
|
||||
}
|
||||
|
||||
func (Sort) Aliases() []string {
|
||||
return []string{"sort"}
|
||||
}
|
||||
|
||||
func (Sort) Complete(aerc *widgets.Aerc, args []string) []string {
|
||||
supportedCriteria := []string{
|
||||
"arrival",
|
||||
"cc",
|
||||
"date",
|
||||
"from",
|
||||
"read",
|
||||
"size",
|
||||
"subject",
|
||||
"to",
|
||||
}
|
||||
if len(args) == 0 {
|
||||
return supportedCriteria
|
||||
}
|
||||
last := args[len(args)-1]
|
||||
var completions []string
|
||||
currentPrefix := strings.Join(args, " ") + " "
|
||||
// if there is a completed criteria then suggest all again or an option
|
||||
for _, criteria := range append(supportedCriteria, "-r") {
|
||||
if criteria == last {
|
||||
for _, criteria := range supportedCriteria {
|
||||
completions = append(completions, currentPrefix+criteria)
|
||||
}
|
||||
return completions
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
for _, criteria := range supportedCriteria {
|
||||
if strings.HasPrefix(criteria, last) {
|
||||
completions = append(completions, currentPrefix+criteria)
|
||||
}
|
||||
}
|
||||
return completions
|
||||
}
|
||||
|
||||
func (Sort) Execute(aerc *widgets.Aerc, args []string) error {
|
||||
acct := aerc.SelectedAccount()
|
||||
if acct == nil {
|
||||
return errors.New("No account selected.")
|
||||
}
|
||||
store := acct.Store()
|
||||
if store == nil {
|
||||
return errors.New("Messages still loading.")
|
||||
}
|
||||
|
||||
sortCriteria, err := sort.GetSortCriteria(args[1:])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
aerc.SetStatus("Sorting")
|
||||
store.Sort(sortCriteria, func() {
|
||||
aerc.SetStatus("Sorting complete")
|
||||
})
|
||||
return nil
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue