Implement :reply -q and :reply -a
This commit is contained in:
parent
475b697bdf
commit
8be59cae6c
4 changed files with 73 additions and 19 deletions
|
@ -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
1
go.mod
|
@ -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
2
go.sum
|
@ -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=
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue