diff options
Diffstat (limited to 'config')
-rw-r--r-- | config/triggers.go | 94 | ||||
-rw-r--r-- | config/ui.go | 134 |
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) |