diff options
author | Elwardi <elwardifadeli@gmail.com> | 2021-07-19 11:46:29 +0100 |
---|---|---|
committer | Elwardi <elwardifadeli@gmail.com> | 2021-07-19 11:46:29 +0100 |
commit | f1ced5539a9a53ea5c8e501243377d3c74cef2d5 (patch) | |
tree | bc790f78def75b8afa40a8274d30007b05444d30 /pkg | |
parent | 77e9ee64a45bbee3f0e2367a8670b2e7d6a59c6f (diff) |
Add option to format filter matches to menuFromCommand prompts
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/config/user_config.go | 1 | ||||
-rw-r--r-- | pkg/gui/custom_commands.go | 33 |
2 files changed, 28 insertions, 6 deletions
diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go index f98bde28e..d373b74f1 100644 --- a/pkg/config/user_config.go +++ b/pkg/config/user_config.go @@ -284,6 +284,7 @@ type CustomCommandPrompt struct { // this only applies to menuFromCommand Command string `yaml:"command"` Filter string `yaml:"filter"` + Format string `yaml:"format"` } type CustomCommandMenuOption struct { diff --git a/pkg/gui/custom_commands.go b/pkg/gui/custom_commands.go index 7a70eeb95..fbe92a72f 100644 --- a/pkg/gui/custom_commands.go +++ b/pkg/gui/custom_commands.go @@ -1,10 +1,13 @@ package gui import ( + "bytes" + "errors" "log" "regexp" "strconv" "strings" + "text/template" "github.com/fatih/color" "github.com/jesseduffield/gocui" @@ -168,6 +171,10 @@ func (gui *Gui) handleCustomCommandKeybinding(customCommand config.CustomCommand if err != nil { return gui.surfaceError(err) } + reg, err := regexp.Compile(filter) + if err != nil { + return gui.surfaceError(errors.New("unable to parse filter regex, error: " + err.Error())) + } // Run and save output message, err := gui.GitCommand.RunCommandWithOutput(cmdStr) @@ -177,17 +184,31 @@ func (gui *Gui) handleCustomCommandKeybinding(customCommand config.CustomCommand // Need to make a menu out of what the cmd has displayed candidates := []string{} - reg := regexp.MustCompile(filter) + temp := template.Must(template.New("format").Parse(prompt.Format)) for _, str := range strings.Split(string(message), "\n") { - cand := "" if str == "" { continue } - for i := 1; i < (reg.NumSubexp() + 1); i++ { - keep := reg.ReplaceAllString(str, "${"+strconv.Itoa(i)+"}") - cand += keep + buff := bytes.NewBuffer(nil) + groupNames := reg.SubexpNames() + tmplData := map[string]string{} + for matchNum, match := range reg.FindAllStringSubmatch(str, -1) { + if len(match) > 0 { + for groupIdx, group := range match { + // Record matched group with group and match ids + matchName := "group_" + strconv.Itoa(groupIdx) + "_" + strconv.Itoa(matchNum) + tmplData[matchName] = group + // Record last named group non-empty matches as group matches + name := groupNames[groupIdx] + _, ok := tmplData[name] + if name != "" && group != "" && !ok { + tmplData[name] = group + } + } + } } - candidates = append(candidates, cand) + temp.Execute(buff, tmplData) + candidates = append(candidates, strings.TrimSpace(buff.String())) } menuItems := make([]*menuItem, len(candidates)) |