Implement :reply -q and :reply -a

This commit is contained in:
Drew DeVault 2019-05-16 12:39:22 -04:00
parent 475b697bdf
commit 8be59cae6c
4 changed files with 73 additions and 19 deletions

View File

@ -1,10 +1,13 @@
package account package account
import ( import (
"bufio"
"errors" "errors"
"fmt" "fmt"
"io"
"strings" "strings"
"git.sr.ht/~sircmpwn/getopt"
"github.com/emersion/go-imap" "github.com/emersion/go-imap"
"git.sr.ht/~sircmpwn/aerc2/widgets" "git.sr.ht/~sircmpwn/aerc2/widgets"
@ -15,12 +18,28 @@ func init() {
} }
func Reply(aerc *widgets.Aerc, args []string) error { 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]") 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() acct := aerc.SelectedAccount()
store := acct.Messages().Store()
msg := acct.Messages().Selected() msg := acct.Messages().Selected()
acct.Logger().Println("Replying to email " + msg.Envelope.MessageId) acct.Logger().Println("Replying to email " + msg.Envelope.MessageId)
@ -43,7 +62,7 @@ func Reply(aerc *widgets.Aerc, args []string) error {
addr.MailboxName, addr.HostName)) addr.MailboxName, addr.HostName))
} }
} }
// TODO: Only if reply all if replyAll {
for _, addr := range msg.Envelope.Cc { for _, addr := range msg.Envelope.Cc {
if addr.PersonalName != "" { if addr.PersonalName != "" {
cc = append(cc, fmt.Sprintf("%s <%s@%s>", cc = append(cc, fmt.Sprintf("%s <%s@%s>",
@ -53,6 +72,7 @@ func Reply(aerc *widgets.Aerc, args []string) error {
addr.MailboxName, addr.HostName)) addr.MailboxName, addr.HostName))
} }
} }
}
subject := "Re: " + msg.Envelope.Subject subject := "Re: " + msg.Envelope.Subject
@ -66,8 +86,8 @@ func Reply(aerc *widgets.Aerc, args []string) error {
}). }).
FocusTerminal() FocusTerminal()
addTab := func() {
tab := aerc.NewTab(composer, subject) tab := aerc.NewTab(composer, subject)
composer.OnSubjectChange(func(subject string) { composer.OnSubjectChange(func(subject string) {
if subject == "" { if subject == "" {
tab.Name = "New email" tab.Name = "New email"
@ -76,6 +96,28 @@ func Reply(aerc *widgets.Aerc, args []string) error {
} }
tab.Content.Invalidate() 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 return nil
} }

1
go.mod
View File

@ -1,6 +1,7 @@
module git.sr.ht/~sircmpwn/aerc2 module git.sr.ht/~sircmpwn/aerc2
require ( require (
git.sr.ht/~sircmpwn/getopt v0.0.0-20190214165041-9a4f886f9fc7
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190421201021-3184f6f13687 git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190421201021-3184f6f13687
git.sr.ht/~sircmpwn/pty v0.0.0-20190330154901-3a43678975a9 git.sr.ht/~sircmpwn/pty v0.0.0-20190330154901-3a43678975a9
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964

2
go.sum
View File

@ -1,3 +1,5 @@
git.sr.ht/~sircmpwn/getopt v0.0.0-20190214165041-9a4f886f9fc7 h1:xTFH5S/3ltiRvAtETLLDFWm5nVIouT5GeCPHm8UaVEU=
git.sr.ht/~sircmpwn/getopt v0.0.0-20190214165041-9a4f886f9fc7/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190421201021-3184f6f13687 h1:hs5EqBs82PIYXaGC14RJJpDK6jnEjM0rSdy646TFlT0= git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190421201021-3184f6f13687 h1:hs5EqBs82PIYXaGC14RJJpDK6jnEjM0rSdy646TFlT0=
git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190421201021-3184f6f13687/go.mod h1:cp37LbiS1y4CrTOmKSF87ZMLwawWUF612RYKTi8vbDc= git.sr.ht/~sircmpwn/go-libvterm v0.0.0-20190421201021-3184f6f13687/go.mod h1:cp37LbiS1y4CrTOmKSF87ZMLwawWUF612RYKTi8vbDc=
git.sr.ht/~sircmpwn/pty v0.0.0-20190330154901-3a43678975a9 h1:WWPN5lf6KzXp3xWRrPQZ4MLR3yrFEI4Ysz7HSQ1G/yo= git.sr.ht/~sircmpwn/pty v0.0.0-20190330154901-3a43678975a9 h1:WWPN5lf6KzXp3xWRrPQZ4MLR3yrFEI4Ysz7HSQ1G/yo=

View File

@ -124,6 +124,15 @@ func (c *Composer) Defaults(defaults map[string]string) *Composer {
return c return c
} }
// Note: this does not reload the editor. You must call this before the first
// Draw() call.
func (c *Composer) SetContents(reader io.Reader) *Composer {
c.email.Seek(0, os.SEEK_SET)
io.Copy(c.email, reader)
c.email.Seek(0, os.SEEK_SET)
return c
}
func (c *Composer) FocusTerminal() *Composer { func (c *Composer) FocusTerminal() *Composer {
c.focusable[c.focused].Focus(false) c.focusable[c.focused].Focus(false)
c.focused = 3 c.focused = 3