Parse headers from template v2 PROPOSED

Robert Günzler: 1
 Parse headers from template

 1 files changed, 50 insertions(+), 3 deletions(-)
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/~sircmpwn/aerc/patches/9241/mbox | git am -3
Learn more about email & git
View this thread in the archives

[PATCH v2] Parse headers from template Export this patch

This patch parses the processed template for headers and populates
matching header editors.
Those are then stripped from the template body before prepending the template
and remaining header fields to the composer content.

The main motivation for this is keeping receiver, sender and subject
lines in the template file and generating the message subject from the
> Whoops, I had to revert this. :reply -q fails with this patch, because
> it tries to interpret the message body as headers.
Ohno, should've tested this better myself :p

I made it so that if the compiled template doesn't parse as a message we just
prepend like before.

 widgets/compose.go | 53 +++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 50 insertions(+), 3 deletions(-)

diff --git a/widgets/compose.go b/widgets/compose.go
index 62aaafe..24af18c 100644
--- a/widgets/compose.go
+++ b/widgets/compose.go
@@ -179,8 +179,7 @@ func (c *Composer) AddTemplate(template string, data interface{}) error {
	if err != nil {
		return err
	return nil
	return c.addTemplate(templateText)

func (c *Composer) AddTemplateFromString(template string, data interface{}) error {
@@ -192,7 +191,55 @@ func (c *Composer) AddTemplateFromString(template string, data interface{}) erro
	if err != nil {
		return err
	return c.addTemplate(templateText)

func (c *Composer) addTemplate(templateText []byte) error {
	reader, err := mail.CreateReader(bytes.NewReader(templateText))
	if err != nil {
		// encountering an error when reading the template probably
		// means the template didn't evaluate to a properly formatted
		// mail file.
		// This is fine, we still want to support simple body tempaltes
		// that don't include headers.
		// Just prepend the rendered template in that case. This
		// basically equals the previous behavior.
		return nil
	defer reader.Close()

	// populate header editors
	header := reader.Header
	mhdr := (*message.Header)(&header.Header)
	for _, editor := range c.editors {
		if mhdr.Has(editor.name) {
			// remove header fields that have editors

	part, err := reader.NextPart()
	if err != nil {
		return errors.Wrap(err, "reader.NextPart")

	var (
		headers string
		fds     = mhdr.Fields()
	for fds.Next() {
		headers += fmt.Sprintf("%s: %s\n", fds.Key(), fds.Value())
	if headers != "" {
		headers += "\n"

	// prepend header fields without editors to message body
	return nil


To git.sr.ht:~sircmpwn/aerc
   eef662c..4f28926  master -> master