~rjarry/aerc-devel

aerc: Default UI change v4 SUPERSEDED

Hi folks,

this is a follow up on the colorize default theme fix for light
backgrounds. After thinking about it some more, I found the default
theme for the whole application really lacks color and also does not use
any of the shiny new features that were added since I took over the
maintenance.

This series is meant to make aerc more appealing to newcomers. I have
tested the default styleset both on light and dark backgrounds.
Everything should be visible (unless you specified invisible colors in
your terminal configuration).

Let me know what you think.

v4: Fixed default styleset init. It is getting late :)

Robin Jarry (4):
  config: add missing settings in aerc.conf
  config: change default appearance
  colorize: adapt default style for light backgrounds
  colorize: preserve defaults unless overridden

 config/aerc.conf         |  79 ++++++++++++++++++------
 config/statusline.go     |   2 +-
 config/style.go          | 128 ++++++++++++++-------------------------
 config/ui.go             |  24 ++++----
 doc/aerc-config.5.scd    |  39 +++++++-----
 doc/aerc-stylesets.7.scd |  78 ++++++++++++++++--------
 filters/colorize.c       |  29 ++++-----
 filters/test.sh          |   2 +
 stylesets/blue           |  32 +++++-----
 stylesets/default        |  97 +++++++++++++++++------------
 stylesets/dracula        |   7 +++
 stylesets/nord           |   2 +
 stylesets/pink           |  32 +++++-----
 stylesets/solarized      |   3 +
 14 files changed, 313 insertions(+), 241 deletions(-)

-- 
2.43.0
#1146723 alpine-edge.yml success
#1146724 openbsd.yml success
aerc/patches: SUCCESS in 1m52s

[Default UI change][0] v4 from [Robin Jarry][1]

[0]: https://lists.sr.ht/~rjarry/aerc-devel/patches/49332
[1]: mailto:robin@jarry.cc

✓ #1146724 SUCCESS aerc/patches/openbsd.yml     https://builds.sr.ht/~rjarry/job/1146724
✓ #1146723 SUCCESS aerc/patches/alpine-edge.yml https://builds.sr.ht/~rjarry/job/1146723
Robin,

Robin Jarry, 2024-02-10T01:20:26+01:00:
Next
Matěj Cepl, Feb 10 2024:
Next
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~rjarry/aerc-devel/patches/49332/mbox | git am -3
Learn more about email & git

[PATCH aerc v4 1/4] config: add missing settings in aerc.conf Export this patch

Some settings are supported and documented but their description and
default values are not present in the default aerc.conf file. Add them.

Signed-off-by: Robin Jarry <robin@jarry.cc>
---
 config/aerc.conf | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/config/aerc.conf b/config/aerc.conf
index ac2a6847515c..11e0cf3277dc 100644
--- a/config/aerc.conf
+++ b/config/aerc.conf
@@ -130,6 +130,28 @@
#
#this-year-time-format=

#
# If set, overrides timestamp-format for the message view.
#
#message-view-timestamp-format=

#
# If set, overrides timestamp-format in the message view for messages
# that were received/sent today.
#
#message-view-this-day-time-format=

# If set, overrides timestamp-format in the message view for messages
# that were recieved/sent within the last 7 days.
#
#message-view-this-week-time-format=

#
# If set, overrides *timestamp-format* in the message view for messages
# that were received/sent this year.
#
#message-view-this-year-time-format=

#
# Width of the sidebar, including the border.
#
@@ -169,6 +191,19 @@
# Default: {{.Account}}
#tab-title-account={{.Account}}

#
# Template to use for Composer tab titles
#
# Default: {{.Subject}}
#tab-title-composer={{.Subject}}

#
# Template to use for Message Viewer tab titles
#
# Default: {{if .Subject}}{{.Subject}}{{else}}(no subject){{end}}
#tab-title-viewer={{if .Subject}}{{.Subject}}{{else}}(no subject){{end}}


# Marker to show before a pinned tab's name.
#
# Default: `
-- 
2.43.0

[PATCH aerc v4 2/4] config: change default appearance Export this patch

The default styleset and ui settings are quite dull and don't make use
of the "newer" features that have been added to aerc in the past two
years.

Change the default styleset to something more colorful that renders
correctly on both dark and light backgrounds. Change the default ui
settings to get something more appealing to new users.
Changelog-changed: The default `[ui]` settings and the `default`
 styleset have changed extensively.
Signed-off-by: Robin Jarry <robin@jarry.cc>
---
v4: Fixed default styleset init. It is getting late :)

 config/aerc.conf         |  56 +++++++++--------
 config/statusline.go     |   2 +-
 config/style.go          | 128 ++++++++++++++-------------------------
 config/ui.go             |  24 ++++----
 doc/aerc-config.5.scd    |  39 +++++++-----
 doc/aerc-stylesets.7.scd |  56 +++++++++--------
 stylesets/default        |  67 +++++++++++---------
 7 files changed, 181 insertions(+), 191 deletions(-)

diff --git a/config/aerc.conf b/config/aerc.conf
index 11e0cf3277dc..19aabca84056 100644
--- a/config/aerc.conf
+++ b/config/aerc.conf
@@ -76,8 +76,8 @@
# terminal width. Fit width columns take the width of their contents. If no
# width specifier is set, '*' is used by default.
#
# Default: date<20,name<17,flags>4,subject<*
#index-columns=date<20,name<17,flags>4,subject<*
# Default: flags:4,name<20%,subject,date>=
#index-columns=flags:4,name<20%,subject,date>=

