Add distinct keybindings for each compose view

This commit is contained in:
Drew DeVault 2019-05-14 14:27:28 -04:00
parent 928ac1bcd9
commit f77d7c2c3d
6 changed files with 51 additions and 14 deletions

View File

@ -17,7 +17,7 @@ import (
) )
func init() { func init() {
register("send-message", SendMessage) register("send", SendMessage)
} }
func SendMessage(aerc *widgets.Aerc, args []string) error { func SendMessage(aerc *widgets.Aerc, args []string) error {

View File

@ -283,7 +283,7 @@ func init() {
keyNames["ACK"] = KeyStroke{tcell.KeyACK, 0} keyNames["ACK"] = KeyStroke{tcell.KeyACK, 0}
keyNames["BEL"] = KeyStroke{tcell.KeyBEL, 0} keyNames["BEL"] = KeyStroke{tcell.KeyBEL, 0}
keyNames["BS"] = KeyStroke{tcell.KeyBS, 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["LF"] = KeyStroke{tcell.KeyLF, 0}
keyNames["VT"] = KeyStroke{tcell.KeyVT, 0} keyNames["VT"] = KeyStroke{tcell.KeyVT, 0}
keyNames["FF"] = KeyStroke{tcell.KeyFF, 0} keyNames["FF"] = KeyStroke{tcell.KeyFF, 0}

View File

@ -40,6 +40,14 @@ a = :reply -a<Enter>
f = :forward<Enter> f = :forward<Enter>
[compose] [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 $noinherit = true
$ex = <semicolon> $ex = <semicolon>
<C-k> = :prev-field<Enter> <C-k> = :prev-field<Enter>
@ -47,6 +55,11 @@ $ex = <semicolon>
<C-p> = :prev-tab<Enter> <C-p> = :prev-tab<Enter>
<C-n> = :next-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] [terminal]
$noinherit = true $noinherit = true
$ex = <semicolon> $ex = <semicolon>

View File

@ -39,11 +39,13 @@ type AccountConfig struct {
} }
type BindingConfig struct { type BindingConfig struct {
Global *KeyBindings Global *KeyBindings
Compose *KeyBindings Compose *KeyBindings
MessageList *KeyBindings ComposeEditor *KeyBindings
MessageView *KeyBindings ComposeReview *KeyBindings
Terminal *KeyBindings MessageList *KeyBindings
MessageView *KeyBindings
Terminal *KeyBindings
} }
type FilterConfig struct { type FilterConfig struct {
@ -139,11 +141,13 @@ func LoadConfig(root *string) (*AercConfig, error) {
file.NameMapper = mapName file.NameMapper = mapName
config := &AercConfig{ config := &AercConfig{
Bindings: BindingConfig{ Bindings: BindingConfig{
Global: NewKeyBindings(), Global: NewKeyBindings(),
Compose: NewKeyBindings(), Compose: NewKeyBindings(),
MessageList: NewKeyBindings(), ComposeEditor: NewKeyBindings(),
MessageView: NewKeyBindings(), ComposeReview: NewKeyBindings(),
Terminal: NewKeyBindings(), MessageList: NewKeyBindings(),
MessageView: NewKeyBindings(),
Terminal: NewKeyBindings(),
}, },
Ini: file, Ini: file,
@ -223,6 +227,9 @@ func LoadConfig(root *string) (*AercConfig, error) {
"messages": &config.Bindings.MessageList, "messages": &config.Bindings.MessageList,
"terminal": &config.Bindings.Terminal, "terminal": &config.Bindings.Terminal,
"view": &config.Bindings.MessageView, "view": &config.Bindings.MessageView,
"compose::editor": &config.Bindings.ComposeEditor,
"compose::review": &config.Bindings.ComposeReview,
} }
for _, name := range binds.SectionStrings() { for _, name := range binds.SectionStrings() {
sec, err := binds.GetSection(name) sec, err := binds.GetSection(name)

View File

@ -88,11 +88,18 @@ func (aerc *Aerc) Draw(ctx *libui.Context) {
} }
func (aerc *Aerc) getBindings() *config.KeyBindings { func (aerc *Aerc) getBindings() *config.KeyBindings {
switch aerc.SelectedTab().(type) { switch view := aerc.SelectedTab().(type) {
case *AccountView: case *AccountView:
return aerc.conf.Bindings.MessageList return aerc.conf.Bindings.MessageList
case *Composer: 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: case *MessageViewer:
return aerc.conf.Bindings.MessageView return aerc.conf.Bindings.MessageView
case *Terminal: case *Terminal:

View File

@ -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 { func (c *Composer) Event(event tcell.Event) bool {
return c.focusable[c.focused].Event(event) return c.focusable[c.focused].Event(event)
} }