1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2024-11-26 09:00:57 +02:00
lazygit/pkg/gui/keybindings.go

417 lines
11 KiB
Go
Raw Normal View History

package gui
2018-08-08 11:18:41 +02:00
import (
"github.com/jesseduffield/gocui"
)
2018-08-08 11:18:41 +02:00
// Binding - a keybinding mapping a key and modifier to a handler. The keypress
// is only handled if the given view has focus, or handled globally if the view
// is ""
type Binding struct {
2018-08-29 11:56:28 +02:00
ViewName string
Handler func(*gocui.Gui, *gocui.View) error
Key interface{} // FIXME: find out how to get `gocui.Key | rune`
Modifier gocui.Modifier
2018-08-28 20:13:01 +02:00
KeyReadable string
Description string
2018-08-08 11:18:41 +02:00
}
// GetDisplayStrings returns the display string of a file
func (b *Binding) GetDisplayStrings() []string {
return []string{b.GetKey(), b.Description}
}
func (b *Binding) GetKey() string {
r, ok := b.Key.(rune)
key := ""
if ok {
key = string(r)
} else if b.KeyReadable != "" {
key = b.KeyReadable
}
return key
}
func (gui *Gui) GetKeybindings() []*Binding {
bindings := []*Binding{
2018-09-01 12:10:03 +02:00
{
ViewName: "",
Key: 'q',
Modifier: gocui.ModNone,
Handler: gui.quit,
}, {
ViewName: "",
Key: gocui.KeyCtrlC,
Modifier: gocui.ModNone,
Handler: gui.quit,
}, {
ViewName: "",
Key: gocui.KeyEsc,
Modifier: gocui.ModNone,
Handler: gui.quit,
}, {
ViewName: "",
Key: gocui.KeyPgup,
Modifier: gocui.ModNone,
Handler: gui.scrollUpMain,
}, {
ViewName: "",
Key: gocui.KeyPgdn,
Modifier: gocui.ModNone,
Handler: gui.scrollDownMain,
}, {
ViewName: "",
Key: gocui.KeyCtrlU,
Modifier: gocui.ModNone,
Handler: gui.scrollUpMain,
}, {
ViewName: "",
Key: gocui.KeyCtrlD,
Modifier: gocui.ModNone,
Handler: gui.scrollDownMain,
}, {
2018-09-05 13:23:06 +02:00
ViewName: "",
Key: 'P',
Modifier: gocui.ModNone,
Handler: gui.pushFiles,
2018-09-05 13:01:21 +02:00
Description: gui.Tr.SLocalize("push"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-05 13:23:06 +02:00
ViewName: "",
Key: 'p',
Modifier: gocui.ModNone,
Handler: gui.pullFiles,
2018-09-05 13:01:21 +02:00
Description: gui.Tr.SLocalize("pull"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-05 13:23:06 +02:00
ViewName: "",
Key: 'R',
Modifier: gocui.ModNone,
Handler: gui.handleRefresh,
2018-09-05 13:01:21 +02:00
Description: gui.Tr.SLocalize("refresh"),
2018-09-01 12:10:03 +02:00
}, {
ViewName: "",
2018-09-05 15:55:24 +02:00
Key: 'x',
2018-09-01 12:10:03 +02:00
Modifier: gocui.ModNone,
2018-09-18 13:07:25 +02:00
Handler: gui.handleCreateOptionsMenu,
2018-09-01 12:10:03 +02:00
}, {
ViewName: "status",
Key: 'e',
Modifier: gocui.ModNone,
Handler: gui.handleEditConfig,
Description: gui.Tr.SLocalize("EditConfig"),
}, {
ViewName: "status",
Key: 'o',
Modifier: gocui.ModNone,
Handler: gui.handleOpenConfig,
Description: gui.Tr.SLocalize("OpenConfig"),
}, {
ViewName: "status",
Key: 'u',
Modifier: gocui.ModNone,
Handler: gui.handleCheckForUpdate,
Description: gui.Tr.SLocalize("checkForUpdate"),
2018-09-01 12:10:03 +02:00
}, {
ViewName: "status",
Key: 's',
Modifier: gocui.ModNone,
2018-09-19 11:15:29 +02:00
Handler: gui.handleCreateRecentReposMenu,
Description: gui.Tr.SLocalize("SwitchRepo"),
},
{
2018-09-01 12:10:03 +02:00
ViewName: "files",
Key: 'c',
Modifier: gocui.ModNone,
Handler: gui.handleCommitPress,
Description: gui.Tr.SLocalize("CommitChanges"),
2018-09-12 15:20:35 +02:00
}, {
ViewName: "files",
Key: 'M',
Modifier: gocui.ModNone,
Handler: gui.handleAmendCommitPress,
Description: gui.Tr.SLocalize("AmendLastCommit"),
2018-09-01 12:10:03 +02:00
}, {
ViewName: "files",
Key: 'C',
Modifier: gocui.ModNone,
Handler: gui.handleCommitEditorPress,
Description: gui.Tr.SLocalize("CommitChangesWithEditor"),
}, {
2018-09-03 18:44:56 +02:00
ViewName: "files",
Key: gocui.KeySpace,
Modifier: gocui.ModNone,
Handler: gui.handleFilePress,
KeyReadable: "space",
Description: gui.Tr.SLocalize("toggleStaged"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:03:43 +02:00
ViewName: "files",
Key: 'd',
Modifier: gocui.ModNone,
Handler: gui.handleFileRemove,
Description: gui.Tr.SLocalize("removeFile"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'm',
Modifier: gocui.ModNone,
Handler: gui.handleSwitchToMerge,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("resolveMergeConflicts"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'e',
Modifier: gocui.ModNone,
Handler: gui.handleFileEdit,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("editFile"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'o',
Modifier: gocui.ModNone,
Handler: gui.handleFileOpen,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("openFile"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'i',
Modifier: gocui.ModNone,
Handler: gui.handleIgnoreFile,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("ignoreFile"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'r',
Modifier: gocui.ModNone,
Handler: gui.handleRefreshFiles,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("refreshFiles"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'S',
Modifier: gocui.ModNone,
Handler: gui.handleStashSave,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("stashFiles"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'A',
Modifier: gocui.ModNone,
Handler: gui.handleAbortMerge,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("abortMerge"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'a',
Modifier: gocui.ModNone,
Handler: gui.handleStageAll,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("toggleStagedAll"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 't',
Modifier: gocui.ModNone,
Handler: gui.handleAddPatch,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("addPatch"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "files",
Key: 'D',
Modifier: gocui.ModNone,
Handler: gui.handleResetHard,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("resetHard"),
2018-09-01 12:10:03 +02:00
}, {
ViewName: "main",
Key: gocui.KeyEsc,
Modifier: gocui.ModNone,
Handler: gui.handleEscapeMerge,
}, {
ViewName: "main",
Key: gocui.KeySpace,
Modifier: gocui.ModNone,
Handler: gui.handlePickHunk,
}, {
ViewName: "main",
Key: 'b',
Modifier: gocui.ModNone,
Handler: gui.handlePickBothHunks,
}, {
ViewName: "main",
Key: gocui.KeyArrowLeft,
Modifier: gocui.ModNone,
Handler: gui.handleSelectPrevConflict,
}, {
ViewName: "main",
Key: gocui.KeyArrowRight,
Modifier: gocui.ModNone,
Handler: gui.handleSelectNextConflict,
}, {
ViewName: "main",
Key: gocui.KeyArrowUp,
Modifier: gocui.ModNone,
Handler: gui.handleSelectTop,
}, {
ViewName: "main",
Key: gocui.KeyArrowDown,
Modifier: gocui.ModNone,
Handler: gui.handleSelectBottom,
}, {
ViewName: "main",
Key: 'h',
Modifier: gocui.ModNone,
Handler: gui.handleSelectPrevConflict,
}, {
ViewName: "main",
Key: 'l',
Modifier: gocui.ModNone,
Handler: gui.handleSelectNextConflict,
}, {
ViewName: "main",
Key: 'k',
Modifier: gocui.ModNone,
Handler: gui.handleSelectTop,
}, {
ViewName: "main",
Key: 'j',
Modifier: gocui.ModNone,
Handler: gui.handleSelectBottom,
}, {
ViewName: "main",
Key: 'z',
Modifier: gocui.ModNone,
Handler: gui.handlePopFileSnapshot,
}, {
2018-09-03 18:44:56 +02:00
ViewName: "branches",
Key: gocui.KeySpace,
Modifier: gocui.ModNone,
Handler: gui.handleBranchPress,
KeyReadable: "space",
Description: gui.Tr.SLocalize("checkout"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "branches",
Key: 'c',
Modifier: gocui.ModNone,
Handler: gui.handleCheckoutByName,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("checkoutByName"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "branches",
Key: 'F',
Modifier: gocui.ModNone,
Handler: gui.handleForceCheckout,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("forceCheckout"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "branches",
Key: 'n',
Modifier: gocui.ModNone,
Handler: gui.handleNewBranch,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("newBranch"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "branches",
Key: 'd',
Modifier: gocui.ModNone,
Handler: gui.handleDeleteBranch,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("deleteBranch"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "branches",
Key: 'D',
Modifier: gocui.ModNone,
Handler: gui.handleForceDeleteBranch,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("forceDeleteBranch"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "branches",
Key: 'm',
Modifier: gocui.ModNone,
Handler: gui.handleMerge,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("mergeIntoCurrentBranch"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "commits",
Key: 's',
Modifier: gocui.ModNone,
Handler: gui.handleCommitSquashDown,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("squashDown"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "commits",
Key: 'r',
Modifier: gocui.ModNone,
Handler: gui.handleRenameCommit,
Description: gui.Tr.SLocalize("renameCommit"),
2018-09-03 18:01:07 +02:00
}, {
ViewName: "commits",
Key: 'R',
Modifier: gocui.ModNone,
Handler: gui.handleRenameCommitEditor,
Description: gui.Tr.SLocalize("renameCommitEditor"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "commits",
Key: 'g',
Modifier: gocui.ModNone,
Handler: gui.handleResetToCommit,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("resetToThisCommit"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "commits",
Key: 'f',
Modifier: gocui.ModNone,
Handler: gui.handleCommitFixup,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("fixupCommit"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "stash",
Key: gocui.KeySpace,
Modifier: gocui.ModNone,
Handler: gui.handleStashApply,
2018-09-01 14:03:43 +02:00
KeyReadable: "space",
Description: gui.Tr.SLocalize("apply"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "stash",
Key: 'g',
Modifier: gocui.ModNone,
Handler: gui.handleStashPop,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("pop"),
2018-09-01 12:10:03 +02:00
}, {
2018-09-01 14:20:45 +02:00
ViewName: "stash",
Key: 'd',
Modifier: gocui.ModNone,
Handler: gui.handleStashDrop,
2018-09-01 14:03:43 +02:00
Description: gui.Tr.SLocalize("drop"),
2018-09-01 12:10:03 +02:00
}, {
ViewName: "commitMessage",
Key: gocui.KeyEnter,
Modifier: gocui.ModNone,
Handler: gui.handleCommitConfirm,
}, {
ViewName: "commitMessage",
Key: gocui.KeyEsc,
Modifier: gocui.ModNone,
Handler: gui.handleCommitClose,
}, {
2018-09-05 11:12:11 +02:00
ViewName: "menu",
2018-09-01 12:10:03 +02:00
Key: gocui.KeyEsc,
Modifier: gocui.ModNone,
2018-09-05 11:12:11 +02:00
Handler: gui.handleMenuClose,
2018-09-01 12:10:03 +02:00
}, {
2018-09-05 11:12:11 +02:00
ViewName: "menu",
2018-09-01 12:10:03 +02:00
Key: 'q',
Modifier: gocui.ModNone,
2018-09-05 11:12:11 +02:00
Handler: gui.handleMenuClose,
2018-09-01 12:10:03 +02:00
},
2018-08-08 11:18:41 +02:00
}
// Would make these keybindings global but that interferes with editing
// input in the confirmation panel
2018-09-05 11:12:11 +02:00
for _, viewName := range []string{"status", "files", "branches", "commits", "stash", "menu"} {
bindings = append(bindings, []*Binding{
2018-08-13 13:16:21 +02:00
{ViewName: viewName, Key: gocui.KeyTab, Modifier: gocui.ModNone, Handler: gui.nextView},
{ViewName: viewName, Key: gocui.KeyArrowLeft, Modifier: gocui.ModNone, Handler: gui.previousView},
{ViewName: viewName, Key: gocui.KeyArrowRight, Modifier: gocui.ModNone, Handler: gui.nextView},
{ViewName: viewName, Key: gocui.KeyArrowUp, Modifier: gocui.ModNone, Handler: gui.cursorUp},
{ViewName: viewName, Key: gocui.KeyArrowDown, Modifier: gocui.ModNone, Handler: gui.cursorDown},
{ViewName: viewName, Key: 'h', Modifier: gocui.ModNone, Handler: gui.previousView},
{ViewName: viewName, Key: 'l', Modifier: gocui.ModNone, Handler: gui.nextView},
{ViewName: viewName, Key: 'k', Modifier: gocui.ModNone, Handler: gui.cursorUp},
{ViewName: viewName, Key: 'j', Modifier: gocui.ModNone, Handler: gui.cursorDown},
}...)
}
2018-08-28 20:07:13 +02:00
return bindings
}
func (gui *Gui) keybindings(g *gocui.Gui) error {
bindings := gui.GetKeybindings()
2018-08-28 20:07:13 +02:00
2018-08-08 11:18:41 +02:00
for _, binding := range bindings {
if err := g.SetKeybinding(binding.ViewName, binding.Key, binding.Modifier, binding.Handler); err != nil {
return err
}
}
return nil
}