~rjarry/aerc

e78540990496cb3f4ff611c680b005022d9d2fad — Tim Culverhouse a month ago 7aa71d3
binds: add folder context for message list binds

Add option to specify folder-specific binds for message lists. The binds
are layered: any existing binds in [messages] are overwritten by a more
specific bind in say, [messages:folder=Drafts]. The order is currently:

[messages] < [messages:account=<account>] < [messages:folder=<folder>]

Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry <robin@jarry.cc>
3 files changed, 17 insertions(+), 1 deletions(-)

M config/config.go
M doc/aerc-config.5.scd
M widgets/aerc.go
M config/config.go => config/config.go +5 -0
@@ 72,6 72,7 @@ const (
	UI_CONTEXT_ACCOUNT
	UI_CONTEXT_SUBJECT
	BIND_CONTEXT_ACCOUNT
	BIND_CONTEXT_FOLDER
)

type UIConfigContext struct {


@@ 910,6 911,10 @@ func (config *AercConfig) LoadBinds(binds *ini.File, baseName string, baseGroup 
				continue
			}
			contextualBind.ContextType = BIND_CONTEXT_ACCOUNT
		case "folder":
			// No validation needed. If the folder doesn't exist, the binds
			// never get used
			contextualBind.ContextType = BIND_CONTEXT_FOLDER
		default:
			return fmt.Errorf("Unknown Context Bind Section: %s", sectionName)
		}

M doc/aerc-config.5.scd => doc/aerc-config.5.scd +10 -0
@@ 701,12 701,22 @@ You may also configure account specific key bindings for each context:
	keybindings for this context and account, where <AccountName> matches
	the account name you provided in *accounts.conf*.

Folder-specific bindings can be configured for message lists:

*[messages:folder=<FolderName>]*
	keybindings under this section will be specific to the folder named
	<FolderName>. Keybindings from a *folder* specifier will take precedence
	over *account* specifiers

Example:
```
[messages:account=Mailbox]
c = :cf path:mailbox/** and<space>

[compose::editor:account=Mailbox2]

[messages:folder=Drafts]
<Enter> = :recall<Enter>
...
```


M widgets/aerc.go => widgets/aerc.go +2 -1
@@ 194,7 194,8 @@ func (aerc *Aerc) getBindings() *config.KeyBindings {
	}
	switch view := aerc.SelectedTab().(type) {
	case *AccountView:
		return aerc.conf.MergeContextualBinds(aerc.conf.Bindings.MessageList, config.BIND_CONTEXT_ACCOUNT, selectedAccountName, "messages")
		binds := aerc.conf.MergeContextualBinds(aerc.conf.Bindings.MessageList, config.BIND_CONTEXT_ACCOUNT, selectedAccountName, "messages")
		return aerc.conf.MergeContextualBinds(binds, config.BIND_CONTEXT_FOLDER, view.SelectedDirectory(), "messages")
	case *AccountWizard:
		return aerc.conf.Bindings.AccountWizard
	case *Composer: