aboutsummaryrefslogtreecommitdiff
path: root/commands/account
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-05-16 12:39:22 -0400
committerDrew DeVault <sir@cmpwn.com>2019-05-16 12:39:22 -0400
commit8be59cae6c133f38fa534df2dc9f79e6c7a810fb (patch)
tree5cda762c19856a2b2ebb65b12468b84c3fede483 /commands/account
parent475b697bdfd7a5821282174f14f8d904e47aff4d (diff)
Implement :reply -q and :reply -a
Diffstat (limited to 'commands/account')
-rw-r--r--commands/account/reply.go80
1 files changed, 61 insertions, 19 deletions
diff --git a/commands/account/reply.go b/commands/account/reply.go
index d0d65a5..803c616 100644
--- a/commands/account/reply.go
+++ b/commands/account/reply.go
@@ -1,10 +1,13 @@
package account
import (
+ "bufio"
"errors"
"fmt"
+ "io"
"strings"
+ "git.sr.ht/~sircmpwn/getopt"
"github.com/emersion/go-imap"
"git.sr.ht/~sircmpwn/aerc2/widgets"
@@ -15,12 +18,28 @@ func init() {
}
func Reply(aerc *widgets.Aerc, args []string) error {
- if len(args) != 1 {
+ opts, optind, err := getopt.Getopts(args[1:], "aq")
+ if err != nil {
+ return err
+ }
+ if optind != len(args) - 1 {
return errors.New("Usage: reply [-aq]")
}
- // TODO: Reply all (w/ getopt)
+ var (
+ quote bool
+ replyAll bool
+ )
+ for _, opt := range opts {
+ switch opt.Option {
+ case 'a':
+ replyAll = true
+ case 'q':
+ quote = true
+ }
+ }
acct := aerc.SelectedAccount()
+ store := acct.Messages().Store()
msg := acct.Messages().Selected()
acct.Logger().Println("Replying to email " + msg.Envelope.MessageId)
@@ -43,14 +62,15 @@ func Reply(aerc *widgets.Aerc, args []string) error {
addr.MailboxName, addr.HostName))
}
}
- // TODO: Only if reply all
- for _, addr := range msg.Envelope.Cc {
- if addr.PersonalName != "" {
- cc = append(cc, fmt.Sprintf("%s <%s@%s>",
- addr.PersonalName, addr.MailboxName, addr.HostName))
- } else {
- cc = append(cc, fmt.Sprintf("<%s@%s>",
- addr.MailboxName, addr.HostName))
+ if replyAll {
+ for _, addr := range msg.Envelope.Cc {
+ if addr.PersonalName != "" {
+ cc = append(cc, fmt.Sprintf("%s <%s@%s>",
+ addr.PersonalName, addr.MailboxName, addr.HostName))
+ } else {
+ cc = append(cc, fmt.Sprintf("<%s@%s>",
+ addr.MailboxName, addr.HostName))
+ }
}
}
@@ -66,16 +86,38 @@ func Reply(aerc *widgets.Aerc, args []string) error {
}).
FocusTerminal()
- tab := aerc.NewTab(composer, subject)
+ addTab := func() {
+ tab := aerc.NewTab(composer, subject)
+ composer.OnSubjectChange(func(subject string) {
+ if subject == "" {
+ tab.Name = "New email"
+ } else {
+ tab.Name = subject
+ }
+ tab.Content.Invalidate()
+ })
+ }
- composer.OnSubjectChange(func(subject string) {
- if subject == "" {
- tab.Name = "New email"
- } else {
- tab.Name = subject
- }
- tab.Content.Invalidate()
- })
+ if quote {
+ // TODO: something more intelligent than fetching the 0th part
+ store.FetchBodyPart(msg.Uid, 0, func(reader io.Reader) {
+ pipeout, pipein := io.Pipe()
+ scanner := bufio.NewScanner(reader)
+ go composer.SetContents(pipeout)
+ // TODO: Let user customize the date format used here
+ io.WriteString(pipein, fmt.Sprintf("On %s %s wrote:\n",
+ msg.Envelope.Date.Format("Mon Jan 2, 2006 at 3:04 PM"),
+ msg.Envelope.From[0].PersonalName))
+ for scanner.Scan() {
+ io.WriteString(pipein, fmt.Sprintf("> %s\n",scanner.Text()))
+ }
+ pipein.Close()
+ pipeout.Close()
+ addTab()
+ })
+ } else {
+ addTab()
+ }
return nil
}