#
# Each name in index-columns must have a corresponding column-$name setting.
@@ -93,10 +93,10 @@
#   column-name={{if match .Folder "^(Gesendet|Sent)$"}}{{index (.To | names) 0}}{{else}}{{index (.From | names) 0}}{{end}}
#
# Default settings
#column-date={{.DateAutoFormat .Date.Local}}
#column-name={{index (.From | names) 0}}
#column-flags={{.Flags | join ""}}
#column-subject={{.ThreadPrefix}}{{if .ThreadFolded}}{{printf "{%d}" .ThreadCount}}{{end}}{{.Subject}}
#column-name={{index (.From | names) 0}}
#column-subject={{.Style .ThreadPrefix "thread"}}{{.Subject}}
#column-date={{.DateAutoFormat .Date.Local}}

#
# String separator inserted between columns. When the column width specifier is
@@ -109,31 +109,35 @@
#
# See time.Time#Format at https://godoc.org/time#Time.Format
#
# Default: 2006-01-02 03:04 PM (ISO 8601 + 12 hour time)
#timestamp-format=2006-01-02 03:04 PM
# Default: 2006 Jan 02
#timestamp-format=2006 Jan 02

#
# Index-only time format for messages that were received/sent today.
# If this is not specified, timestamp-format is used instead.
# If this is empty, timestamp-format is used instead.
#
#this-day-time-format=
# Default: 15:04
#this-day-time-format=15:04

#
# Index-only time format for messages that were received/sent within the last
# 7 days. If this is not specified, timestamp-format is used instead.
# 7 days. If this is empty, timestamp-format is used instead.
#
#this-week-time-format=
# Default: Jan 02
#this-week-time-format=Jan 02

#
# Index-only time format for messages that were received/sent this year.
# If this is not specified, timestamp-format is used instead.
# If this is empty, timestamp-format is used instead.
#
#this-year-time-format=
#Default: Jan 02
#this-year-time-format=Jan 02

#
# If set, overrides timestamp-format for the message view.
# Overrides timestamp-format for the message view.
#
#message-view-timestamp-format=
# Default: 2006 Jan 02, 15:04 GMT-0700
#message-view-timestamp-format=2006 Jan 02, 15:04 GMT-0700

#
# If set, overrides timestamp-format in the message view for messages
@@ -155,8 +159,8 @@
#
# Width of the sidebar, including the border.
#
# Default: 20
#sidebar-width=20
# Default: 22
#sidebar-width=22

#
# Message to display when viewing an empty folder.
@@ -194,14 +198,14 @@
#
# Template to use for Composer tab titles
#
# Default: {{.Subject}}
#tab-title-composer={{.Subject}}
# Default: {{if .To}}to:{{index (.To | shortmboxes) 0}} {{end}}{{.SubjectBase}}
#tab-title-composer={{if .To}}to:{{index (.To | shortmboxes) 0}} {{end}}{{.SubjectBase}}

#
# Template to use for Message Viewer tab titles
#
# Default: {{if .Subject}}{{.Subject}}{{else}}(no subject){{end}}
#tab-title-viewer={{if .Subject}}{{.Subject}}{{else}}(no subject){{end}}
# Default: {{.Subject}}
#tab-title-viewer={{.Subject}}


# Marker to show before a pinned tab's name.
@@ -218,8 +222,8 @@
# Template for the right side of the directory list.
# See aerc-templates(7) for all available fields and functions.
#
# Default: {{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
#dirlist-right={{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
# Default: {{if .Unread}}{{humanReadable .Unread}}{{end}}
#dirlist-right={{if .Unread}}{{humanReadable .Unread}}{{end}}

# Delay after which the messages are actually listed when entering a directory.
# This avoids loading messages when skipping over folders and makes the UI more
@@ -403,8 +407,8 @@
# Customize the thread prefix appearance by selecting the folded thread
# indicator.
#
# Default: ""
#thread-prefix-folded = ""
# Default: "+"
#thread-prefix-folded = "+"

#
# Customize the thread prefix appearance by selecting the unfolded thread
@@ -486,7 +490,7 @@
# Default settings
#column-left=[{{.Account}}] {{.StatusInfo}}
#column-center={{.PendingKeys}}
#column-right={{.TrayInfo}}
#column-right={{.TrayInfo}} | {{cwd}}

#
# String separator inserted between columns.
diff --git a/config/statusline.go b/config/statusline.go
index 7af0d744a019..3a7ce0875794 100644
--- a/config/statusline.go
+++ b/config/statusline.go
@@ -32,7 +32,7 @@ func (s *StatuslineConfig) ParseColumns(sec *ini.Section, key *ini.Key) ([]*Colu
		_, _ = sec.NewKey("column-center", "{{.PendingKeys}}")
	}
	if !sec.HasKey("column-right") {
		_, _ = sec.NewKey("column-right", "{{.TrayInfo}}")
		_, _ = sec.NewKey("column-right", "{{.TrayInfo}} | {{cwd}}")
	}
	return ParseColumnDefs(key, sec)
}
diff --git a/config/style.go b/config/style.go
index 8a88dcfc9e1b..bffed47da9a6 100644
--- a/config/style.go
+++ b/config/style.go
@@ -283,6 +283,42 @@ type StyleSet struct {
	path     string
}

