diff options
author | ARaspiK <araspik@protonmail.com> | 2020-07-01 07:52:14 +0000 |
---|---|---|
committer | Reto Brunner <reto@labrat.space> | 2020-07-02 09:13:14 +0200 |
commit | e1c2b596dc9e45976253d75a6b704914fcdcb82c (patch) | |
tree | 793aed9505dc3c47da5aa44f3ffb25ff40cb0da5 | |
parent | bf16ccde484ce3b6d2a4b843e7ebc04a9b2a957d (diff) | |
download | aerc-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.go | 5 | ||||
-rw-r--r-- | doc/aerc-config.5.scd | 7 | ||||
-rw-r--r-- | widgets/dirlist.go | 45 |
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) { |