summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--commands/account/compose.go2
-rw-r--r--config/aerc.conf7
-rw-r--r--config/config.go10
-rw-r--r--widgets/compose.go17
4 files changed, 30 insertions, 6 deletions
diff --git a/commands/account/compose.go b/commands/account/compose.go
index c9be17a..10be9ae 100644
--- a/commands/account/compose.go
+++ b/commands/account/compose.go
@@ -18,7 +18,7 @@ func Compose(aerc *widgets.Aerc, args []string) error {
 		return errors.New("Usage: compose")
 	}
 	acct := aerc.SelectedAccount()
-	composer := widgets.NewComposer(acct.AccountConfig())
+	composer := widgets.NewComposer(aerc.Config(), acct.AccountConfig())
 	// TODO: Change tab name when message subject changes
 	aerc.NewTab(composer, runewidth.Truncate(
 		"New email", 32, "…"))
diff --git a/config/aerc.conf b/config/aerc.conf
index 8b3ac3a..1211764 100644
--- a/config/aerc.conf
+++ b/config/aerc.conf
@@ -57,6 +57,13 @@ pager=less -R
 # Default: text/plain,text/html
 alternatives=text/plain,text/html
 
+[compose]
+#
+# Specifies the command to run the editor with. It will be shown in an embedded
+# terminal, though it may also launch a graphical window if the environment
+# supports it. Defaults to $EDITOR, or vi.
+editor=
+
 [filters]
 #
 # Filters allow you to pipe an email body through a shell command to render
diff --git a/config/config.go b/config/config.go
index 5c5094a..8926fcd 100644
--- a/config/config.go
+++ b/config/config.go
@@ -48,6 +48,10 @@ type BindingConfig struct {
 	Terminal      *KeyBindings
 }
 
+type ComposeConfig struct {
+	Editor string `ini:"editor"`
+}
+
 type FilterConfig struct {
 	FilterType int
 	Filter     string
@@ -63,6 +67,7 @@ type ViewerConfig struct {
 
 type AercConfig struct {
 	Bindings BindingConfig
+	Compose  ComposeConfig
 	Ini      *ini.File       `ini:"-"`
 	Accounts []AccountConfig `ini:"-"`
 	Filters  []FilterConfig  `ini:"-"`
@@ -206,6 +211,11 @@ func LoadConfig(root *string) (*AercConfig, error) {
 			}
 		}
 	}
+	if compose, err := file.GetSection("compose"); err == nil {
+		if err := compose.MapTo(&config.Compose); err != nil {
+			return nil, err
+		}
+	}
 	if ui, err := file.GetSection("ui"); err == nil {
 		if err := ui.MapTo(&config.Ui); err != nil {
 			return nil, err
diff --git a/widgets/compose.go b/widgets/compose.go
index 2daa29c..9460397 100644
--- a/widgets/compose.go
+++ b/widgets/compose.go
@@ -36,7 +36,8 @@ type Composer struct {
 }
 
 // TODO: Let caller configure headers, initial body (for replies), etc
-func NewComposer(conf *config.AccountConfig) *Composer {
+func NewComposer(conf *config.AercConfig,
+	acct *config.AccountConfig) *Composer {
 	grid := ui.NewGrid().Rows([]ui.GridSpec{
 		{ui.SIZE_EXACT, 3},
 		{ui.SIZE_WEIGHT, 1},
@@ -55,7 +56,7 @@ func NewComposer(conf *config.AccountConfig) *Composer {
 	})
 
 	to := newHeaderEditor("To", "")
-	from := newHeaderEditor("From", conf.From)
+	from := newHeaderEditor("From", acct.From)
 	subject := newHeaderEditor("Subject", "")
 	headers.AddChild(to).At(0, 0)
 	headers.AddChild(from).At(0, 1)
@@ -68,15 +69,21 @@ func NewComposer(conf *config.AccountConfig) *Composer {
 		return nil
 	}
 
-	// TODO: built-in config option, $EDITOR, then vi, in that order
-	editor := exec.Command("vim", email.Name())
+	editorName := conf.Compose.Editor
+	if editorName == "" {
+		editorName = os.Getenv("EDITOR")
+	}
+	if editorName == "" {
+		editorName = "vi"
+	}
+	editor := exec.Command(editorName, email.Name())
 	term, _ := NewTerminal(editor)
 
 	grid.AddChild(headers).At(0, 0)
 	grid.AddChild(term).At(1, 0)
 
 	c := &Composer{
-		config: conf,
+		config: acct,
 		editor: term,
 		email:  email,
 		grid:   grid,