mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-02-07 13:42:01 +02:00
allow menu to store keybindings for quick menu navigation
This commit is contained in:
parent
e43ce23642
commit
9c226eed37
@ -17,7 +17,7 @@ import (
|
||||
"github.com/jesseduffield/generics/slices"
|
||||
"github.com/jesseduffield/lazygit/pkg/app"
|
||||
"github.com/jesseduffield/lazygit/pkg/config"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/keybindings"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||
"github.com/jesseduffield/lazygit/pkg/i18n"
|
||||
"github.com/jesseduffield/lazygit/pkg/integration"
|
||||
@ -135,7 +135,7 @@ func getBindingSections(bindings []*types.Binding, tr *i18n.TranslationSet) []*b
|
||||
bindingsByHeader,
|
||||
func(header header, hBindings []*types.Binding) headerWithBindings {
|
||||
uniqBindings := lo.UniqBy(hBindings, func(binding *types.Binding) string {
|
||||
return binding.Description + gui.GetKeyDisplay(binding.Key)
|
||||
return binding.Description + keybindings.GetKeyDisplay(binding.Key)
|
||||
})
|
||||
|
||||
return headerWithBindings{
|
||||
@ -203,10 +203,10 @@ func formatBinding(binding *types.Binding) string {
|
||||
if binding.Alternative != "" {
|
||||
return fmt.Sprintf(
|
||||
" <kbd>%s</kbd>: %s (%s)\n",
|
||||
gui.GetKeyDisplay(binding.Key),
|
||||
keybindings.GetKeyDisplay(binding.Key),
|
||||
binding.Description,
|
||||
binding.Alternative,
|
||||
)
|
||||
}
|
||||
return fmt.Sprintf(" <kbd>%s</kbd>: %s\n", gui.GetKeyDisplay(binding.Key), binding.Description)
|
||||
return fmt.Sprintf(" <kbd>%s</kbd>: %s\n", keybindings.GetKeyDisplay(binding.Key), binding.Description)
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package context
|
||||
import (
|
||||
"github.com/jesseduffield/generics/slices"
|
||||
"github.com/jesseduffield/gocui"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/keybindings"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/presentation"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||
)
|
||||
@ -79,15 +80,59 @@ func (self *MenuViewModel) SetMenuItems(items []*types.MenuItem) {
|
||||
|
||||
// TODO: move into presentation package
|
||||
func (self *MenuViewModel) GetDisplayStrings(_startIdx int, _length int) [][]string {
|
||||
return slices.Map(self.menuItems, func(item *types.MenuItem) []string {
|
||||
if item.DisplayStrings != nil {
|
||||
return item.DisplayStrings
|
||||
}
|
||||
showKeys := slices.Some(self.menuItems, func(item *types.MenuItem) bool {
|
||||
return item.Key != nil
|
||||
})
|
||||
|
||||
styledStr := item.DisplayString
|
||||
if item.OpensMenu {
|
||||
styledStr = presentation.OpensMenuStyle(styledStr)
|
||||
return slices.Map(self.menuItems, func(item *types.MenuItem) []string {
|
||||
displayStrings := getItemDisplayStrings(item)
|
||||
if showKeys {
|
||||
displayStrings = slices.Prepend(displayStrings, keybindings.GetKeyDisplay(item.Key))
|
||||
}
|
||||
return []string{styledStr}
|
||||
return displayStrings
|
||||
})
|
||||
}
|
||||
|
||||
func getItemDisplayStrings(item *types.MenuItem) []string {
|
||||
if item.DisplayStrings != nil {
|
||||
return item.DisplayStrings
|
||||
}
|
||||
|
||||
styledStr := item.DisplayString
|
||||
if item.OpensMenu {
|
||||
styledStr = presentation.OpensMenuStyle(styledStr)
|
||||
}
|
||||
return []string{styledStr}
|
||||
}
|
||||
|
||||
func (self *MenuContext) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding {
|
||||
basicBindings := self.ListContextTrait.GetKeybindings(opts)
|
||||
menuItemsWithKeys := slices.Filter(self.menuItems, func(item *types.MenuItem) bool {
|
||||
return item.Key != nil
|
||||
})
|
||||
|
||||
menuItemBindings := slices.Map(menuItemsWithKeys, func(item *types.MenuItem) *types.Binding {
|
||||
return &types.Binding{
|
||||
Key: item.Key,
|
||||
Handler: func() error { return self.OnMenuPress(item) },
|
||||
}
|
||||
})
|
||||
|
||||
// appending because that means the menu item bindings have lower precedence.
|
||||
// So if a basic binding is to escape from the menu, we want that to still be
|
||||
// what happens when you press escape. This matters when we're showing the menu
|
||||
// for all keybindings of say the files context.
|
||||
return append(basicBindings, menuItemBindings...)
|
||||
}
|
||||
|
||||
func (self *MenuContext) OnMenuPress(selectedItem *types.MenuItem) error {
|
||||
if err := self.c.PopContext(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := selectedItem.OnPress(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -49,17 +49,7 @@ func (self *MenuController) GetOnClick() func() error {
|
||||
}
|
||||
|
||||
func (self *MenuController) press() error {
|
||||
selectedItem := self.context().GetSelected()
|
||||
|
||||
if err := self.c.PopContext(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := selectedItem.OnPress(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
return self.context().OnMenuPress(self.context().GetSelected())
|
||||
}
|
||||
|
||||
func (self *MenuController) close() error {
|
||||
|
@ -1,7 +1,6 @@
|
||||
package gui
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
@ -10,170 +9,19 @@ import (
|
||||
"github.com/jesseduffield/lazygit/pkg/constants"
|
||||
"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"
|
||||
)
|
||||
|
||||
var keyMapReversed = map[gocui.Key]string{
|
||||
gocui.KeyF1: "f1",
|
||||
gocui.KeyF2: "f2",
|
||||
gocui.KeyF3: "f3",
|
||||
gocui.KeyF4: "f4",
|
||||
gocui.KeyF5: "f5",
|
||||
gocui.KeyF6: "f6",
|
||||
gocui.KeyF7: "f7",
|
||||
gocui.KeyF8: "f8",
|
||||
gocui.KeyF9: "f9",
|
||||
gocui.KeyF10: "f10",
|
||||
gocui.KeyF11: "f11",
|
||||
gocui.KeyF12: "f12",
|
||||
gocui.KeyInsert: "insert",
|
||||
gocui.KeyDelete: "delete",
|
||||
gocui.KeyHome: "home",
|
||||
gocui.KeyEnd: "end",
|
||||
gocui.KeyPgup: "pgup",
|
||||
gocui.KeyPgdn: "pgdown",
|
||||
gocui.KeyArrowUp: "▲",
|
||||
gocui.KeyArrowDown: "▼",
|
||||
gocui.KeyArrowLeft: "◄",
|
||||
gocui.KeyArrowRight: "►",
|
||||
gocui.KeyTab: "tab", // ctrl+i
|
||||
gocui.KeyBacktab: "shift+tab",
|
||||
gocui.KeyEnter: "enter", // ctrl+m
|
||||
gocui.KeyAltEnter: "alt+enter",
|
||||
gocui.KeyEsc: "esc", // ctrl+[, ctrl+3
|
||||
gocui.KeyBackspace: "backspace", // ctrl+h
|
||||
gocui.KeyCtrlSpace: "ctrl+space", // ctrl+~, ctrl+2
|
||||
gocui.KeyCtrlSlash: "ctrl+/", // ctrl+_
|
||||
gocui.KeySpace: "space",
|
||||
gocui.KeyCtrlA: "ctrl+a",
|
||||
gocui.KeyCtrlB: "ctrl+b",
|
||||
gocui.KeyCtrlC: "ctrl+c",
|
||||
gocui.KeyCtrlD: "ctrl+d",
|
||||
gocui.KeyCtrlE: "ctrl+e",
|
||||
gocui.KeyCtrlF: "ctrl+f",
|
||||
gocui.KeyCtrlG: "ctrl+g",
|
||||
gocui.KeyCtrlJ: "ctrl+j",
|
||||
gocui.KeyCtrlK: "ctrl+k",
|
||||
gocui.KeyCtrlL: "ctrl+l",
|
||||
gocui.KeyCtrlN: "ctrl+n",
|
||||
gocui.KeyCtrlO: "ctrl+o",
|
||||
gocui.KeyCtrlP: "ctrl+p",
|
||||
gocui.KeyCtrlQ: "ctrl+q",
|
||||
gocui.KeyCtrlR: "ctrl+r",
|
||||
gocui.KeyCtrlS: "ctrl+s",
|
||||
gocui.KeyCtrlT: "ctrl+t",
|
||||
gocui.KeyCtrlU: "ctrl+u",
|
||||
gocui.KeyCtrlV: "ctrl+v",
|
||||
gocui.KeyCtrlW: "ctrl+w",
|
||||
gocui.KeyCtrlX: "ctrl+x",
|
||||
gocui.KeyCtrlY: "ctrl+y",
|
||||
gocui.KeyCtrlZ: "ctrl+z",
|
||||
gocui.KeyCtrl4: "ctrl+4", // ctrl+\
|
||||
gocui.KeyCtrl5: "ctrl+5", // ctrl+]
|
||||
gocui.KeyCtrl6: "ctrl+6",
|
||||
gocui.KeyCtrl8: "ctrl+8",
|
||||
gocui.MouseWheelUp: "mouse wheel up",
|
||||
gocui.MouseWheelDown: "mouse wheel down",
|
||||
}
|
||||
|
||||
var keymap = map[string]types.Key{
|
||||
"<c-a>": gocui.KeyCtrlA,
|
||||
"<c-b>": gocui.KeyCtrlB,
|
||||
"<c-c>": gocui.KeyCtrlC,
|
||||
"<c-d>": gocui.KeyCtrlD,
|
||||
"<c-e>": gocui.KeyCtrlE,
|
||||
"<c-f>": gocui.KeyCtrlF,
|
||||
"<c-g>": gocui.KeyCtrlG,
|
||||
"<c-h>": gocui.KeyCtrlH,
|
||||
"<c-i>": gocui.KeyCtrlI,
|
||||
"<c-j>": gocui.KeyCtrlJ,
|
||||
"<c-k>": gocui.KeyCtrlK,
|
||||
"<c-l>": gocui.KeyCtrlL,
|
||||
"<c-m>": gocui.KeyCtrlM,
|
||||
"<c-n>": gocui.KeyCtrlN,
|
||||
"<c-o>": gocui.KeyCtrlO,
|
||||
"<c-p>": gocui.KeyCtrlP,
|
||||
"<c-q>": gocui.KeyCtrlQ,
|
||||
"<c-r>": gocui.KeyCtrlR,
|
||||
"<c-s>": gocui.KeyCtrlS,
|
||||
"<c-t>": gocui.KeyCtrlT,
|
||||
"<c-u>": gocui.KeyCtrlU,
|
||||
"<c-v>": gocui.KeyCtrlV,
|
||||
"<c-w>": gocui.KeyCtrlW,
|
||||
"<c-x>": gocui.KeyCtrlX,
|
||||
"<c-y>": gocui.KeyCtrlY,
|
||||
"<c-z>": gocui.KeyCtrlZ,
|
||||
"<c-~>": gocui.KeyCtrlTilde,
|
||||
"<c-2>": gocui.KeyCtrl2,
|
||||
"<c-3>": gocui.KeyCtrl3,
|
||||
"<c-4>": gocui.KeyCtrl4,
|
||||
"<c-5>": gocui.KeyCtrl5,
|
||||
"<c-6>": gocui.KeyCtrl6,
|
||||
"<c-7>": gocui.KeyCtrl7,
|
||||
"<c-8>": gocui.KeyCtrl8,
|
||||
"<c-space>": gocui.KeyCtrlSpace,
|
||||
"<c-\\>": gocui.KeyCtrlBackslash,
|
||||
"<c-[>": gocui.KeyCtrlLsqBracket,
|
||||
"<c-]>": gocui.KeyCtrlRsqBracket,
|
||||
"<c-/>": gocui.KeyCtrlSlash,
|
||||
"<c-_>": gocui.KeyCtrlUnderscore,
|
||||
"<backspace>": gocui.KeyBackspace,
|
||||
"<tab>": gocui.KeyTab,
|
||||
"<backtab>": gocui.KeyBacktab,
|
||||
"<enter>": gocui.KeyEnter,
|
||||
"<a-enter>": gocui.KeyAltEnter,
|
||||
"<esc>": gocui.KeyEsc,
|
||||
"<space>": gocui.KeySpace,
|
||||
"<f1>": gocui.KeyF1,
|
||||
"<f2>": gocui.KeyF2,
|
||||
"<f3>": gocui.KeyF3,
|
||||
"<f4>": gocui.KeyF4,
|
||||
"<f5>": gocui.KeyF5,
|
||||
"<f6>": gocui.KeyF6,
|
||||
"<f7>": gocui.KeyF7,
|
||||
"<f8>": gocui.KeyF8,
|
||||
"<f9>": gocui.KeyF9,
|
||||
"<f10>": gocui.KeyF10,
|
||||
"<f11>": gocui.KeyF11,
|
||||
"<f12>": gocui.KeyF12,
|
||||
"<insert>": gocui.KeyInsert,
|
||||
"<delete>": gocui.KeyDelete,
|
||||
"<home>": gocui.KeyHome,
|
||||
"<end>": gocui.KeyEnd,
|
||||
"<pgup>": gocui.KeyPgup,
|
||||
"<pgdown>": gocui.KeyPgdn,
|
||||
"<up>": gocui.KeyArrowUp,
|
||||
"<down>": gocui.KeyArrowDown,
|
||||
"<left>": gocui.KeyArrowLeft,
|
||||
"<right>": gocui.KeyArrowRight,
|
||||
}
|
||||
|
||||
func (gui *Gui) getKeyDisplay(name string) string {
|
||||
key := gui.getKey(name)
|
||||
return GetKeyDisplay(key)
|
||||
}
|
||||
|
||||
func GetKeyDisplay(key types.Key) string {
|
||||
keyInt := 0
|
||||
|
||||
switch key := key.(type) {
|
||||
case rune:
|
||||
keyInt = int(key)
|
||||
case gocui.Key:
|
||||
value, ok := keyMapReversed[key]
|
||||
if ok {
|
||||
return value
|
||||
}
|
||||
keyInt = int(key)
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%c", keyInt)
|
||||
return keybindings.GetKeyDisplay(key)
|
||||
}
|
||||
|
||||
func (gui *Gui) getKey(key string) types.Key {
|
||||
runeCount := utf8.RuneCountInString(key)
|
||||
if runeCount > 1 {
|
||||
binding := keymap[strings.ToLower(key)]
|
||||
binding := keybindings.Keymap[strings.ToLower(key)]
|
||||
if binding == nil {
|
||||
log.Fatalf("Unrecognized key %s for keybinding. For permitted values see %s", strings.ToLower(key), constants.Links.Docs.CustomKeybindings)
|
||||
} else {
|
||||
|
160
pkg/gui/keybindings/keybindings.go
Normal file
160
pkg/gui/keybindings/keybindings.go
Normal file
@ -0,0 +1,160 @@
|
||||
package keybindings
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/jesseduffield/gocui"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||
)
|
||||
|
||||
var KeyMapReversed = map[gocui.Key]string{
|
||||
gocui.KeyF1: "f1",
|
||||
gocui.KeyF2: "f2",
|
||||
gocui.KeyF3: "f3",
|
||||
gocui.KeyF4: "f4",
|
||||
gocui.KeyF5: "f5",
|
||||
gocui.KeyF6: "f6",
|
||||
gocui.KeyF7: "f7",
|
||||
gocui.KeyF8: "f8",
|
||||
gocui.KeyF9: "f9",
|
||||
gocui.KeyF10: "f10",
|
||||
gocui.KeyF11: "f11",
|
||||
gocui.KeyF12: "f12",
|
||||
gocui.KeyInsert: "insert",
|
||||
gocui.KeyDelete: "delete",
|
||||
gocui.KeyHome: "home",
|
||||
gocui.KeyEnd: "end",
|
||||
gocui.KeyPgup: "pgup",
|
||||
gocui.KeyPgdn: "pgdown",
|
||||
gocui.KeyArrowUp: "▲",
|
||||
gocui.KeyArrowDown: "▼",
|
||||
gocui.KeyArrowLeft: "◄",
|
||||
gocui.KeyArrowRight: "►",
|
||||
gocui.KeyTab: "tab", // ctrl+i
|
||||
gocui.KeyBacktab: "shift+tab",
|
||||
gocui.KeyEnter: "enter", // ctrl+m
|
||||
gocui.KeyAltEnter: "alt+enter",
|
||||
gocui.KeyEsc: "esc", // ctrl+[, ctrl+3
|
||||
gocui.KeyBackspace: "backspace", // ctrl+h
|
||||
gocui.KeyCtrlSpace: "ctrl+space", // ctrl+~, ctrl+2
|
||||
gocui.KeyCtrlSlash: "ctrl+/", // ctrl+_
|
||||
gocui.KeySpace: "space",
|
||||
gocui.KeyCtrlA: "ctrl+a",
|
||||
gocui.KeyCtrlB: "ctrl+b",
|
||||
gocui.KeyCtrlC: "ctrl+c",
|
||||
gocui.KeyCtrlD: "ctrl+d",
|
||||
gocui.KeyCtrlE: "ctrl+e",
|
||||
gocui.KeyCtrlF: "ctrl+f",
|
||||
gocui.KeyCtrlG: "ctrl+g",
|
||||
gocui.KeyCtrlJ: "ctrl+j",
|
||||
gocui.KeyCtrlK: "ctrl+k",
|
||||
gocui.KeyCtrlL: "ctrl+l",
|
||||
gocui.KeyCtrlN: "ctrl+n",
|
||||
gocui.KeyCtrlO: "ctrl+o",
|
||||
gocui.KeyCtrlP: "ctrl+p",
|
||||
gocui.KeyCtrlQ: "ctrl+q",
|
||||
gocui.KeyCtrlR: "ctrl+r",
|
||||
gocui.KeyCtrlS: "ctrl+s",
|
||||
gocui.KeyCtrlT: "ctrl+t",
|
||||
gocui.KeyCtrlU: "ctrl+u",
|
||||
gocui.KeyCtrlV: "ctrl+v",
|
||||
gocui.KeyCtrlW: "ctrl+w",
|
||||
gocui.KeyCtrlX: "ctrl+x",
|
||||
gocui.KeyCtrlY: "ctrl+y",
|
||||
gocui.KeyCtrlZ: "ctrl+z",
|
||||
gocui.KeyCtrl4: "ctrl+4", // ctrl+\
|
||||
gocui.KeyCtrl5: "ctrl+5", // ctrl+]
|
||||
gocui.KeyCtrl6: "ctrl+6",
|
||||
gocui.KeyCtrl8: "ctrl+8",
|
||||
gocui.MouseWheelUp: "mouse wheel up",
|
||||
gocui.MouseWheelDown: "mouse wheel down",
|
||||
}
|
||||
|
||||
var Keymap = map[string]types.Key{
|
||||
"<c-a>": gocui.KeyCtrlA,
|
||||
"<c-b>": gocui.KeyCtrlB,
|
||||
"<c-c>": gocui.KeyCtrlC,
|
||||
"<c-d>": gocui.KeyCtrlD,
|
||||
"<c-e>": gocui.KeyCtrlE,
|
||||
"<c-f>": gocui.KeyCtrlF,
|
||||
"<c-g>": gocui.KeyCtrlG,
|
||||
"<c-h>": gocui.KeyCtrlH,
|
||||
"<c-i>": gocui.KeyCtrlI,
|
||||
"<c-j>": gocui.KeyCtrlJ,
|
||||
"<c-k>": gocui.KeyCtrlK,
|
||||
"<c-l>": gocui.KeyCtrlL,
|
||||
"<c-m>": gocui.KeyCtrlM,
|
||||
"<c-n>": gocui.KeyCtrlN,
|
||||
"<c-o>": gocui.KeyCtrlO,
|
||||
"<c-p>": gocui.KeyCtrlP,
|
||||
"<c-q>": gocui.KeyCtrlQ,
|
||||
"<c-r>": gocui.KeyCtrlR,
|
||||
"<c-s>": gocui.KeyCtrlS,
|
||||
"<c-t>": gocui.KeyCtrlT,
|
||||
"<c-u>": gocui.KeyCtrlU,
|
||||
"<c-v>": gocui.KeyCtrlV,
|
||||
"<c-w>": gocui.KeyCtrlW,
|
||||
"<c-x>": gocui.KeyCtrlX,
|
||||
"<c-y>": gocui.KeyCtrlY,
|
||||
"<c-z>": gocui.KeyCtrlZ,
|
||||
"<c-~>": gocui.KeyCtrlTilde,
|
||||
"<c-2>": gocui.KeyCtrl2,
|
||||
"<c-3>": gocui.KeyCtrl3,
|
||||
"<c-4>": gocui.KeyCtrl4,
|
||||
"<c-5>": gocui.KeyCtrl5,
|
||||
"<c-6>": gocui.KeyCtrl6,
|
||||
"<c-7>": gocui.KeyCtrl7,
|
||||
"<c-8>": gocui.KeyCtrl8,
|
||||
"<c-space>": gocui.KeyCtrlSpace,
|
||||
"<c-\\>": gocui.KeyCtrlBackslash,
|
||||
"<c-[>": gocui.KeyCtrlLsqBracket,
|
||||
"<c-]>": gocui.KeyCtrlRsqBracket,
|
||||
"<c-/>": gocui.KeyCtrlSlash,
|
||||
"<c-_>": gocui.KeyCtrlUnderscore,
|
||||
"<backspace>": gocui.KeyBackspace,
|
||||
"<tab>": gocui.KeyTab,
|
||||
"<backtab>": gocui.KeyBacktab,
|
||||
"<enter>": gocui.KeyEnter,
|
||||
"<a-enter>": gocui.KeyAltEnter,
|
||||
"<esc>": gocui.KeyEsc,
|
||||
"<space>": gocui.KeySpace,
|
||||
"<f1>": gocui.KeyF1,
|
||||
"<f2>": gocui.KeyF2,
|
||||
"<f3>": gocui.KeyF3,
|
||||
"<f4>": gocui.KeyF4,
|
||||
"<f5>": gocui.KeyF5,
|
||||
"<f6>": gocui.KeyF6,
|
||||
"<f7>": gocui.KeyF7,
|
||||
"<f8>": gocui.KeyF8,
|
||||
"<f9>": gocui.KeyF9,
|
||||
"<f10>": gocui.KeyF10,
|
||||
"<f11>": gocui.KeyF11,
|
||||
"<f12>": gocui.KeyF12,
|
||||
"<insert>": gocui.KeyInsert,
|
||||
"<delete>": gocui.KeyDelete,
|
||||
"<home>": gocui.KeyHome,
|
||||
"<end>": gocui.KeyEnd,
|
||||
"<pgup>": gocui.KeyPgup,
|
||||
"<pgdown>": gocui.KeyPgdn,
|
||||
"<up>": gocui.KeyArrowUp,
|
||||
"<down>": gocui.KeyArrowDown,
|
||||
"<left>": gocui.KeyArrowLeft,
|
||||
"<right>": gocui.KeyArrowRight,
|
||||
}
|
||||
|
||||
func GetKeyDisplay(key types.Key) string {
|
||||
keyInt := 0
|
||||
|
||||
switch key := key.(type) {
|
||||
case rune:
|
||||
keyInt = int(key)
|
||||
case gocui.Key:
|
||||
value, ok := KeyMapReversed[key]
|
||||
if ok {
|
||||
return value
|
||||
}
|
||||
keyInt = int(key)
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%c", keyInt)
|
||||
}
|
@ -46,6 +46,12 @@ func (gui *Gui) createMenu(opts types.CreateMenuOptions) error {
|
||||
|
||||
gui.State.Contexts.Menu.SetMenuItems(opts.Items)
|
||||
gui.State.Contexts.Menu.SetSelectedLineIdx(0)
|
||||
|
||||
// resetting keybindings so that the menu-specific keybindings are registered
|
||||
if err := gui.resetKeybindings(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_ = gui.c.PostRefreshUpdate(gui.State.Contexts.Menu)
|
||||
|
||||
// TODO: ensure that if we're opened a menu from within a menu that it renders correctly
|
||||
|
@ -5,6 +5,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/jesseduffield/generics/slices"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/keybindings"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/presentation"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/style"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||
@ -22,7 +23,7 @@ func (gui *Gui) getBindings(context types.Context) []*types.Binding {
|
||||
bindings = append(customBindings, bindings...)
|
||||
|
||||
for _, binding := range bindings {
|
||||
if GetKeyDisplay(binding.Key) != "" && binding.Description != "" {
|
||||
if keybindings.GetKeyDisplay(binding.Key) != "" && binding.Description != "" {
|
||||
if len(binding.Contexts) == 0 && binding.ViewName == "" {
|
||||
bindingsGlobal = append(bindingsGlobal, binding)
|
||||
} else if binding.Tag == "navigation" {
|
||||
@ -65,17 +66,15 @@ func (gui *Gui) handleCreateOptionsMenu() error {
|
||||
|
||||
menuItems := slices.Map(bindings, func(binding *types.Binding) *types.MenuItem {
|
||||
return &types.MenuItem{
|
||||
DisplayStrings: []string{GetKeyDisplay(binding.Key), gui.displayDescription(binding)},
|
||||
DisplayString: gui.displayDescription(binding),
|
||||
OnPress: func() error {
|
||||
if binding.Key == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := gui.c.PopContext(); err != nil {
|
||||
return err
|
||||
}
|
||||
return binding.Handler()
|
||||
},
|
||||
Key: binding.Key,
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -105,6 +105,10 @@ type MenuItem struct {
|
||||
OnPress func() error
|
||||
// only applies when displayString is used
|
||||
OpensMenu bool
|
||||
|
||||
// if Key is defined it allows the user to press the key to invoke the menu
|
||||
// item, as opposed to having to navigate to it
|
||||
Key Key
|
||||
}
|
||||
|
||||
type Model struct {
|
||||
|
Loading…
x
Reference in New Issue
Block a user