aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKalyan Sriram <kalyan@coderkalyan.com>2021-11-13 08:10:09 +0000
committerRobin Jarry <robin@jarry.cc>2021-11-13 15:25:04 +0100
commit402612fd9788f071a5d7ae0045989977b98d896f (patch)
tree7d48f203a922cb6933146bda744f5dc3a9e90b07
parent88d28908d2b2cd9d416bce76f384153ba1267cdb (diff)
downloadaerc-402612fd9788f071a5d7ae0045989977b98d896f.tar.gz
notmuch: allow sort by file order
When using the notmuch backend, it often makes more sense to sort folders (actual virtual folders, or queries) by the order specified in the query-map file, rather than alphabetically. This patch introduces a configuration option (disabled by default) that allows this. Additionally, due to the notmuch backend previously using maps (which are order-undefined) to store the list of queries, default query selection on aerc startup fluctuated. This patch fixes that by using slices to store query order.
-rw-r--r--config/config.go49
-rw-r--r--doc/aerc-config.5.scd6
-rw-r--r--widgets/dirlist.go8
-rw-r--r--worker/notmuch/worker.go4
4 files changed, 43 insertions, 24 deletions
diff --git a/config/config.go b/config/config.go
index 3fc38e35..9be55c68 100644
--- a/config/config.go
+++ b/config/config.go
@@ -10,6 +10,7 @@ import (
"path"
"regexp"
"sort"
+ "strconv"
"strings"
"time"
"unicode"
@@ -74,23 +75,24 @@ const (
)
type AccountConfig struct {
- Archive string
- CopyTo string
- Default string
- Postpone string
- From string
- Aliases string
- Name string
- Source string
- SourceCredCmd string
- Folders []string
- FoldersExclude []string
- Params map[string]string
- Outgoing string
- OutgoingCredCmd string
- SignatureFile string
- SignatureCmd string
- FoldersSort []string `ini:"folders-sort" delim:","`
+ Archive string
+ CopyTo string
+ Default string
+ Postpone string
+ From string
+ Aliases string
+ Name string
+ Source string
+ SourceCredCmd string
+ Folders []string
+ FoldersExclude []string
+ Params map[string]string
+ Outgoing string
+ OutgoingCredCmd string
+ SignatureFile string
+ SignatureCmd string
+ EnableFoldersSort bool `ini:"enable-folders-sort"`
+ FoldersSort []string `ini:"folders-sort" delim:","`
}
type BindingConfig struct {
@@ -181,11 +183,12 @@ func loadAccountConfig(path string) ([]AccountConfig, error) {
}
sec := file.Section(_sec)
account := AccountConfig{
- Archive: "Archive",
- Default: "INBOX",
- Postpone: "Drafts",
- Name: _sec,
- Params: make(map[string]string),
+ Archive: "Archive",
+ Default: "INBOX",
+ Postpone: "Drafts",
+ Name: _sec,
+ Params: make(map[string]string),
+ EnableFoldersSort: true,
}
if err = sec.MapTo(&account); err != nil {
return nil, err
@@ -213,6 +216,8 @@ func loadAccountConfig(path string) ([]AccountConfig, error) {
account.CopyTo = val
} else if key == "archive" {
account.Archive = val
+ } else if key == "enable-folders-sort" {
+ account.EnableFoldersSort, _ = strconv.ParseBool(val)
} else if key != "name" {
account.Params[key] = val
}
diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd
index fbfa64e5..c647459a 100644
--- a/doc/aerc-config.5.scd
+++ b/doc/aerc-config.5.scd
@@ -427,6 +427,12 @@ Note that many of these configuration options are written for you, such as
Default: no folders
+*enable-folders-sort*
+ If true, folders are sorted, first by specified folders (see *folders-sort*),
+ then alphabetically.
+
+ Default: true
+
*folders-sort*
Specifies a comma separated list of folders to be shown at the top of the
list in the provided order. Remaining folders will be sorted alphabetically.
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index 4db80a43..0345380c 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -105,7 +105,9 @@ func (dirlist *DirectoryList) Select(name string) {
if !hasSelected && dirlist.selected != "" {
dirlist.dirs = append(dirlist.dirs, dirlist.selected)
}
- sort.Strings(dirlist.dirs)
+ if dirlist.acctConf.EnableFoldersSort {
+ sort.Strings(dirlist.dirs)
+ }
dirlist.sortDirsByFoldersSortConfig()
}
dirlist.Invalidate()
@@ -376,6 +378,10 @@ func folderMatches(folder string, pattern string) bool {
// AccountConfig.FoldersSort option. Folders not included in the option
// will be appended at the end in alphabetical order
func (dirlist *DirectoryList) sortDirsByFoldersSortConfig() {
+ if !dirlist.acctConf.EnableFoldersSort {
+ return
+ }
+
sort.Slice(dirlist.dirs, func(i, j int) bool {
foldersSort := dirlist.acctConf.FoldersSort
iInFoldersSort := findString(foldersSort, dirlist.dirs[i])
diff --git a/worker/notmuch/worker.go b/worker/notmuch/worker.go
index 63003292..09b5d509 100644
--- a/worker/notmuch/worker.go
+++ b/worker/notmuch/worker.go
@@ -35,6 +35,7 @@ type worker struct {
query string
currentQueryName string
uidStore *uidstore.Store
+ queryMapOrder []string
nameQueryMap map[string]string
db *notmuch.DB
setupErr error
@@ -185,7 +186,7 @@ func (w *worker) handleConnect(msg *types.Connect) error {
}
func (w *worker) handleListDirectories(msg *types.ListDirectories) error {
- for name := range w.nameQueryMap {
+ for _, name := range w.queryMapOrder {
w.w.PostMessage(&types.Directory{
Message: types.RespondTo(msg),
Dir: &models.Directory{
@@ -508,6 +509,7 @@ func (w *worker) loadQueryMap(acctConfig *config.AccountConfig) error {
return fmt.Errorf("%v: invalid line %q, want name=query", file, line)
}
w.nameQueryMap[split[0]] = split[1]
+ w.queryMapOrder = append(w.queryMapOrder, split[0])
}
return nil
}