mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-05-10 20:05:50 +02:00
feat: add confirm prompt for custom keybindings
- Supports configuring a custom confirmation prompt via `config.yml` for custom keybindings. A new `CustomCommandPrompt.Body` field is used to store the immutable body text of the confirmation popup. - Adds a sample 'confirm' prompt to the example `config.yml`. - Updates the `Prompts` section of the documentation to include 'confirm' prompt type and also describe which fields pertain to it (i.e. `initialValue`). Closes: https://github.com/jesseduffield/lazygit/issues/1858 Signed-off-by: Michael Mead <mmead.developer@gmail.com>
This commit is contained in:
parent
582b1991a4
commit
9d304098bb
4 changed files with 38 additions and 10 deletions
|
@ -49,6 +49,13 @@ customCommands:
|
||||||
filter: '.*{{index .PromptResponses 0}}/(?P<branch>.*)'
|
filter: '.*{{index .PromptResponses 0}}/(?P<branch>.*)'
|
||||||
valueFormat: '{{ .branch }}'
|
valueFormat: '{{ .branch }}'
|
||||||
labelFormat: '{{ .branch | green }}'
|
labelFormat: '{{ .branch | green }}'
|
||||||
|
- key: '<f1>'
|
||||||
|
command: 'git reset --soft {{.CheckedOutBranch.UpstreamRemote}}'
|
||||||
|
context: 'files'
|
||||||
|
prompts:
|
||||||
|
- type: 'confirm'
|
||||||
|
title: "Confirm:"
|
||||||
|
body: "Are you sure you want to reset HEAD to {{.CheckedOutBranch.UpstreamRemote}}?"
|
||||||
```
|
```
|
||||||
|
|
||||||
Looking at the command assigned to the 'n' key, here's what the result looks like:
|
Looking at the command assigned to the 'n' key, here's what the result looks like:
|
||||||
|
@ -94,14 +101,15 @@ The permitted contexts are:
|
||||||
|
|
||||||
The permitted prompt fields are:
|
The permitted prompt fields are:
|
||||||
|
|
||||||
| _field_ | _description_ | _required_ |
|
| _field_ | _description_ | _required_ |
|
||||||
| ------------ | -------------------------------------------------------------------------------- | ---------- |
|
| ------------ | -----------------------------------------------------------------------------------------------| ---------- |
|
||||||
| type | one of 'input' or 'menu' | yes |
|
| type | one of 'input', 'menu', or 'confirm' | yes |
|
||||||
| title | the title to display in the popup panel | no |
|
| title | the title to display in the popup panel | no |
|
||||||
| initialValue | (only applicable to 'input' prompts) the initial value to appear in the text box | no |
|
| initialValue | (only applicable to 'input' prompts) the initial value to appear in the text box | no |
|
||||||
| options | (only applicable to 'menu' prompts) the options to display in the menu | no |
|
| body | (only applicable to 'confirm' prompts) the immutable body text to appear in the text box | no |
|
||||||
| command | (only applicable to 'menuFromCommand' prompts) the command to run to generate | yes |
|
| options | (only applicable to 'menu' prompts) the options to display in the menu | no |
|
||||||
| | menu options | |
|
| command | (only applicable to 'menuFromCommand' prompts) the command to run to generate | yes |
|
||||||
|
| | menu options | |
|
||||||
| filter | (only applicable to 'menuFromCommand' prompts) the regexp to run specifying groups which are going to be kept from the command's output | yes |
|
| filter | (only applicable to 'menuFromCommand' prompts) the regexp to run specifying groups which are going to be kept from the command's output | yes |
|
||||||
| valueFormat | (only applicable to 'menuFromCommand' prompts) how to format matched groups from the filter to construct a menu item's value (What gets appended to prompt responses when the item is selected). You can use named groups, or `{{ .group_GROUPID }}`. PS: named groups keep first match only | yes |
|
| valueFormat | (only applicable to 'menuFromCommand' prompts) how to format matched groups from the filter to construct a menu item's value (What gets appended to prompt responses when the item is selected). You can use named groups, or `{{ .group_GROUPID }}`. PS: named groups keep first match only | yes |
|
||||||
| labelFormat | (only applicable to 'menuFromCommand' prompts) how to format matched groups from the filter to construct the item's label (What's shown on screen). You can use named groups, or `{{ .group_GROUPID }}`. You can also color each match with `{{ .group_GROUPID \| colorname }}` (Color names from [here](https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md)). If `labelFormat` is not specified, `valueFormat` is shown instead. PS: named groups keep first match only | no |
|
| labelFormat | (only applicable to 'menuFromCommand' prompts) how to format matched groups from the filter to construct the item's label (What's shown on screen). You can use named groups, or `{{ .group_GROUPID }}`. You can also color each match with `{{ .group_GROUPID \| colorname }}` (Color names from [here](https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md)). If `labelFormat` is not specified, `valueFormat` is shown instead. PS: named groups keep first match only | no |
|
||||||
|
|
|
@ -313,12 +313,15 @@ type CustomCommand struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type CustomCommandPrompt struct {
|
type CustomCommandPrompt struct {
|
||||||
Type string `yaml:"type"` // one of 'input' and 'menu'
|
Type string `yaml:"type"` // one of 'input', 'menu', or 'confirm'
|
||||||
Title string `yaml:"title"`
|
Title string `yaml:"title"`
|
||||||
|
|
||||||
// this only apply to prompts
|
// this only apply to prompts
|
||||||
InitialValue string `yaml:"initialValue"`
|
InitialValue string `yaml:"initialValue"`
|
||||||
|
|
||||||
|
// this only applies to confirm prompts
|
||||||
|
Body string `yaml:"body"`
|
||||||
|
|
||||||
// this only applies to menus
|
// this only applies to menus
|
||||||
Options []CustomCommandMenuOption
|
Options []CustomCommandMenuOption
|
||||||
|
|
||||||
|
|
|
@ -80,8 +80,12 @@ func (self *HandlerCreator) call(customCommand config.CustomCommand) func() erro
|
||||||
f = func() error {
|
f = func() error {
|
||||||
return self.menuPromptFromCommand(resolvedPrompt, wrappedF)
|
return self.menuPromptFromCommand(resolvedPrompt, wrappedF)
|
||||||
}
|
}
|
||||||
|
case "confirm":
|
||||||
|
f = func() error {
|
||||||
|
return self.confirmPrompt(resolvedPrompt, g)
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return self.c.ErrorMsg("custom command prompt must have a type of 'input', 'menu' or 'menuFromCommand'")
|
return self.c.ErrorMsg("custom command prompt must have a type of 'input', 'menu', 'menuFromCommand', or 'confirm'")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,6 +116,14 @@ func (self *HandlerCreator) menuPrompt(prompt *config.CustomCommandPrompt, wrapp
|
||||||
return self.c.Menu(types.CreateMenuOptions{Title: prompt.Title, Items: menuItems})
|
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 {
|
func (self *HandlerCreator) menuPromptFromCommand(prompt *config.CustomCommandPrompt, wrappedF func(string) error) error {
|
||||||
// Run and save output
|
// Run and save output
|
||||||
message, err := self.git.Custom.RunWithOutput(prompt.Command)
|
message, err := self.git.Custom.RunWithOutput(prompt.Command)
|
||||||
|
|
|
@ -34,6 +34,11 @@ func (self *Resolver) resolvePrompt(
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result.Body, err = resolveTemplate(prompt.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
result.Command, err = resolveTemplate(prompt.Command)
|
result.Command, err = resolveTemplate(prompt.Command)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue