aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/config.go1
-rw-r--r--doc/aerc-config.5.scd6
-rw-r--r--widgets/dirlist.go36
3 files changed, 41 insertions, 2 deletions
diff --git a/config/config.go b/config/config.go
index 32d07fc..dd1f5f4 100644
--- a/config/config.go
+++ b/config/config.go
@@ -61,6 +61,7 @@ type AccountConfig struct {
OutgoingCredCmd string
SignatureFile string
SignatureCmd string
+ FoldersSort []string `ini:"folders-sort" delim:","`
}
type BindingConfig struct {
diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd
index 02fe4d6..2eb04f1 100644
--- a/doc/aerc-config.5.scd
+++ b/doc/aerc-config.5.scd
@@ -301,6 +301,12 @@ Note that many of these configuration options are written for you, such as
Default: all folders
+*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.
+
+ Default: none
+
*from*
The default value to use for the From header in new emails. This should be
an RFC 5322-compatible string, such as "Your Name <you@example.org>".
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index ef2dd1e..c0c8917 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -5,6 +5,7 @@ import (
"log"
"regexp"
"sort"
+ "strings"
"github.com/gdamore/tcell"
"github.com/mattn/go-runewidth"
@@ -61,9 +62,10 @@ func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) {
case *types.Directory:
dirs = append(dirs, msg.Dir.Name)
case *types.Done:
- sort.Strings(dirs)
dirlist.store.Update(dirs)
dirlist.filterDirsByFoldersConfig()
+ dirlist.sortDirsByFoldersSortConfig()
+ dirlist.store.Update(dirlist.dirs)
dirlist.spinner.Stop()
dirlist.Invalidate()
if done != nil {
@@ -94,6 +96,7 @@ func (dirlist *DirectoryList) Select(name string) {
dirlist.dirs = append(dirlist.dirs, dirlist.selected)
}
sort.Strings(dirlist.dirs)
+ dirlist.sortDirsByFoldersSortConfig()
}
dirlist.Invalidate()
})
@@ -261,7 +264,7 @@ func (dirlist *DirectoryList) Clicked(x int, y int) (string, bool) {
}
func (dirlist *DirectoryList) NextPrev(delta int) {
- curIdx := sort.SearchStrings(dirlist.dirs, dirlist.selected)
+ curIdx := findString(dirlist.dirs, dirlist.selected)
if curIdx == len(dirlist.dirs) {
return
}
@@ -297,6 +300,26 @@ func folderMatches(folder string, pattern string) bool {
return pattern == folder
}
+// sortDirsByFoldersSortConfig sets dirlist.dirs to be sorted based on the
+// AccountConfig.FoldersSort option. Folders not included in the option
+// will be appended at the end in alphabetical order
+func (dirlist *DirectoryList) sortDirsByFoldersSortConfig() {
+ sort.Slice(dirlist.dirs, func(i, j int) bool {
+ iInFoldersSort := findString(dirlist.acctConf.FoldersSort, dirlist.dirs[i])
+ jInFoldersSort := findString(dirlist.acctConf.FoldersSort, dirlist.dirs[j])
+ if iInFoldersSort >= 0 && jInFoldersSort >= 0 {
+ return iInFoldersSort < jInFoldersSort
+ }
+ if iInFoldersSort >= 0 {
+ return true
+ }
+ if jInFoldersSort >= 0 {
+ return false
+ }
+ return strings.Compare(dirlist.dirs[i], dirlist.dirs[j]) == -1
+ })
+}
+
// filterDirsByFoldersConfig sets dirlist.dirs to the filtered subset of the
// dirstore, based on the AccountConfig.Folders option
func (dirlist *DirectoryList) filterDirsByFoldersConfig() {
@@ -331,3 +354,12 @@ func (dirlist *DirectoryList) SetMsgStore(name string, msgStore *lib.MessageStor
dirlist.Invalidate()
})
}
+
+func findString(slice []string, str string) int {
+ for i, s := range slice {
+ if str == s {
+ return i
+ }
+ }
+ return -1
+}