aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorARaspiK <araspik@protonmail.com>2020-07-01 07:52:14 +0000
committerReto Brunner <reto@labrat.space>2020-07-02 09:13:14 +0200
commite1c2b596dc9e45976253d75a6b704914fcdcb82c (patch)
tree793aed9505dc3c47da5aa44f3ffb25ff40cb0da5
parentbf16ccde484ce3b6d2a4b843e7ebc04a9b2a957d (diff)
downloadaerc-e1c2b596dc9e45976253d75a6b704914fcdcb82c.tar.gz
Add a 'folders-exclude' option
Added a 'folders-exclude' option that allows removing selected folders from the directory list sidebar. My motivating example was that removing a single folder from the list using Golang regexes seemed pretty hard, so this is a better way to do it. The excluded folders list is included in the man page.
-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 8ebd69d3..ce599440 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 2bd30765..af64ad63 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 f12631b7..37115444 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) {