summaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorElwardi <elwardifadeli@gmail.com>2021-07-19 11:46:29 +0100
committerElwardi <elwardifadeli@gmail.com>2021-07-19 11:46:29 +0100
commitf1ced5539a9a53ea5c8e501243377d3c74cef2d5 (patch)
treebc790f78def75b8afa40a8274d30007b05444d30 /pkg
parent77e9ee64a45bbee3f0e2367a8670b2e7d6a59c6f (diff)
Add option to format filter matches to menuFromCommand prompts
Diffstat (limited to 'pkg')
-rw-r--r--pkg/config/user_config.go1
-rw-r--r--pkg/gui/custom_commands.go33
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))