From e1ae7b80cc49bf28d93943438ac4e68d22ee7ada Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Thu, 28 Apr 2022 22:09:53 +0200 Subject: [PATCH] dirlist: add format specifier to compact folder name Add the format specifier %N to the dirlist-format to display compacted folder names. A folder such as INBOX/WORK/PROJECT will be compacted to I/W/PROJECT in the directoy list. Signed-off-by: Koni Marti Tested-by: Tim Culverhouse --- doc/aerc-config.5.scd | 2 ++ lib/format/format.go | 27 +++++++++++++++++++++++++++ widgets/dirlist.go | 4 ++++ 3 files changed, 33 insertions(+) diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd index 6f5c50a..314aa57 100644 --- a/doc/aerc-config.5.scd +++ b/doc/aerc-config.5.scd @@ -187,6 +187,8 @@ These options are configured in the *[ui]* section of aerc.conf. : literal % | %n : directory name +| %N +: compacted directory name | %r : recent/unseen/total message count | %>X diff --git a/lib/format/format.go b/lib/format/format.go index 59b5c47..ca90ac4 100644 --- a/lib/format/format.go +++ b/lib/format/format.go @@ -39,6 +39,33 @@ func FormatAddresses(l []*mail.Address) string { return strings.Join(formatted, ", ") } +// CompactPath reduces a directory path into a compact form. The directory +// name will be split with the provided separator and each part will be reduced +// to the first letter in its name: INBOX/01_WORK/PROJECT will become +// I/W/PROJECT. +func CompactPath(name string, sep rune) (compact string) { + parts := strings.Split(name, string(sep)) + for i, part := range parts { + if i == len(parts)-1 { + compact += part + } else { + if len(part) != 0 { + r := part[0] + for i := 0; i < len(part)-1; i++ { + if unicode.IsLetter(rune(part[i])) { + r = part[i] + break + } + } + compact += fmt.Sprintf("%c%c", r, sep) + } else { + compact += fmt.Sprintf("%c", sep) + } + } + } + return +} + type Ctx struct { FromAddress string AccountName string diff --git a/widgets/dirlist.go b/widgets/dirlist.go index 5ddb136..412ed06 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -15,6 +15,7 @@ import ( "git.sr.ht/~rjarry/aerc/config" "git.sr.ht/~rjarry/aerc/lib" + "git.sr.ht/~rjarry/aerc/lib/format" libsort "git.sr.ht/~rjarry/aerc/lib/sort" "git.sr.ht/~rjarry/aerc/lib/ui" "git.sr.ht/~rjarry/aerc/logging" @@ -206,6 +207,9 @@ func (dirlist *DirectoryList) getDirString(name string, width int, recentUnseen if percent { rightJustify = true } + case 'N': + name = format.CompactPath(name, os.PathSeparator) + fallthrough case 'n': if percent { if rightJustify {