~sircmpwn/aerc

f77d7c2c3d578ae5a724e1e8b91656304dde75d0 — Drew DeVault 1 year, 6 months ago 928ac1b
Add distinct keybindings for each compose view
6 files changed, 51 insertions(+), 14 deletions(-)

R commands/compose/{send-message.go => send.go}
M config/bindings.go
M config/binds.conf
M config/config.go
M widgets/aerc.go
M widgets/compose.go
R commands/compose/send-message.go => commands/compose/send.go +1 -1
@@ 17,7 17,7 @@ import (
)

func init() {
	register("send-message", SendMessage)
	register("send", SendMessage)
}

func SendMessage(aerc *widgets.Aerc, args []string) error {

M config/bindings.go => config/bindings.go +1 -1
@@ 283,7 283,7 @@ func init() {
	keyNames["ACK"] = KeyStroke{tcell.KeyACK, 0}
	keyNames["BEL"] = KeyStroke{tcell.KeyBEL, 0}
	keyNames["BS"] = KeyStroke{tcell.KeyBS, 0}
	keyNames["TAB"] = KeyStroke{tcell.KeyTAB, 0}
	keyNames["tab"] = KeyStroke{tcell.KeyTAB, 0}
	keyNames["LF"] = KeyStroke{tcell.KeyLF, 0}
	keyNames["VT"] = KeyStroke{tcell.KeyVT, 0}
	keyNames["FF"] = KeyStroke{tcell.KeyFF, 0}

M config/binds.conf => config/binds.conf +13 -0
@@ 40,6 40,14 @@ a = :reply -a<Enter>
f = :forward<Enter>

[compose]
# Keybindings used when the embedded terminal is not selected in the compose
# view
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<tab> = :next-field<Enter>

[compose::editor]
# Keybindings used when the embedded terminal is selected in the compose view
$noinherit = true
$ex = <semicolon>
<C-k> = :prev-field<Enter>


@@ 47,6 55,11 @@ $ex = <semicolon>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>

[compose::review]
# Keybindings used when reviewing a message to be sent
y = :send<Enter>
n = :abort<Enter>

[terminal]
$noinherit = true
$ex = <semicolon>

M config/config.go => config/config.go +17 -10
@@ 39,11 39,13 @@ type AccountConfig struct {
}

type BindingConfig struct {
	Global      *KeyBindings
	Compose     *KeyBindings
	MessageList *KeyBindings
	MessageView *KeyBindings
	Terminal    *KeyBindings
	Global        *KeyBindings
	Compose       *KeyBindings
	ComposeEditor *KeyBindings
	ComposeReview *KeyBindings
	MessageList   *KeyBindings
	MessageView   *KeyBindings
	Terminal      *KeyBindings
}

type FilterConfig struct {


@@ 139,11 141,13 @@ func LoadConfig(root *string) (*AercConfig, error) {
	file.NameMapper = mapName
	config := &AercConfig{
		Bindings: BindingConfig{
			Global:      NewKeyBindings(),
			Compose:     NewKeyBindings(),
			MessageList: NewKeyBindings(),
			MessageView: NewKeyBindings(),
			Terminal:    NewKeyBindings(),
			Global:        NewKeyBindings(),
			Compose:       NewKeyBindings(),
			ComposeEditor: NewKeyBindings(),
			ComposeReview: NewKeyBindings(),
			MessageList:   NewKeyBindings(),
			MessageView:   NewKeyBindings(),
			Terminal:      NewKeyBindings(),
		},
		Ini: file,



@@ 223,6 227,9 @@ func LoadConfig(root *string) (*AercConfig, error) {
		"messages": &config.Bindings.MessageList,
		"terminal": &config.Bindings.Terminal,
		"view":     &config.Bindings.MessageView,

		"compose::editor": &config.Bindings.ComposeEditor,
		"compose::review": &config.Bindings.ComposeReview,
	}
	for _, name := range binds.SectionStrings() {
		sec, err := binds.GetSection(name)

M widgets/aerc.go => widgets/aerc.go +9 -2
@@ 88,11 88,18 @@ func (aerc *Aerc) Draw(ctx *libui.Context) {
}

func (aerc *Aerc) getBindings() *config.KeyBindings {
	switch aerc.SelectedTab().(type) {
	switch view := aerc.SelectedTab().(type) {
	case *AccountView:
		return aerc.conf.Bindings.MessageList
	case *Composer:
		return aerc.conf.Bindings.Compose
		switch view.Bindings() {
		case "compose::editor":
			return aerc.conf.Bindings.ComposeEditor
		case "compose::review":
			return aerc.conf.Bindings.ComposeReview
		default:
			return aerc.conf.Bindings.Compose
		}
	case *MessageViewer:
		return aerc.conf.Bindings.MessageView
	case *Terminal:

M widgets/compose.go => widgets/compose.go +10 -0
@@ 120,6 120,16 @@ func (c *Composer) Close() {
	}
}

func (c *Composer) Bindings() string {
	if c.editor == nil {
		return "compose::review"
	} else if c.editor == c.focusable[c.focused] {
		return "compose::editor"
	} else {
		return "compose"
	}
}

func (c *Composer) Event(event tcell.Event) bool {
	return c.focusable[c.focused].Event(event)
}