From 00263bf8668130abb4aa5ac3383aeb9865e71328 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 21 Dec 2019 16:21:27 +0100 Subject: [PATCH] modify-labels: add completion --- commands/commands.go | 35 +++++++++++++++++++++++++++++++++++ commands/msg/modify-labels.go | 3 ++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/commands/commands.go b/commands/commands.go index 1e86118..39720bf 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -2,6 +2,7 @@ package commands import ( "errors" + "fmt" "sort" "strings" "unicode" @@ -127,6 +128,40 @@ func GetFolders(aerc *widgets.Aerc, args []string) []string { return out } +func GetLabels(aerc *widgets.Aerc, args []string) []string { + if len(args) == 0 { + return aerc.SelectedAccount().Labels() + } + + // + and - are used to denote tag addition / removal and need to be striped + // only the last tag should be completed, so that multiple labels can be + // selected + last := args[len(args)-1] + others := strings.Join(args[:len(args)-1], " ") + var prefix string + switch last[0] { + case '+': + prefix = "+" + case '-': + prefix = "-" + default: + prefix = "" + } + trimmed := strings.TrimLeft(last, "+-") + + out := make([]string, 0) + for _, label := range aerc.SelectedAccount().Labels() { + if hasCaseSmartPrefix(label, trimmed) { + var prev string + if len(others) > 0 { + prev = others + " " + } + out = append(out, fmt.Sprintf("%v%v%v", prev, prefix, label)) + } + } + return out +} + // hasCaseSmartPrefix checks whether s starts with prefix, using a case // sensitive match if and only if prefix contains upper case letters. func hasCaseSmartPrefix(s, prefix string) bool { diff --git a/commands/msg/modify-labels.go b/commands/msg/modify-labels.go index a18fc15..a53292e 100644 --- a/commands/msg/modify-labels.go +++ b/commands/msg/modify-labels.go @@ -4,6 +4,7 @@ import ( "errors" "time" + "git.sr.ht/~sircmpwn/aerc/commands" "git.sr.ht/~sircmpwn/aerc/widgets" "git.sr.ht/~sircmpwn/aerc/worker/types" "github.com/gdamore/tcell" @@ -20,7 +21,7 @@ func (ModifyLabels) Aliases() []string { } func (ModifyLabels) Complete(aerc *widgets.Aerc, args []string) []string { - return nil + return commands.GetLabels(aerc, args) } func (ModifyLabels) Execute(aerc *widgets.Aerc, args []string) error {