about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--config/config.go5
-rw-r--r--doc/aerc-config.5.scd7
-rw-r--r--widgets/dirlist.go45
3 files changed, 43 insertions, 14 deletions
diff --git a/config/config.go b/config/config.go
index 8ebd69d..ce59944 100644
--- a/config/config.go
+++ b/config/config.go
@@ -76,6 +76,7 @@ type AccountConfig struct {
 	Source          string
 	SourceCredCmd   string
 	Folders         []string
+	FoldersExclude	[]string
 	Params          map[string]string
 	Outgoing        string
 	OutgoingCredCmd string
@@ -186,6 +187,10 @@ func loadAccountConfig(path string) ([]AccountConfig, error) {
 				folders := strings.Split(val, ",")
 				sort.Strings(folders)
 				account.Folders = folders
+			} else if key == "folders-exclude" {
+				folders := strings.Split(val, ",")
+				sort.Strings(folders)
+				account.FoldersExclude = folders
 			} else if key == "source-cred-cmd" {
 				account.SourceCredCmd = val
 			} else if key == "outgoing" {
diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd
index 2bd3076..af64ad6 100644
--- a/doc/aerc-config.5.scd
+++ b/doc/aerc-config.5.scd
@@ -376,6 +376,13 @@ Note that many of these configuration options are written for you, such as
 
 	Default: all folders
 
+*folders-exclude*
+	Specifies the comma separated list of folders to exclude from the sidebar.
+	Names prefixed with ~ are interpreted as regular expressions.
+	Note that this overrides anything from *folders*.
+
+	Default: no 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.
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index f12631b..3711544 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -390,24 +390,41 @@ func (dirlist *DirectoryList) sortDirsByFoldersSortConfig() {
 }
 
 // filterDirsByFoldersConfig sets dirlist.dirs to the filtered subset of the
-// dirstore, based on the AccountConfig.Folders option
+// dirstore, based on AccountConfig.Folders (inclusion) and
+// AccountConfig.FoldersExclude (exclusion), in that order.
 func (dirlist *DirectoryList) filterDirsByFoldersConfig() {
-	dirlist.dirs = dirlist.store.List()
-	// config option defaults to show all if unset
-	configFolders := dirlist.acctConf.Folders
-	if len(configFolders) == 0 {
-		return
-	}
-	var filtered []string
-	for _, folder := range dirlist.dirs {
-		for _, cfgfolder := range configFolders {
-			if folderMatches(folder, cfgfolder) {
-				filtered = append(filtered, folder)
-				break
+	filterDirs := func(orig, filters []string, exclude bool) []string {
+		if len(filters) == 0 {
+			return orig
+		}
+		var dest []string
+		for _, folder := range orig {
+			// When excluding, include things by default, and vice-versa
+			include := exclude
+			for _, f := range filters {
+				if folderMatches(folder, f) {
+					// If matched an exclusion, don't include
+					// If matched an inclusion, do include
+					include = !exclude
+					break
+				}
+			}
+			if include {
+				dest = append(dest, folder)
 			}
 		}
+		return dest
 	}
-	dirlist.dirs = filtered
+
+	dirlist.dirs = dirlist.store.List()
+
+	// 'folders' (if available) is used to make the initial list and
+	// 'folders-exclude' removes from that list.
+	configFolders := dirlist.acctConf.Folders
+	dirlist.dirs = filterDirs(dirlist.dirs, configFolders, false)
+
+	configFoldersExclude := dirlist.acctConf.FoldersExclude
+	dirlist.dirs = filterDirs(dirlist.dirs, configFoldersExclude, true)
 }
 
 func (dirlist *DirectoryList) SelectedMsgStore() (*lib.MessageStore, bool) {