aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2024-02-19 22:09:34 +0100
committerRobin Jarry <robin@jarry.cc>2024-02-22 21:47:04 +0100
commit6e6a8678531c17a9a3599b86d63b8d24bfc7f7c0 (patch)
treeda95092ab3671a87d714b977d95fea7402217dc2 /config
parent3c01fd0fcd030b8bbe68f0208c8b4467dcd1ed89 (diff)
downloadaerc-6e6a8678531c17a9a3599b86d63b8d24bfc7f7c0.tar.gz
msglist: allow configuring default split
Add a new setting to configure the default split layout for message list tabs. The syntax is a bit different from the :split and :vsplit commands since it needs to convey the direction in the value as well. I didn't reuse split/vsplit since they are a bit confusing when used in a configuration file. The syntax is as follows: message-list-split = [<direction>] <size> The direction is optional and defaults to horizontal. The size is the number of terminal cells that will be used to display the message list. All these examples are equivalent: message-list-split = horiz 12 message-list-split = h 12 message-list-split = 12 Same idea for vertical splits: message-list-split = vertical 120 message-list-split = vert 120 message-list-split = v 120 Both :split and :vsplit commands remain usable as before. The configuration options only affect the initial layout at startup. Add config.SPLIT_* constants and sanitize AccountView.{Split,Vsplit} methods. Changelog-added: Configure default message list `:split` or `:vsplit` on startup with `message-list-split` in `aerc.conf`. Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Tim Culverhouse <tim@timculverhouse.com>
Diffstat (limited to 'config')
-rw-r--r--config/aerc.conf13
-rw-r--r--config/ui.go38
2 files changed, 51 insertions, 0 deletions
diff --git a/config/aerc.conf b/config/aerc.conf
index 51c73a8f..17b9d216 100644
--- a/config/aerc.conf
+++ b/config/aerc.conf
@@ -163,6 +163,19 @@
#sidebar-width=22
#
+# Default split layout for message list tabs. The syntax is:
+#
+# [<direction>] <size>
+#
+# <direction> is optional and defaults to horizontal. It can take one
+# of the following values: h, horiz, horizontal, v, vert, vertical.
+#
+# <size> is a positive integer representing the size (in terminal cells)
+# of the message list window.
+#
+#message-list-split=
+
+#
# Message to display when viewing an empty folder.
#
# Default: (no messages)
diff --git a/config/ui.go b/config/ui.go
index 8b10c8a8..a6034d46 100644
--- a/config/ui.go
+++ b/config/ui.go
@@ -5,6 +5,7 @@ import (
"math"
"path"
"regexp"
+ "strconv"
"text/template"
"time"
@@ -32,6 +33,7 @@ type UIConfig struct {
MessageViewThisYearTimeFormat string `ini:"message-view-this-year-time-format"`
PinnedTabMarker string "ini:\"pinned-tab-marker\" default:\"`\""
SidebarWidth int `ini:"sidebar-width" default:"22"`
+ MessageListSplit SplitParams `ini:"message-list-split" parse:"ParseSplit"`
EmptyMessage string `ini:"empty-message" default:"(no messages)"`
EmptyDirlist string `ini:"empty-dirlist" default:"(no folders)"`
EmptySubject string `ini:"empty-subject" default:"(no subject)"`
@@ -233,6 +235,42 @@ func (*UIConfig) ParseIndexColumns(section *ini.Section, key *ini.Key) ([]*Colum
return ParseColumnDefs(key, section)
}
+type SplitDirection int
+
+const (
+ SPLIT_NONE SplitDirection = iota
+ SPLIT_HORIZONTAL
+ SPLIT_VERTICAL
+)
+
+type SplitParams struct {
+ Direction SplitDirection
+ Size int
+}
+
+func (*UIConfig) ParseSplit(section *ini.Section, key *ini.Key) (p SplitParams, err error) {
+ re := regexp.MustCompile(`^\s*(v(?:ert(?:ical)?)?|h(?:oriz(?:ontal)?)?)?\s+(\d+)\s*$`)
+ match := re.FindStringSubmatch(key.String())
+ if len(match) != 3 {
+ err = fmt.Errorf("bad option value")
+ return
+ }
+ p.Direction = SPLIT_HORIZONTAL
+ switch match[1] {
+ case "v", "vert", "vertical":
+ p.Direction = SPLIT_VERTICAL
+ case "h", "horiz", "horizontal":
+ p.Direction = SPLIT_HORIZONTAL
+ }
+ size, e := strconv.ParseUint(match[2], 10, 32)
+ if e != nil {
+ err = e
+ return
+ }
+ p.Size = int(size)
+ return
+}
+
const MANUAL_COMPLETE = math.MaxInt
func (*UIConfig) ParseCompletionMinChars(section *ini.Section, key *ini.Key) (int, error) {