aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoritz Poldrack <git@moritz.sh>2023-09-01 13:40:56 +0200
committerRobin Jarry <robin@jarry.cc>2023-09-18 21:15:34 +0200
commitad159d5e9bd40dd42ce2bdbcbab30d954a3c4c0a (patch)
treef67ae66a7aec3fd6c400a31f133e716a2a1c934b
parent389d89a9362e2e782f17074331bf85bb579d7466 (diff)
downloadaerc-ad159d5e9bd40dd42ce2bdbcbab30d954a3c4c0a.tar.gz
aerc-ad159d5e9bd40dd42ce2bdbcbab30d954a3c4c0a.zip
compose: add option for LF-only editors
Some editors only support LF line endings. For these, standard compliant eml files are not an option. Add an option compose.lf-editor to translate the eml file to lf lineendings. Signed-off-by: Moritz Poldrack <git@moritz.sh> Acked-by: Robin Jarry <robin@jarry.cc> Tested-by: Matěj Cepl <mcepl@cepl.eu>
-rw-r--r--config/aerc.conf7
-rw-r--r--config/compose.go1
-rw-r--r--doc/aerc-config.5.scd7
-rw-r--r--widgets/compose.go40
4 files changed, 46 insertions, 9 deletions
diff --git a/config/aerc.conf b/config/aerc.conf
index 46b24f1c..00c8501f 100644
--- a/config/aerc.conf
+++ b/config/aerc.conf
@@ -383,6 +383,13 @@
#editor=
#
+# When set, aerc will create and read .eml files for composing that have
+# non-standard \n linebreaks. This is only relevant if the used editor does not
+# support CRLF linebreaks.
+#
+#lf-editor=false
+
+#
# Default header fields to display when composing a message. To display
# multiple headers in the same row, separate them with a pipe, e.g. "To|From".
#
diff --git a/config/compose.go b/config/compose.go
index 37e46f96..463723cf 100644
--- a/config/compose.go
+++ b/config/compose.go
@@ -17,6 +17,7 @@ type ComposeConfig struct {
FilePickerCmd string `ini:"file-picker-cmd"`
FormatFlowed bool `ini:"format-flowed"`
EditHeaders bool `ini:"edit-headers"`
+ LFEditor bool `ini:"lf-editor"`
}
var Compose = new(ComposeConfig)
diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd
index b09ce53e..3f0b076a 100644
--- a/doc/aerc-config.5.scd
+++ b/doc/aerc-config.5.scd
@@ -615,6 +615,13 @@ These options are configured in the *[compose]* section of _aerc.conf_.
Default: _false_
+*lf-editor* = _true_|_false_
+ When set, aerc will create and read .eml files for composing that have
+ non-standard \n linebreaks. This is only relevant if the used editor
+ does not support CRLF linebreaks.
+
+ Default: _false_
+
# MULTIPART CONVERTERS
Converters allow generating _multipart/alternative_ messages by converting the
diff --git a/widgets/compose.go b/widgets/compose.go
index f7bce6d4..1c0aaab5 100644
--- a/widgets/compose.go
+++ b/widgets/compose.go
@@ -462,11 +462,18 @@ func (c *Composer) updateCrypto() error {
return nil
}
-func (c *Composer) writeCRLF(reader io.Reader) error {
- // .eml files must always use '\r\n' line endings
+func (c *Composer) writeEml(reader io.Reader) error {
+ // .eml files must always use '\r\n' line endings, but some editors
+ // don't support these, so if they are using one of those, the
+ // line-endings are transformed
+ lineEnding := "\r\n"
+ if config.Compose.LFEditor {
+ lineEnding = "\n"
+ }
+
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
- _, err := c.email.WriteString(scanner.Text() + "\r\n")
+ _, err := c.email.WriteString(scanner.Text() + lineEnding)
if err != nil {
return err
}
@@ -488,6 +495,11 @@ func (c *Composer) setContents(reader io.Reader) error {
if err != nil {
return err
}
+ lineEnding := "\r\n"
+ if config.Compose.LFEditor {
+ lineEnding = "\n"
+ }
+
if c.editHeaders {
for _, h := range c.headerOrder() {
var value string
@@ -506,7 +518,7 @@ func (c *Composer) setContents(reader io.Reader) error {
for _, a := range addresses {
addr = append(addr, format.AddressForHumans(a))
}
- value = strings.Join(addr, ",\r\n\t")
+ value = strings.Join(addr, ","+lineEnding+"\t")
}
default:
value, err = c.header.Text(h)
@@ -516,17 +528,17 @@ func (c *Composer) setContents(reader io.Reader) error {
}
}
key := textproto.CanonicalMIMEHeaderKey(h)
- _, err = fmt.Fprintf(c.email, "%s: %s\r\n", key, value)
+ _, err = fmt.Fprintf(c.email, "%s: %s"+lineEnding, key, value)
if err != nil {
return err
}
}
- _, err = c.email.WriteString("\r\n")
+ _, err = c.email.WriteString(lineEnding)
if err != nil {
return err
}
}
- return c.writeCRLF(reader)
+ return c.writeEml(reader)
}
func (c *Composer) appendContents(reader io.Reader) error {
@@ -534,7 +546,7 @@ func (c *Composer) appendContents(reader io.Reader) error {
if err != nil {
return err
}
- return c.writeCRLF(reader)
+ return c.writeEml(reader)
}
func (c *Composer) AppendPart(mimetype string, params map[string]string, body io.Reader) error {
@@ -904,7 +916,17 @@ func (c *Composer) parseEmbeddedHeader() (*mail.Header, error) {
if err != nil {
return nil, errors.Wrap(err, "Seek")
}
- msg, err := mail.CreateReader(c.email)
+
+ buf := bytes.NewBuffer([]byte{})
+ _, err = io.Copy(buf, c.email)
+ if err != nil {
+ return nil, fmt.Errorf("mail.ReadMessageCopy: %w", err)
+ }
+ if config.Compose.LFEditor {
+ bytes.ReplaceAll(buf.Bytes(), []byte{'\n'}, []byte{'\r', '\n'})
+ }
+
+ msg, err := mail.CreateReader(buf)
if errors.Is(err, io.EOF) { // completely empty
h := mail.HeaderFromMap(make(map[string][]string))
return &h, nil