From 6e6a8678531c17a9a3599b86d63b8d24bfc7f7c0 Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Mon, 19 Feb 2024 22:09:34 +0100 Subject: 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 = [] 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 Tested-by: Tim Culverhouse --- config/aerc.conf | 13 +++++++++++++ config/ui.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) (limited to 'config') diff --git a/config/aerc.conf b/config/aerc.conf index 51c73a8f..17b9d216 100644 --- a/config/aerc.conf +++ b/config/aerc.conf @@ -162,6 +162,19 @@ # Default: 22 #sidebar-width=22 +# +# Default split layout for message list tabs. The syntax is: +# +# [] +# +# is optional and defaults to horizontal. It can take one +# of the following values: h, horiz, horizontal, v, vert, vertical. +# +# 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. # 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) { -- cgit