summaryrefslogtreecommitdiffstats
path: root/pkg/gui/custom_commands.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gui/custom_commands.go')
-rw-r--r--pkg/gui/custom_commands.go33
1 files changed, 27 insertions, 6 deletions
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))