aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/triggers.go94
-rw-r--r--config/ui.go134
2 files changed, 106 insertions, 122 deletions
diff --git a/config/triggers.go b/config/triggers.go
index 906928ae..c0e70d40 100644
--- a/config/triggers.go
+++ b/config/triggers.go
@@ -1,82 +1,62 @@
package config
import (
- "errors"
- "fmt"
-
"github.com/go-ini/ini"
"github.com/google/shlex"
"git.sr.ht/~rjarry/aerc/lib/format"
"git.sr.ht/~rjarry/aerc/log"
- "git.sr.ht/~rjarry/aerc/models"
)
type TriggersConfig struct {
- NewEmail string `ini:"new-email"`
- ExecuteCommand func(command []string) error
+ NewEmail []string `ini:"-"`
}
var Triggers = &TriggersConfig{}
func parseTriggers(file *ini.File) error {
+ var cmd string
triggers, err := file.GetSection("triggers")
if err != nil {
goto out
}
- if err := triggers.MapTo(&Triggers); err != nil {
- return err
- }
-out:
- log.Debugf("aerc.conf: [triggers] %#v", Triggers)
- return nil
-}
-
-func (trig *TriggersConfig) ExecTrigger(triggerCmd string,
- triggerFmt func(string) (string, error),
-) error {
- if len(triggerCmd) == 0 {
- return errors.New("Trigger command empty")
- }
- triggerCmdParts, err := shlex.Split(triggerCmd)
- if err != nil {
- return err
- }
-
- var command []string
- for _, part := range triggerCmdParts {
- formattedPart, err := triggerFmt(part)
+ if key := triggers.Key("new-email"); key != nil {
+ cmd = indexFmtRegexp.ReplaceAllStringFunc(
+ key.String(),
+ func(s string) string {
+ runes := []rune(s)
+ t, _ := indexVerbToTemplate(runes[len(runes)-1])
+ return t
+ },
+ )
+ Triggers.NewEmail, err = shlex.Split(cmd)
if err != nil {
return err
}
- command = append(command, formattedPart)
- }
- return trig.ExecuteCommand(command)
-}
-
-func (trig *TriggersConfig) ExecNewEmail(
- account *AccountConfig, msg *models.MessageInfo,
-) {
- err := trig.ExecTrigger(trig.NewEmail,
- func(part string) (string, error) {
- formatstr, args, err := format.ParseMessageFormat(
- part, Ui.TimestampFormat,
- Ui.ThisDayTimeFormat,
- Ui.ThisWeekTimeFormat,
- Ui.ThisYearTimeFormat,
- Ui.IconAttachment,
- format.Ctx{
- FromAddress: format.AddressForHumans(account.From),
- AccountName: account.Name,
- MsgInfo: msg,
- },
- )
- if err != nil {
- return "", err
- }
- return fmt.Sprintf(formatstr, args...), nil
- })
- if err != nil {
- log.Errorf("failed to run new-email trigger: %v", err)
+ if cmd != key.String() {
+ log.Warnf("%s %s",
+ "The new-email trigger now uses templates instead of %-based placeholders.",
+ "Backward compatibility will be removed in aerc 0.17.")
+ Warnings = append(Warnings, Warning{
+ Title: "FORMAT CHANGED: [triggers].new-email",
+ Body: `
+The new-email trigger now uses templates instead of %-based placeholders.
+
+Your configuration in this instance was automatically converted to:
+
+[triggers]
+new-email = ` + format.ShellQuote(Triggers.NewEmail) + `
+
+Your configuration file was not changed. To make this change permanent and to
+dismiss this warning on launch, replace the above line into aerc.conf. See
+aerc-config(5) for more details.
+
+The automatic conversion of new-email will be removed in aerc 0.17.
+`,
+ })
+ }
}
+out:
+ log.Debugf("aerc.conf: [triggers] %#v", Triggers)
+ return nil
}
diff --git a/config/ui.go b/config/ui.go
index db596d97..b59c9b09 100644
--- a/config/ui.go
+++ b/config/ui.go
@@ -391,75 +391,12 @@ func convertIndexFormat(indexFormat string) ([]*ColumnDef, error) {
alignWidth := m[1]
verb := m[3]
- var f string
var width float64 = 0
var flags ColumnFlags = ALIGN_LEFT
- name := ""
-
- switch verb {
- case "%":
- f = verb
- case "a":
- f = `{{(index .From 0).Address}}`
- name = "sender"
- case "A":
- f = `{{if eq (len .ReplyTo) 0}}{{(index .From 0).Address}}{{else}}{{(index .ReplyTo 0).Address}}{{end}}`
- name = "reply-to"
- case "C":
- f = "{{.Number}}"
- name = "num"
- case "d", "D":
- f = "{{.DateAutoFormat .Date.Local}}"
- name = "date"
- case "f":
- f = `{{index (.From | persons) 0}}`
- name = "from"
- case "F":
- f = `{{.Peer | names | join ", "}}`
- name = "peers"
- case "g":
- f = `{{.Labels | join ", "}}`
- name = "labels"
- case "i":
- f = "{{.MessageId}}"
- name = "msg-id"
- case "n":
- f = `{{index (.From | names) 0}}`
- name = "name"
- case "r":
- f = `{{.To | persons | join ", "}}`
- name = "to"
- case "R":
- f = `{{.Cc | persons | join ", "}}`
- name = "cc"
- case "s":
- f = "{{.Subject}}"
- name = "subject"
- case "t":
- f = "{{(index .To 0).Address}}"
- name = "to0"
- case "T":
- f = "{{.Account}}"
- name = "account"
- case "u":
- f = "{{index (.From | mboxes) 0}}"
- name = "mboxes"
- case "v":
- f = "{{index (.From | names) 0}}"
- name = "name"
- case "Z":
- f = `{{.Flags | join ""}}`
- name = "flags"
+ f, name := indexVerbToTemplate([]rune(verb)[0])
+ if verb == "Z" {
width = 4
flags = ALIGN_RIGHT
- case "l":
- f = "{{.Size}}"
- name = "size"
- default:
- f = "%" + verb
- }
- if name == "" {
- name = "wtf"
}
t, err := templates.ParseTemplate(fmt.Sprintf("column-%s", name), f)
@@ -495,6 +432,73 @@ func convertIndexFormat(indexFormat string) ([]*ColumnDef, error) {
return columns, nil
}
+func indexVerbToTemplate(verb rune) (f, name string) {
+ switch verb {
+ case '%':
+ f = string(verb)
+ case 'a':
+ f = `{{(index .From 0).Address}}`
+ name = "sender"
+ case 'A':
+ f = `{{if eq (len .ReplyTo) 0}}{{(index .From 0).Address}}{{else}}{{(index .ReplyTo 0).Address}}{{end}}`
+ name = "reply-to"
+ case 'C':
+ f = "{{.Number}}"
+ name = "num"
+ case 'd', 'D':
+ f = "{{.DateAutoFormat .Date.Local}}"
+ name = "date"
+ case 'f':
+ f = `{{index (.From | persons) 0}}`
+ name = "from"
+ case 'F':
+ f = `{{.Peer | names | join ", "}}`
+ name = "peers"
+ case 'g':
+ f = `{{.Labels | join ", "}}`
+ name = "labels"
+ case 'i':
+ f = "{{.MessageId}}"
+ name = "msg-id"
+ case 'n':
+ f = `{{index (.From | names) 0}}`
+ name = "name"
+ case 'r':
+ f = `{{.To | persons | join ", "}}`
+ name = "to"
+ case 'R':
+ f = `{{.Cc | persons | join ", "}}`
+ name = "cc"
+ case 's':
+ f = "{{.Subject}}"
+ name = "subject"
+ case 't':
+ f = "{{(index .To 0).Address}}"
+ name = "to0"
+ case 'T':
+ f = "{{.Account}}"
+ name = "account"
+ case 'u':
+ f = "{{index (.From | mboxes) 0}}"
+ name = "mboxes"
+ case 'v':
+ f = "{{index (.From | names) 0}}"
+ name = "name"
+ case 'Z':
+ f = `{{.Flags | join ""}}`
+ name = "flags"
+ case 'l':
+ f = "{{.Size}}"
+ name = "size"
+ default:
+ f = "%" + string(verb)
+ }
+ if name == "" {
+ name = "wtf"
+ }
+ return
+}
+
func (ui *UIConfig) loadStyleSet(styleSetDirs []string) error {
ui.style = NewStyleSet()
err := ui.style.LoadStyleSet(ui.StyleSetName, styleSetDirs)