diff options
Diffstat (limited to 'commands/commands.go')
-rw-r--r-- | commands/commands.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/commands/commands.go b/commands/commands.go index f50a1e8a..c6f95aaa 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -141,6 +141,58 @@ func (cmds *Commands) ExecuteCommand( return NoSuchCommand(args[0]) } +func GetTemplateCompletion( + aerc *widgets.Aerc, cmd string, +) ([]string, string, bool) { + args, err := splitCmd(cmd) + if err != nil || len(args) == 0 { + return nil, "", false + } + + countLeft := strings.Count(cmd, "{{") + if countLeft == 0 { + return nil, "", false + } + countRight := strings.Count(cmd, "}}") + + switch { + case countLeft > countRight: + // complete template terms + var i int + for i = len(cmd) - 1; i >= 0; i-- { + if strings.ContainsRune("{()| ", rune(cmd[i])) { + break + } + } + search, prefix := cmd[i+1:], cmd[:i+1] + padding := strings.Repeat(" ", + len(search)-len(strings.TrimLeft(search, " "))) + options := FilterList( + templates.Terms(), + strings.TrimSpace(search), + "", + aerc.SelectedAccountUiConfig().FuzzyComplete, + ) + return options, prefix + padding, true + case countLeft == countRight: + // expand template + data := templateData(aerc, nil, nil) + t, err := templates.ParseTemplate("", cmd) + if err != nil { + log.Warnf("template parsing failed: %v", err) + return nil, "", false + } + var sb strings.Builder + if err = templates.Render(t, &sb, data); err != nil { + log.Warnf("template rendering failed: %v", err) + return nil, "", false + } + return []string{sb.String()}, "", true + } + + return nil, "", false +} + // GetCompletions returns the completion options and the command prefix func (cmds *Commands) GetCompletions( aerc *widgets.Aerc, cmd string, |