about summary refs log tree commit diff stats
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
+}