diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2023-05-29 22:46:18 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2023-05-29 22:47:35 +1000 |
commit | 036a1ea519885ae9962c0ba2d90f642874cabd89 (patch) | |
tree | 9c8849aa2e172a3be2d35eb016248035ff80ecf1 /pkg/gui/services | |
parent | 29c738a88b992bf1ddeb16864767a433e3c464e3 (diff) |
Support suggestions generated from command in custom commands
This changes the interface a bit but it was only added earlier today so I doubt anybody is dependent on it yet.
I'm also updating the docs.
Diffstat (limited to 'pkg/gui/services')
-rw-r--r-- | pkg/gui/services/custom_commands/handler_creator.go | 62 | ||||
-rw-r--r-- | pkg/gui/services/custom_commands/resolver.go | 7 |
2 files changed, 53 insertions, 16 deletions
diff --git a/pkg/gui/services/custom_commands/handler_creator.go b/pkg/gui/services/custom_commands/handler_creator.go index 2d13a6f55..8e6700f72 100644 --- a/pkg/gui/services/custom_commands/handler_creator.go +++ b/pkg/gui/services/custom_commands/handler_creator.go @@ -11,6 +11,7 @@ import ( "github.com/jesseduffield/lazygit/pkg/gui/style" "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/samber/lo" ) // takes a custom command and returns a function that will be called when the corresponding user-defined keybinding is pressed @@ -108,13 +109,9 @@ func (self *HandlerCreator) call(customCommand config.CustomCommand) func() erro } func (self *HandlerCreator) inputPrompt(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error { - var findSuggestionsFn func(string) []*types.Suggestion - if prompt.SuggestionsPreset != "" { - var err error - findSuggestionsFn, err = self.getPresetSuggestionsFn(prompt.SuggestionsPreset) - if err != nil { - return err - } + findSuggestionsFn, err := self.generateFindSuggestionsFunc(prompt) + if err != nil { + return self.c.Error(err) } return self.c.Prompt(types.PromptOpts{ @@ -127,6 +124,41 @@ func (self *HandlerCreator) inputPrompt(prompt *config.CustomCommandPrompt, wrap }) } +func (self *HandlerCreator) generateFindSuggestionsFunc(prompt *config.CustomCommandPrompt) (func(string) []*types.Suggestion, error) { + if prompt.Suggestions.Preset != "" && prompt.Suggestions.Command != "" { + return nil, fmt.Errorf( + fmt.Sprintf( + "Custom command prompt cannot have both a preset and a command for suggestions. Preset: '%s', Command: '%s'", + prompt.Suggestions.Preset, + prompt.Suggestions.Command, + ), + ) + } else if prompt.Suggestions.Preset != "" { + return self.getPresetSuggestionsFn(prompt.Suggestions.Preset) + } else if prompt.Suggestions.Command != "" { + return self.getCommandSuggestionsFn(prompt.Suggestions.Command) + } + + return nil, nil +} + +func (self *HandlerCreator) getCommandSuggestionsFn(command string) (func(string) []*types.Suggestion, error) { + lines := []*types.Suggestion{} + err := self.c.OS().Cmd.NewShell(command).RunAndProcessLines(func(line string) (bool, error) { + lines = append(lines, &types.Suggestion{Value: line, Label: line}) + return false, nil + }) + if err != nil { + return nil, err + } + + return func(currentWord string) []*types.Suggestion { + return lo.Filter(lines, func(suggestion *types.Suggestion, _ int) bool { + return strings.Contains(strings.ToLower(suggestion.Value), strings.ToLower(currentWord)) + }) + }, nil +} + func (self *HandlerCreator) getPresetSuggestionsFn(preset string) (func(string) []*types.Suggestion, error) { switch preset { case "files": @@ -144,6 +176,14 @@ func (self *HandlerCreator) getPresetSuggestionsFn(preset string) (func(string) } } +func (self *HandlerCreator) confirmPrompt(prompt *config.CustomCommandPrompt, handleConfirm func() error) error { + return self.c.Confirm(types.ConfirmOpts{ + Title: prompt.Title, + Prompt: prompt.Body, + HandleConfirm: handleConfirm, + }) +} + func (self *HandlerCreator) menuPrompt(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error { menuItems := slices.Map(prompt.Options, func(option config.CustomCommandMenuOption) *types.MenuItem { return &types.MenuItem{ @@ -157,14 +197,6 @@ func (self *HandlerCreator) menuPrompt(prompt *config.CustomCommandPrompt, wrapp return self.c.Menu(types.CreateMenuOptions{Title: prompt.Title, Items: menuItems}) } -func (self *HandlerCreator) confirmPrompt(prompt *config.CustomCommandPrompt, handleConfirm func() error) error { - return self.c.Confirm(types.ConfirmOpts{ - Title: prompt.Title, - Prompt: prompt.Body, - HandleConfirm: handleConfirm, - }) -} - func (self *HandlerCreator) menuPromptFromCommand(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error { // Run and save output message, err := self.c.Git().Custom.RunWithOutput(prompt.Command) diff --git a/pkg/gui/services/custom_commands/resolver.go b/pkg/gui/services/custom_commands/resolver.go index 119581bfc..67dd7be2d 100644 --- a/pkg/gui/services/custom_commands/resolver.go +++ b/pkg/gui/services/custom_commands/resolver.go @@ -34,7 +34,12 @@ func (self *Resolver) resolvePrompt( return nil, err } - result.SuggestionsPreset, err = resolveTemplate(prompt.SuggestionsPreset) + result.Suggestions.Preset, err = resolveTemplate(prompt.Suggestions.Preset) + if err != nil { + return nil, err + } + + result.Suggestions.Command, err = resolveTemplate(prompt.Suggestions.Command) if err != nil { return nil, err } |