e2d5c456dc
This adds the ability for per-account signatures in the accounts.conf config file. The signature is added to emails in the editor at the bottom of the email. This includes when forwarding, replying to, and composing emails. There are two config options: signature-file and signature-cmd. The former allows a signature to be read from a file and the latter allows an arbitrary command to be executed to return the signature. The config options have been documented in aerc-config
80 lines
1.6 KiB
Go
80 lines
1.6 KiB
Go
package account
|
|
|
|
import (
|
|
"errors"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"git.sr.ht/~sircmpwn/aerc/widgets"
|
|
"git.sr.ht/~sircmpwn/getopt"
|
|
)
|
|
|
|
type Compose struct{}
|
|
|
|
func init() {
|
|
register(Compose{})
|
|
}
|
|
|
|
func (Compose) Aliases() []string {
|
|
return []string{"compose"}
|
|
}
|
|
|
|
func (Compose) Complete(aerc *widgets.Aerc, args []string) []string {
|
|
return nil
|
|
}
|
|
|
|
func (Compose) Execute(aerc *widgets.Aerc, args []string) error {
|
|
body, err := buildBody(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
acct := aerc.SelectedAccount()
|
|
composer := widgets.NewComposer(aerc,
|
|
aerc.Config(), acct.AccountConfig(), acct.Worker(), nil)
|
|
tab := aerc.NewTab(composer, "New email")
|
|
composer.OnHeaderChange("Subject", func(subject string) {
|
|
if subject == "" {
|
|
tab.Name = "New email"
|
|
} else {
|
|
tab.Name = subject
|
|
}
|
|
tab.Content.Invalidate()
|
|
})
|
|
go composer.PrependContents(strings.NewReader(body))
|
|
return nil
|
|
}
|
|
|
|
func buildBody(args []string) (string, error) {
|
|
var body, headers string
|
|
opts, optind, err := getopt.Getopts(args, "H:")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
for _, opt := range opts {
|
|
switch opt.Option {
|
|
case 'H':
|
|
if strings.Contains(opt.Value, ":") {
|
|
// ensure first colon is followed by a single space
|
|
re := regexp.MustCompile(`^(.*?):\s*(.*)`)
|
|
headers += re.ReplaceAllString(opt.Value, "$1: $2") + "\n"
|
|
} else {
|
|
headers += opt.Value + ":\n"
|
|
}
|
|
}
|
|
}
|
|
posargs := args[optind:]
|
|
if len(posargs) > 1 {
|
|
return "", errors.New("Usage: compose [-H] [body]")
|
|
}
|
|
if len(posargs) == 1 {
|
|
body = posargs[0]
|
|
}
|
|
if headers != "" {
|
|
if len(body) > 0 {
|
|
body = headers + "\n" + body
|
|
} else {
|
|
body = headers + "\n\n"
|
|
}
|
|
}
|
|
return body, nil
|
|
}
|