mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-06-04 23:37:41 +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/generics/slices"
|
||||||
"github.com/jesseduffield/lazygit/pkg/app"
|
"github.com/jesseduffield/lazygit/pkg/app"
|
||||||
"github.com/jesseduffield/lazygit/pkg/config"
|
"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/gui/types"
|
||||||
"github.com/jesseduffield/lazygit/pkg/i18n"
|
"github.com/jesseduffield/lazygit/pkg/i18n"
|
||||||
"github.com/jesseduffield/lazygit/pkg/integration"
|
"github.com/jesseduffield/lazygit/pkg/integration"
|
||||||
@ -135,7 +135,7 @@ func getBindingSections(bindings []*types.Binding, tr *i18n.TranslationSet) []*b
|
|||||||
bindingsByHeader,
|
bindingsByHeader,
|
||||||
func(header header, hBindings []*types.Binding) headerWithBindings {
|
func(header header, hBindings []*types.Binding) headerWithBindings {
|
||||||
uniqBindings := lo.UniqBy(hBindings, func(binding *types.Binding) string {
|
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{
|
return headerWithBindings{
|
||||||
@ -203,10 +203,10 @@ func formatBinding(binding *types.Binding) string {
|
|||||||
if binding.Alternative != "" {
|
if binding.Alternative != "" {
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
" <kbd>%s</kbd>: %s (%s)\n",
|
" <kbd>%s</kbd>: %s (%s)\n",
|
||||||
gui.GetKeyDisplay(binding.Key),
|
keybindings.GetKeyDisplay(binding.Key),
|
||||||
binding.Description,
|
binding.Description,
|
||||||
binding.Alternative,
|
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 (
|
import (
|
||||||
"github.com/jesseduffield/generics/slices"
|
"github.com/jesseduffield/generics/slices"
|
||||||
"github.com/jesseduffield/gocui"
|
"github.com/jesseduffield/gocui"
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/gui/keybindings"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/presentation"
|
"github.com/jesseduffield/lazygit/pkg/gui/presentation"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||||
)
|
)
|
||||||
@ -79,15 +80,59 @@ func (self *MenuViewModel) SetMenuItems(items []*types.MenuItem) {
|
|||||||
|
|
||||||
// TODO: move into presentation package
|
// TODO: move into presentation package
|
||||||
func (self *MenuViewModel) GetDisplayStrings(_startIdx int, _length int) [][]string {
|
func (self *MenuViewModel) GetDisplayStrings(_startIdx int, _length int) [][]string {
|
||||||
return slices.Map(self.menuItems, func(item *types.MenuItem) []string {
|
showKeys := slices.Some(self.menuItems, func(item *types.MenuItem) bool {
|
||||||
if item.DisplayStrings != nil {
|
return item.Key != nil
|
||||||
return item.DisplayStrings
|
})
|
||||||
}
|
|
||||||
|
|
||||||
styledStr := item.DisplayString
|
return slices.Map(self.menuItems, func(item *types.MenuItem) []string {
|
||||||
if item.OpensMenu {
|
displayStrings := getItemDisplayStrings(item)
|
||||||
styledStr = presentation.OpensMenuStyle(styledStr)
|
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 {
|
func (self *MenuController) press() error {
|
||||||
selectedItem := self.context().GetSelected()
|
return self.context().OnMenuPress(self.context().GetSelected())
|
||||||
|
|
||||||
if err := self.c.PopContext(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := selectedItem.OnPress(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *MenuController) close() error {
|
func (self *MenuController) close() error {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package gui
|
package gui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
@ -10,170 +9,19 @@ import (
|
|||||||
"github.com/jesseduffield/lazygit/pkg/constants"
|
"github.com/jesseduffield/lazygit/pkg/constants"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/context"
|
"github.com/jesseduffield/lazygit/pkg/gui/context"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers"
|
"github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers"
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/gui/keybindings"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
"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 {
|
func (gui *Gui) getKeyDisplay(name string) string {
|
||||||
key := gui.getKey(name)
|
key := gui.getKey(name)
|
||||||
return GetKeyDisplay(key)
|
return keybindings.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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) getKey(key string) types.Key {
|
func (gui *Gui) getKey(key string) types.Key {
|
||||||
runeCount := utf8.RuneCountInString(key)
|
runeCount := utf8.RuneCountInString(key)
|
||||||
if runeCount > 1 {
|
if runeCount > 1 {
|
||||||
binding := keymap[strings.ToLower(key)]
|
binding := keybindings.Keymap[strings.ToLower(key)]
|
||||||
if binding == nil {
|
if binding == nil {
|
||||||
log.Fatalf("Unrecognized key %s for keybinding. For permitted values see %s", strings.ToLower(key), constants.Links.Docs.CustomKeybindings)
|
log.Fatalf("Unrecognized key %s for keybinding. For permitted values see %s", strings.ToLower(key), constants.Links.Docs.CustomKeybindings)
|
||||||
} else {
|
} 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.SetMenuItems(opts.Items)
|
||||||
gui.State.Contexts.Menu.SetSelectedLineIdx(0)
|
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)
|
_ = gui.c.PostRefreshUpdate(gui.State.Contexts.Menu)
|
||||||
|
|
||||||
// TODO: ensure that if we're opened a menu from within a menu that it renders correctly
|
// TODO: ensure that if we're opened a menu from within a menu that it renders correctly
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/jesseduffield/generics/slices"
|
"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/presentation"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/style"
|
"github.com/jesseduffield/lazygit/pkg/gui/style"
|
||||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||||
@ -22,7 +23,7 @@ func (gui *Gui) getBindings(context types.Context) []*types.Binding {
|
|||||||
bindings = append(customBindings, bindings...)
|
bindings = append(customBindings, bindings...)
|
||||||
|
|
||||||
for _, binding := range 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 == "" {
|
if len(binding.Contexts) == 0 && binding.ViewName == "" {
|
||||||
bindingsGlobal = append(bindingsGlobal, binding)
|
bindingsGlobal = append(bindingsGlobal, binding)
|
||||||
} else if binding.Tag == "navigation" {
|
} else if binding.Tag == "navigation" {
|
||||||
@ -65,17 +66,15 @@ func (gui *Gui) handleCreateOptionsMenu() error {
|
|||||||
|
|
||||||
menuItems := slices.Map(bindings, func(binding *types.Binding) *types.MenuItem {
|
menuItems := slices.Map(bindings, func(binding *types.Binding) *types.MenuItem {
|
||||||
return &types.MenuItem{
|
return &types.MenuItem{
|
||||||
DisplayStrings: []string{GetKeyDisplay(binding.Key), gui.displayDescription(binding)},
|
DisplayString: gui.displayDescription(binding),
|
||||||
OnPress: func() error {
|
OnPress: func() error {
|
||||||
if binding.Key == nil {
|
if binding.Key == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := gui.c.PopContext(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return binding.Handler()
|
return binding.Handler()
|
||||||
},
|
},
|
||||||
|
Key: binding.Key,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -105,6 +105,10 @@ type MenuItem struct {
|
|||||||
OnPress func() error
|
OnPress func() error
|
||||||
// only applies when displayString is used
|
// only applies when displayString is used
|
||||||
OpensMenu bool
|
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 {
|
type Model struct {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user