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 ". 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 +}