diff --git a/pkg/gui/controllers/helpers/search_helper.go b/pkg/gui/controllers/helpers/search_helper.go index 0480cd095ff..554c87af1de 100644 --- a/pkg/gui/controllers/helpers/search_helper.go +++ b/pkg/gui/controllers/helpers/search_helper.go @@ -45,7 +45,7 @@ func (self *SearchHelper) OpenFilterPrompt(context types.IFilterableContext) err return err } - return nil + return self.c.ResetKeybindings() } func (self *SearchHelper) OpenSearchPrompt(context types.ISearchableContext) error { @@ -64,7 +64,7 @@ func (self *SearchHelper) OpenSearchPrompt(context types.ISearchableContext) err return err } - return nil + return self.c.ResetKeybindings() } func (self *SearchHelper) DisplayFilterStatus(context types.IFilterableContext) { @@ -112,16 +112,21 @@ func (self *SearchHelper) Confirm() error { return self.CancelPrompt() } + var err error switch state.SearchType() { case types.SearchTypeFilter: - return self.ConfirmFilter() + err = self.ConfirmFilter() case types.SearchTypeSearch: - return self.ConfirmSearch() + err = self.ConfirmSearch() case types.SearchTypeNone: - return self.c.Context().Pop() + err = self.c.Context().Pop() } - return nil + if err != nil { + return err + } + + return self.c.ResetKeybindings() } func (self *SearchHelper) ConfirmFilter() error { @@ -183,7 +188,11 @@ func modelSearchResults(context types.ISearchableContext) []gocui.SearchPosition func (self *SearchHelper) CancelPrompt() error { self.Cancel() - return self.c.Context().Pop() + if err := self.c.Context().Pop(); err != nil { + return err + } + + return self.c.ResetKeybindings() } func (self *SearchHelper) ScrollHistory(scrollIncrement int) { diff --git a/pkg/gui/gui_common.go b/pkg/gui/gui_common.go index 1c56301d977..b1540e6eb4c 100644 --- a/pkg/gui/gui_common.go +++ b/pkg/gui/gui_common.go @@ -140,6 +140,10 @@ func (self *guiCommon) CallKeybindingHandler(binding *types.Binding) error { return self.gui.callKeybindingHandler(binding) } +func (self *guiCommon) ResetKeybindings() error { + return self.gui.resetKeybindings() +} + func (self *guiCommon) IsAnyModeActive() bool { return self.gui.helpers.Mode.IsAnyModeActive() } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index a3da576596c..bdfed1df7ab 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -5,6 +5,7 @@ import ( "log" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/context" "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" "github.com/jesseduffield/lazygit/pkg/gui/keybindings" "github.com/jesseduffield/lazygit/pkg/gui/types" @@ -345,6 +346,18 @@ func (self *Gui) GetInitialKeybindings() ([]*types.Binding, []*gocui.ViewMouseBi } func (self *Gui) GetInitialKeybindingsWithCustomCommands() ([]*types.Binding, []*gocui.ViewMouseBinding) { + // if the search or filter prompt is open, we only want the keybindings for + // that context. It shouldn't be possible, for example, to open a menu while + // the prompt is showing; you first need to confirm or cancel the search/filter. + if currentContext := self.State.ContextMgr.Current(); currentContext.GetKey() == context.SEARCH_CONTEXT_KEY { + bindings := currentContext.GetKeybindings(self.c.KeybindingsOpts()) + viewName := currentContext.GetViewName() + for _, binding := range bindings { + binding.ViewName = viewName + } + return bindings, nil + } + bindings, mouseBindings := self.GetInitialKeybindings() customBindings, err := self.CustomCommandsClient.GetCustomCommandKeybindings() if err != nil { diff --git a/pkg/gui/types/common.go b/pkg/gui/types/common.go index 9b7ccf34ff9..9ae7f9ea05b 100644 --- a/pkg/gui/types/common.go +++ b/pkg/gui/types/common.go @@ -98,6 +98,8 @@ type IGuiCommon interface { KeybindingsOpts() KeybindingsOpts CallKeybindingHandler(binding *Binding) error + ResetKeybindings() error + // hopefully we can remove this once we've moved all our keybinding stuff out of the gui god struct. GetInitialKeybindingsWithCustomCommands() ([]*Binding, []*gocui.ViewMouseBinding)