const defaultStyleset string = `
*.selected.bg = 12
*.selected.fg = 15
*.selected.bold = true
statusline_*.dim = true
statusline_*.bg = 8
statusline_*.fg = 15
*warning.fg = 3
*success.fg = 2
*error.fg = 1
*error.bold = true
border.bg = 12
border.fg = 15
title.bg = 12
title.fg = 15
title.bold = true
header.fg = 4
header.bold = true
msglist_unread.bold = true
msglist_deleted.dim = true
msglist_marked.bg = 6
msglist_marked.fg = 15
msglist_pill.bg = 12
msglist_pill.fg = 15
part_mimetype.fg = 12
selector_chooser.bold = true
selector_focused.bold = true
selector_focused.bg = 12
selector_focused.fg = 15
completion_pill.bg = 12
completion_default.bg = 8
completion_default.fg = 15
[user]
thread.fg = 1
`

func NewStyleSet() StyleSet {
	ss := StyleSet{
		objects:  make(map[StyleObject]*StyleConf),
@@ -290,89 +326,15 @@ func NewStyleSet() StyleSet {
		user:     make(map[string]*Style),
	}
	for _, so := range StyleNames {
		conf := new(StyleConf)

		switch so {
		case STYLE_ERROR:
			// *error.bold=true
			conf.base.Bold = true
			// error.fg=red
			conf.base.Fg = tcell.ColorRed
		case STYLE_WARNING:
			// warning.fg=yellow
			conf.base.Fg = tcell.ColorYellow
		case STYLE_SUCCESS:
			// success.fg=green
			conf.base.Fg = tcell.ColorGreen
		case STYLE_TITLE:
			// title.reverse=true
			conf.base.Reverse = true
		case STYLE_HEADER:
			// header.bold=true
			conf.base.Bold = true
		case STYLE_STATUSLINE_DEFAULT:
			// statusline_default.reverse=true
			conf.base.Reverse = true
		case STYLE_STATUSLINE_ERROR:
			// *error.bold=true
			conf.base.Fg = tcell.ColorRed
			// statusline_error.fg=red
			conf.base.Bold = true
			// statusline_error.reverse=true
			conf.base.Reverse = true
		case STYLE_STATUSLINE_WARNING:
			// statusline_warning.fg=yellow
			conf.base.Fg = tcell.ColorYellow
			// statusline_warning.reverse=true
			conf.base.Reverse = true
		case STYLE_STATUSLINE_SUCCESS:
			conf.base.Fg = tcell.ColorGreen
			conf.base.Reverse = true
		case STYLE_MSGLIST_UNREAD:
			// msglist_unread.bold=true
			conf.base.Bold = true
		case STYLE_MSGLIST_DELETED:
			// msglist_deleted.fg=gray
			conf.base.Fg = tcell.ColorGray
		case STYLE_MSGLIST_RESULT:
			// msglist_result.fg=green
			conf.base.Fg = tcell.ColorGreen
		case STYLE_MSGLIST_PILL:
			// msglist_pill.reverse=true
			conf.base.Reverse = true
		case STYLE_PART_MIMETYPE:
			// part_mimetype.dim=true
			conf.base.Dim = true
		case STYLE_COMPLETION_PILL:
			// completion_pill.reverse=true
			conf.base.Reverse = true
		case STYLE_TAB:
			// tab.reverse=true
			conf.base.Reverse = true
		case STYLE_BORDER:
			// border.reverse = true
			conf.base.Reverse = true
		case STYLE_SELECTOR_FOCUSED:
			// selector_focused.reverse=true
			conf.base.Reverse = true
		case STYLE_SELECTOR_CHOOSER:
			// selector_chooser.bold=true
			conf.base.Bold = true
		}

		ss.objects[so] = conf
		selected := *conf
		// *.selected.reverse=toggle
		selected.base.Reverse = !conf.base.Reverse
		switch so {
		case STYLE_PART_MIMETYPE:
			// part_mimetype.selected.dim=false
			selected.base.Dim = false
		case STYLE_PART_FILENAME:
			// part_filename.selected.bold=true
			selected.base.Bold = true
		}
		ss.selected[so] = &selected
		ss.objects[so] = new(StyleConf)
		ss.selected[so] = new(StyleConf)
	}
	f, err := ini.Load([]byte(defaultStyleset))
	if err == nil {
		err = ss.ParseStyleSet(f)
	}
	if err != nil {
		panic(err)
	}
	return ss
}
diff --git a/config/ui.go b/config/ui.go
index 9a97d4efe55a..75b5d3e379d2 100644
--- a/config/ui.go
+++ b/config/ui.go
@@ -15,23 +15,23 @@ import (
)

type UIConfig struct {
	IndexColumns    []*ColumnDef `ini:"index-columns" parse:"ParseIndexColumns" default:"date<20,name<17,flags>4,subject<*"`
	IndexColumns    []*ColumnDef `ini:"index-columns" parse:"ParseIndexColumns" default:"flags:4,name<20%,subject,date>="`
	ColumnSeparator string       `ini:"column-separator" default:"  "`

	DirListLeft  *template.Template `ini:"dirlist-left" default:"{{.Folder}}"`
	DirListRight *template.Template `ini:"dirlist-right" default:"{{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}"`
	DirListRight *template.Template `ini:"dirlist-right" default:"{{if .Unread}}{{humanReadable .Unread}}{{end}}"`

	AutoMarkRead                  bool          `ini:"auto-mark-read" default:"true"`
	TimestampFormat               string        `ini:"timestamp-format" default:"2006-01-02 03:04 PM"`
	ThisDayTimeFormat             string        `ini:"this-day-time-format"`
	ThisWeekTimeFormat            string        `ini:"this-week-time-format"`
	ThisYearTimeFormat            string        `ini:"this-year-time-format"`
	MessageViewTimestampFormat    string        `ini:"message-view-timestamp-format"`
	TimestampFormat               string        `ini:"timestamp-format" default:"2006 Jan 02"`
	ThisDayTimeFormat             string        `ini:"this-day-time-format" default:"15:04"`
	ThisWeekTimeFormat            string        `ini:"this-week-time-format" default:"Jan 02"`
	ThisYearTimeFormat            string        `ini:"this-year-time-format" default:"Jan 02"`
	MessageViewTimestampFormat    string        `ini:"message-view-timestamp-format" default:"2006 Jan 02, 15:04 GMT-0700"`
	MessageViewThisDayTimeFormat  string        `ini:"message-view-this-day-time-format"`
	MessageViewThisWeekTimeFormat string        `ini:"message-view-this-week-time-format"`
	MessageViewThisYearTimeFormat string        `ini:"message-view-this-year-time-format"`
	PinnedTabMarker               string        "ini:\"pinned-tab-marker\" default:\"`\""
	SidebarWidth                  int           `ini:"sidebar-width" default:"20"`
	SidebarWidth                  int           `ini:"sidebar-width" default:"22"`
	EmptyMessage                  string        `ini:"empty-message" default:"(no messages)"`
	EmptyDirlist                  string        `ini:"empty-dirlist" default:"(no folders)"`
	EmptySubject                  string        `ini:"empty-subject" default:"(no subject)"`
@@ -82,7 +82,7 @@ type UIConfig struct {
	ThreadPrefixIndent             string `ini:"thread-prefix-indent" default:" "`
	ThreadPrefixStem               string `ini:"thread-prefix-stem" default:"│"`
	ThreadPrefixLimb               string `ini:"thread-prefix-limb" default:""`
	ThreadPrefixFolded             string `ini:"thread-prefix-folded" default:""`
	ThreadPrefixFolded             string `ini:"thread-prefix-folded" default:"+"`
	ThreadPrefixUnfolded           string `ini:"thread-prefix-unfolded" default:""`
	ThreadPrefixFirstChild         string `ini:"thread-prefix-first-child" default:""`
	ThreadPrefixHasSiblings        string `ini:"thread-prefix-has-siblings" default:"├─"`
@@ -95,8 +95,8 @@ type UIConfig struct {

	// Tab Templates
	TabTitleAccount  *template.Template `ini:"tab-title-account" default:"{{.Account}}"`
	TabTitleComposer *template.Template `ini:"tab-title-composer" default:"{{.Subject}}"`
	TabTitleViewer   *template.Template `ini:"tab-title-viewer" default:"{{if .Subject}}{{.Subject}}{{else}}(no subject){{end}}"`
	TabTitleComposer *template.Template `ini:"tab-title-composer" default:"{{if .To}}to:{{index (.To | shortmboxes) 0}} {{end}}{{.SubjectBase}}"`
	TabTitleViewer   *template.Template `ini:"tab-title-viewer" default:"{{.Subject}}"`

	// private
	contextualUis    []*UiConfigContext
@@ -228,7 +228,7 @@ func (*UIConfig) ParseIndexColumns(section *ini.Section, key *ini.Key) ([]*Colum
	}
	if !section.HasKey("column-subject") {
		_, _ = section.NewKey("column-subject",
			`{{.ThreadPrefix}}{{if .ThreadFolded}}{{printf "{%d}" .ThreadCount}}{{end}}{{.Subject}}`)
			`{{.Style .ThreadPrefix "thread"}}{{.Subject}}`)
	}
	return ParseColumnDefs(key, section)
}
diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd
index 9ba7a94141f4..b4abcbaa0555 100644
--- a/doc/aerc-config.5.scd
+++ b/doc/aerc-config.5.scd
@@ -108,7 +108,7 @@ These options are configured in the *[ui]* section of _aerc.conf_.
	columns take the width of their contents. If no width specifier is set,
	_\*_ is used by default.

	Default: _date<20,name<17,flags>4,subject<\*_
	Default: _flags:4,name<20%,subject,date>=_

*column-separator* = _"<separator>"_
	String separator inserted between columns. When a column width specifier
@@ -125,10 +125,10 @@ These options are configured in the *[ui]* section of _aerc.conf_.
	By default, these columns are defined:

	```
	column-date = {{.DateAutoFormat .Date.Local}}
	column-name = {{index (.From | names) 0}}
	column-flags = {{.Flags | join ""}}
	column-subject = {{.ThreadPrefix}}{{if .ThreadFolded}}{{printf "{%d}" .ThreadCount}}{{end}}{{.Subject}}
	column-name = {{index (.From | names) 0}}
	column-subject = {{.ThreadPrefix}}{{.Subject}}
	column-date = {{.DateAutoFormat .Date.Local}}
	```

	See *aerc-templates*(7) for all available symbols and functions.
@@ -136,24 +136,31 @@ These options are configured in the *[ui]* section of _aerc.conf_.
*timestamp-format* = _<timeformat>_
	See time.Time#Format at https://godoc.org/time#Time.Format

	Default: _2006-01-02 03:04 PM_ (ISO 8601 + 12 hour time)
	Default: _2006 Jan 02_

*this-day-time-format* = _<timeformat>_
	Index-only time format for messages that were received/sent today.
	If this is not specified, *timestamp-format* is used instead.
	If this is empty, *timestamp-format* is used instead.

	Default: _15:04_

*this-week-time-format* = _<timeformat>_
	Index-only time format for messages that were received/sent within the
	last 7 days. If this is not specified, *timestamp-format* is used
	instead.
	last 7 days. If this is empty, *timestamp-format* is used instead.

	Default: _Jan 02_

*this-year-time-format* = _<timeformat>_
	Index-only time format for messages that were received/sent this year.
	If this is not specified, *timestamp-format* is used instead.
	If this is empty, *timestamp-format* is used instead.

	Default: _Jan 02_

*message-view-timestamp-format* = _<timeformat>_
	If set, overrides *timestamp-format* for the message view.

	Default: _2006 Jan 02, 15:04 GMT-0700_

*message-view-this-day-time-format* = _<timeformat>_
	If set, overrides *timestamp-format* in the message view for messages
	that were received/sent today.
@@ -170,7 +177,7 @@ These options are configured in the *[ui]* section of _aerc.conf_.
	Width of the sidebar, including the border. Set to zero to disable the
	sidebar.

	Default: _20_
	Default: _22_

*empty-message* = _<string>_
	Message to display when viewing an empty folder.
@@ -210,13 +217,13 @@ These options are configured in the *[ui]* section of _aerc.conf_.
	The template to use for composer tab titles. See *aerc-templates*(7) for
	available field names.

	Default: _{{.Subject}}_
	Default: _{{if .To}}to:{{index (.To | shortmboxes) 0}} {{end}}{{.SubjectBase}}_

*tab-title-viewer* = _<go_template>_
	The template to use for viewer tab titles. See *aerc-templates*(7) for
	available field names.

	Default: _{{if .Subject}}{{.Subject}}{{else}}(no subject){{end}}_
	Default: _{{.Subject}}_

*pinned-tab-marker* = _"<string>"_
	Marker to show before a pinned tab's name.
@@ -261,7 +268,7 @@ These options are configured in the *[ui]* section of _aerc.conf_.
	Template for the right side of the directory list.
	See *aerc-templates*(7) for all available fields and functions.

	Default: _{{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}_
	Default: _{{if .Unread}}{{humanReadable .Unread}}{{end}}_

*dirlist-delay* = _<duration>_
	Delay after which the messages are actually listed when entering
@@ -497,7 +504,7 @@ following configurable prefix parts:
*thread-prefix-folded* = _<string>_
	Define the folded thread indicator.

	Default: _""_
	Default: _"+"_

*thread-prefix-unfolded* = _<string>_
	Define the unfolded thread indicator.
@@ -554,7 +561,7 @@ Default settings (mutt-style):
	[PATCH aerc v5] ui: allow thread arrow customisation
	├─>[aerc/patches] build success
	├─>Re: [PATCH aerc v5] ui: allow thread arrow customisation
	├─
	├─+
	└─>
	  ├─>
	  │ ├─>
@@ -655,7 +662,7 @@ These options are configured in the *[statusline]* section of _aerc.conf_.
	```
	column-left = [{{.Account}}] {{.StatusInfo}}
	column-center = {{.PendingKeys}}
	column-right = {{.TrayInfo}}
	column-right = {{.TrayInfo}} | {{cwd}}
	```

	See *aerc-templates*(7) for all available symbols and functions.
diff --git a/doc/aerc-stylesets.7.scd b/doc/aerc-stylesets.7.scd
index 8083888b14b4..497740124989 100644
--- a/doc/aerc-stylesets.7.scd
+++ b/doc/aerc-stylesets.7.scd
@@ -348,31 +348,37 @@ _<Dec number>_
Before parsing a styleset, it is first initialized with the following defaults:

```
*.selected.reverse=toggle
title.reverse=true
header.bold=true
*error.bold=true
error.fg=red
warning.fg=yellow
success.fg=green
statusline*.default=true
statusline_default.reverse=true
statusline_error.fg=red
statusline_error.reverse=true
statusline_warning.fg=yellow
statusline_warning.reverse=true
msglist_unread.bold=true
msglist_deleted.fg=gray
msglist_result.fg=green
msglist_pill.reverse=true
part_mimetype.dim=true
part_mimetype.selected.dim=false
part_filename.selected.bold=true
completion_pill.reverse=true
tab.reverse=true
border.reverse = true
selector_focused.reverse=true
selector_chooser.bold=true
*.selected.bg = 12
*.selected.fg = 15
*.selected.bold = true
statusline_*.dim = true
statusline_*.bg = 8
statusline_*.fg = 15
*warning.fg = 3
*success.fg = 2
*error.fg = 1
*error.bold = true
border.bg = 12
border.fg = 15
title.bg = 12
title.fg = 15
title.bold = true
header.fg = 4
header.bold = true
msglist_unread.bold = true
msglist_deleted.dim = true
msglist_marked.bg = 6
msglist_marked.fg = 15
msglist_pill.bg = 12
msglist_pill.fg = 15
part_mimetype.fg = 12
selector_chooser.bold = true
selector_focused.bold = true
selector_focused.bg = 12
selector_focused.fg = 15
completion_pill.bg = 12
completion_default.bg = 8
completion_default.fg = 15
```

You can choose either to reset everything by starting your styleset with these
diff --git a/stylesets/default b/stylesets/default
index 74bbe97a068c..8e0ffc3fb412 100644
--- a/stylesets/default
+++ b/stylesets/default
@@ -1,3 +1,4 @@
# vim: ft=dosini
#
# aerc default styleset
#
@@ -7,41 +8,48 @@
# modifying or creating a styleset.

# Uncomment these two lines to reset all attributes and start from scratch.
#*.default=true
#*.normal=true
#*.default = true
#*.normal = true

#*.selected.reverse=toggle
#
#title.reverse=true
#header.bold=true
#*.selected.bg = 12
#*.selected.fg = 15
#*.selected.bold = true

#*error.bold=true
#error.fg=red
#warning.fg=yellow
#success.fg=green
#statusline_*.dim = true
#statusline_*.bg = 8
#statusline_*.fg = 15

#statusline*.default=true
#statusline_default.reverse=true
#statusline_error.fg=red
#statusline_error.reverse=true
#statusline_warning.fg=yellow
#statusline_warning.reverse=true
#*warning.fg = 3
#*success.fg = 2
#*error.fg = 1
#*error.bold = true

#msglist_unread.bold=true
#msglist_deleted.fg=gray
#msglist_result.fg=green
#msglist_pill.reverse=true
#border.bg = 12
#border.fg = 15
#title.bg = 12
#title.fg = 15
#title.bold = true

#part_mimetype.dim=true
#part_mimetype.selected.dim=false
#part_filename.selected.bold=true
#completion_pill.reverse=true
#header.fg = 4
#header.bold = true

#tab.reverse=true
#border.reverse = true
#msglist_unread.bold = true
#msglist_deleted.dim = true
#msglist_marked.bg = 6
#msglist_marked.fg = 15
#msglist_pill.bg = 12
#msglist_pill.fg = 15

#selector_focused.reverse=true
#selector_chooser.bold=true
#part_mimetype.fg = 12

#selector_chooser.bold = true
#selector_focused.bold = true
#selector_focused.bg = 12
#selector_focused.fg = 15

#completion_pill.bg = 12
#completion_default.bg = 8
#completion_default.fg = 15

#[viewer]
#url.underline=true
@@ -54,3 +62,6 @@
#quote_*.fg=6
#quote_*.dim=true
#quote_1.dim=false

[user]
thread.fg = 1
-- 
2.43.0

[PATCH aerc v4 3/4] colorize: adapt default style for light backgrounds Export this patch

The current default theme is unusable on light backgrounds. Some colors
are too light and are almost invisible.

Use only palette colors to ensure that everything is customizable by the
user.

I tested this with white on black, grey on dark purple, black on yellow,
black on white. Text remains readable everywhere.

Update stylesets that don't use these new defaults to explicitly
override them.

Changelog-changed: The default `colorize` theme has been changed to
 use the base terminal colors.
Cc: Jason Cox <me@jasoncarloscox.com>
Reported-by: Matěj Cepl <mcepl@cepl.eu>
Signed-off-by: Robin Jarry <robin@jarry.cc>
---
 filters/colorize.c | 26 +++++++++++++-------------
 stylesets/blue     | 30 +++++++++++++++---------------
 stylesets/default  | 30 ++++++++++++++++++++----------
 stylesets/dracula  |  5 +++++
 stylesets/pink     | 30 +++++++++++++++---------------
 5 files changed, 68 insertions(+), 53 deletions(-)

diff --git a/filters/colorize.c b/filters/colorize.c
index 01f2befcdb6e..36474ba9e95f 100644
--- a/filters/colorize.c
+++ b/filters/colorize.c
@@ -160,19 +160,19 @@ static FILE *in_file;
static bool osc8_urls;
static const char *styleset;
static struct styles styles = {
	.url = { .underline = true, .fg = { .type = RGB, .rgb = 0xffffaf } },
	.header = { .bold = true, .fg = { .type = RGB, .rgb = 0xaf87ff } },
	.signature = { .dim = true, .fg = { .type = RGB, .rgb = 0xaf87ff } },
	.diff_meta = { .bold = true, .fg = { .type = RGB, .rgb = 0xffffff } },
	.diff_chunk = { .bold = true, .fg = { .type = RGB, .rgb = 0x00cdcd } },
	.diff_chunk_func = { .fg = { .type = RGB, .rgb = 0x00cdcd } },
	.diff_add = { .fg = { .type = RGB, .rgb = 0x00cd00 } },
	.diff_del = { .fg = { .type = RGB, .rgb = 0xcd0000 } },
	.quote_1 = { .fg = { .type = RGB, .rgb = 0x5fafff } },
	.quote_2 = { .fg = { .type = RGB, .rgb = 0xff8700 } },
	.quote_3 = { .fg = { .type = RGB, .rgb = 0xaf87ff } },
	.quote_4 = { .fg = { .type = RGB, .rgb = 0xff5fd7 } },
	.quote_x = { .fg = { .type = RGB, .rgb = 0x808080 } },
	.url = { .underline = true, .fg = { .type = PALETTE, .index = 3 } },
	.header = { .bold = true, .fg = { .type = PALETTE, .index = 4 } },
	.signature = { .dim = true, .fg = { .type = PALETTE, .index = 4 } },
	.diff_meta = { .bold = true },
	.diff_chunk = { .fg = { .type = PALETTE, .index = 6 } },
	.diff_chunk_func = { .dim = true, .fg = { .type = PALETTE, .index = 6 } },
	.diff_add = { .fg = { .type = PALETTE, .index = 2 } },
	.diff_del = { .fg = { .type = PALETTE, .index = 1 } },
	.quote_1 = { .fg = { .type = PALETTE, .index = 6 } },
	.quote_2 = { .fg = { .type = PALETTE, .index = 4 } },
	.quote_3 = { .dim = true, .fg = { .type = PALETTE, .index = 6 } },
	.quote_4 = { .dim = true, .fg = { .type = PALETTE, .index = 4 } },
	.quote_x = { .dim = true, .fg = { .type = PALETTE, .index = 5 } },
};

static inline bool startswith(const char *s, const char *prefix)
diff --git a/stylesets/blue b/stylesets/blue
index 4ffcbc876bf6..0d47435463bc 100644
--- a/stylesets/blue
+++ b/stylesets/blue
@@ -56,18 +56,18 @@ default.selected.bg=#005f87

completion_default.selected.bg=#005f87

#[viewer]
#url.fg=#ffffaf
#url.underline=true
#header.fg=#af87ff
#signature.fg=#af87ff
#diff_meta.fg=#ffffff
#diff_meta.bold=true
#diff_chunk.fg=#00cdcd
#diff_add.fg=#00cd00
#diff_del.fg=#cd0000
#quote_1.fg=#5fafff
#quote_2.fg=#ff8700
#quote_3.fg=#af87ff
#quote_4.fg=#ff5fd7
#quote_x.fg=#808080
[viewer]
url.fg=#ffffaf
url.underline=true
header.fg=#af87ff
signature.fg=#af87ff
diff_meta.fg=#ffffff
diff_meta.bold=true
diff_chunk.fg=#00cdcd
diff_add.fg=#00cd00
diff_del.fg=#cd0000
quote_1.fg=#5fafff
quote_2.fg=#ff8700
quote_3.fg=#af87ff
quote_4.fg=#ff5fd7
quote_x.fg=#808080
diff --git a/stylesets/default b/stylesets/default
index 8e0ffc3fb412..3710cc676c2d 100644
--- a/stylesets/default
+++ b/stylesets/default
@@ -52,16 +52,26 @@
#completion_default.fg = 15

#[viewer]
#url.underline=true
#header.bold=true
#signature.dim=true
#diff_meta.bold=true
#diff_chunk.dim=true
#diff_add.fg=2
#diff_del.fg=1
#quote_*.fg=6
#quote_*.dim=true
#quote_1.dim=false
#url.underline = true
#url.fg = 3
#header.bold = true
#header.fg = 4
#signature.dim = true
#signature.fg = 4
#diff_meta.bold = true
#diff_chunk.fg = 6
#diff_chunk_func.fg = 6
#diff_chunk_func.dim = true
#diff_add.fg = 2
#diff_del.fg = 1
#quote_1.fg = 6
#quote_2.fg = 4
#quote_3.fg = 6
#quote_3.dim = true
#quote_4.fg = 4
#quote_4.dim = true
#quote_x.fg = 5
#quote_x.dim = true

[user]
thread.fg = 1
diff --git a/stylesets/dracula b/stylesets/dracula
index 73623547d7ad..f4eada3b58ed 100644
--- a/stylesets/dracula
+++ b/stylesets/dracula
@@ -1,3 +1,8 @@
# vim: ft=dosini
#
# aerc dracula styleset
#

*.default=true
*.normal=true

diff --git a/stylesets/pink b/stylesets/pink
index deaae5ac7079..dfc53b7112e4 100644
--- a/stylesets/pink
+++ b/stylesets/pink
@@ -56,18 +56,18 @@ default.selected.bg=#de4e85

completion_default.selected.bg=#de4e85

#[viewer]
#url.fg=#ffffaf
#url.underline=true
#header.fg=#af87ff
#signature.fg=#af87ff
#diff_meta.fg=#ffffff
#diff_meta.bold=true
#diff_chunk.fg=#00cdcd
#diff_add.fg=#00cd00
#diff_del.fg=#cd0000
#quote_1.fg=#5fafff
#quote_2.fg=#ff8700
#quote_3.fg=#af87ff
#quote_4.fg=#ff5fd7
#quote_x.fg=#808080
[viewer]
url.fg=#ffffaf
url.underline=true
header.fg=#af87ff
signature.fg=#af87ff
diff_meta.fg=#ffffff
diff_meta.bold=true
diff_chunk.fg=#00cdcd
diff_add.fg=#00cd00
diff_del.fg=#cd0000
quote_1.fg=#5fafff
quote_2.fg=#ff8700
quote_3.fg=#af87ff
quote_4.fg=#ff5fd7
quote_x.fg=#808080
-- 
2.43.0

[PATCH aerc v4 4/4] colorize: preserve defaults unless overridden Export this patch

To be consistent with stylesets for the rest of aerc's UI, settings in
the [viewer] section now only overrides the default colorize theme.
Changelog-changed: The `[viewer]` section of stylesets now preserve
 default values as documented in `aerc-stylesets(7)` unless explicitly
 overridden.
Requested-by: Karel Balej <balejk@matfyz.cz>
Signed-off-by: Robin Jarry <robin@jarry.cc>
---
 doc/aerc-stylesets.7.scd | 22 ++++++++++++++++++++++
 filters/colorize.c       |  3 ---
 filters/test.sh          |  2 ++
 stylesets/blue           |  2 ++
 stylesets/dracula        |  2 ++
 stylesets/nord           |  2 ++
 stylesets/pink           |  2 ++
 stylesets/solarized      |  3 +++
 8 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/doc/aerc-stylesets.7.scd b/doc/aerc-stylesets.7.scd
index 497740124989..9330fb813665 100644
--- a/doc/aerc-stylesets.7.scd
+++ b/doc/aerc-stylesets.7.scd
@@ -379,6 +379,28 @@ selector_focused.fg = 15
completion_pill.bg = 12
completion_default.bg = 8
completion_default.fg = 15

[viewer]
url.underline = true
url.fg = 3
header.bold = true
header.fg = 4
signature.dim = true
signature.fg = 4
diff_meta.bold = true
diff_chunk.fg = 6
diff_chunk_func.fg = 6
diff_chunk_func.dim = true
diff_add.fg = 2
diff_del.fg = 1
quote_1.fg = 6
quote_2.fg = 4
quote_3.fg = 6
quote_3.dim = true
quote_4.fg = 4
quote_4.dim = true
quote_x.fg = 5
quote_x.dim = true
```

You can choose either to reset everything by starting your styleset with these
diff --git a/filters/colorize.c b/filters/colorize.c
index 36474ba9e95f..141501543850 100644
--- a/filters/colorize.c
+++ b/filters/colorize.c
@@ -389,9 +389,6 @@ static int parse_styleset(void)
			}
		} else if (!strcmp(buf, "[viewer]")) {
			in_section = true;
			/* only disable the default theme if there is
			 * a [viewer] section in the styleset */
			memset(&styles, 0, sizeof(styles));
		}
	}

diff --git a/filters/test.sh b/filters/test.sh
index 16d1438c6c98..39319d6b44ae 100755
--- a/filters/test.sh
+++ b/filters/test.sh
@@ -12,6 +12,8 @@ cat >$style <<EOF
url.fg = red

[viewer]
*.normal=true
*.default=true
url.underline = true # cxwlkj
header.bold=    true  # comment
signature.dim=true
diff --git a/stylesets/blue b/stylesets/blue
index 0d47435463bc..4fffca0afb51 100644
--- a/stylesets/blue
+++ b/stylesets/blue
@@ -57,6 +57,8 @@ default.selected.bg=#005f87
completion_default.selected.bg=#005f87

[viewer]
*.default=true
*.normal=true
url.fg=#ffffaf
url.underline=true
header.fg=#af87ff
diff --git a/stylesets/dracula b/stylesets/dracula
index f4eada3b58ed..d22fb7e67bf0 100644
--- a/stylesets/dracula
+++ b/stylesets/dracula
@@ -63,6 +63,8 @@ completion_default.selected.bg=#44475A
completion_default.selected.fg=white

[viewer]
*.default=true
*.normal=true
url.underline=true
header.bold=true
signature.dim=true
diff --git a/stylesets/nord b/stylesets/nord
index 9a3593f2ce31..90e61186a4f1 100644
--- a/stylesets/nord
+++ b/stylesets/nord
@@ -53,6 +53,8 @@ part_*.selected.fg=#ffffff
part_filename.selected.bold=true

[viewer]
*.default=true
*.normal=true
url.underline=true
header.bold=true
signature.dim=true
diff --git a/stylesets/pink b/stylesets/pink
index dfc53b7112e4..8742887482d8 100644
--- a/stylesets/pink
+++ b/stylesets/pink
@@ -57,6 +57,8 @@ default.selected.bg=#de4e85
completion_default.selected.bg=#de4e85

[viewer]
*.default=true
*.normal=true
url.fg=#ffffaf
url.underline=true
header.fg=#af87ff
diff --git a/stylesets/solarized b/stylesets/solarized
index 9874e2d8b098..29717c725419 100644
--- a/stylesets/solarized
+++ b/stylesets/solarized
@@ -1,3 +1,4 @@
# vim: ft=dosini
#
# aerc solarized styleset
#
@@ -37,6 +38,8 @@ part_mimetype.fg=#b58900
part_filename.selected.bold=true

[viewer]
*.default=true
*.normal=true
diff_add.fg=#859900 # green
diff_chunk.dim=true
diff_chunk.fg=#2aa198 # cyan
-- 
2.43.0
aerc/patches: SUCCESS in 1m52s

[Default UI change][0] v4 from [Robin Jarry][1]

[0]: https://lists.sr.ht/~rjarry/aerc-devel/patches/49332
[1]: mailto:robin@jarry.cc

✓ #1146724 SUCCESS aerc/patches/openbsd.yml     https://builds.sr.ht/~rjarry/job/1146724
✓ #1146723 SUCCESS aerc/patches/alpine-edge.yml https://builds.sr.ht/~rjarry/job/1146723
Robin,

Robin Jarry, 2024-02-10T01:20:26+01:00: