mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-15 11:56:37 +02:00
support opening and editing config file
This commit is contained in:
parent
6b150a4be0
commit
a1a828a781
@ -1,16 +1,25 @@
|
|||||||
# Keybindings:
|
# Keybindings:
|
||||||
|
|
||||||
## Global:
|
## Global:
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<kbd>←</kbd><kbd>→</kbd><kbd>↑</kbd><kbd>↓</kbd>/<kbd>h</kbd><kbd>j</kbd><kbd>k</kbd><kbd>l</kbd>: navigate
|
<kbd>←</kbd><kbd>→</kbd><kbd>↑</kbd><kbd>↓</kbd>/<kbd>h</kbd><kbd>j</kbd><kbd>k</kbd><kbd>l</kbd>: navigate
|
||||||
<kbd>PgUp</kbd>/<kbd>PgDn</kbd> or <kbd>ctrl</kbd>+<kbd>u</kbd>/<kbd>ctrl</kbd>+<kbd>d</kbd>: scroll diff panel
|
<kbd>PgUp</kbd>/<kbd>PgDn</kbd> or <kbd>ctrl</kbd>+<kbd>u</kbd>/<kbd>ctrl</kbd>+<kbd>d</kbd>: scroll diff panel
|
||||||
(for <kbd>PgUp</kbd> and <kbd>PgDn</kbd>, use <kbd>fn</kbd>+<kbd>up</kbd>/<kbd>fn</kbd>+<kbd>down</kbd> on osx)
|
(for <kbd>PgUp</kbd> and <kbd>PgDn</kbd>, use <kbd>fn</kbd>+<kbd>up</kbd>/<kbd>fn</kbd>+<kbd>down</kbd> on osx)
|
||||||
<kbd>q</kbd>: quit
|
<kbd>q</kbd>: quit
|
||||||
<kbd>p</kbd>: pull
|
<kbd>p</kbd>: pull
|
||||||
<kbd>shift</kbd>+<kbd>P</kbd>: push
|
<kbd>shift</kbd>+<kbd>P</kbd>: push
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
## Status Panel:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<kbd>e</kbd>: edit config file
|
||||||
|
<kbd>o</kbd>: open config file
|
||||||
|
</pre>
|
||||||
|
|
||||||
## Files Panel:
|
## Files Panel:
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<kbd>space</kbd>: toggle staged
|
<kbd>space</kbd>: toggle staged
|
||||||
<kbd>c</kbd>: commit changes
|
<kbd>c</kbd>: commit changes
|
||||||
@ -27,6 +36,7 @@
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
## Branches Panel:
|
## Branches Panel:
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<kbd>space</kbd>: checkout branch
|
<kbd>space</kbd>: checkout branch
|
||||||
<kbd>f</kbd>: force checkout branch
|
<kbd>f</kbd>: force checkout branch
|
||||||
@ -37,6 +47,7 @@
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
## Commits Panel:
|
## Commits Panel:
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<kbd>s</kbd>: squash down (only available for topmost commit)
|
<kbd>s</kbd>: squash down (only available for topmost commit)
|
||||||
<kbd>r</kbd>: rename commit
|
<kbd>r</kbd>: rename commit
|
||||||
@ -44,6 +55,7 @@
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
## Stash Panel:
|
## Stash Panel:
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<kbd>space</kbd>: apply
|
<kbd>space</kbd>: apply
|
||||||
<kbd>g</kbd>: pop
|
<kbd>g</kbd>: pop
|
||||||
@ -51,6 +63,7 @@
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
## Popup Panel:
|
## Popup Panel:
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<kbd>esc</kbd>: close/cancel
|
<kbd>esc</kbd>: close/cancel
|
||||||
<kbd>enter</kbd>: confirm
|
<kbd>enter</kbd>: confirm
|
||||||
@ -58,6 +71,7 @@
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
## Resolving Merge Conflicts (Diff Panel):
|
## Resolving Merge Conflicts (Diff Panel):
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<kbd>←</kbd><kbd>→</kbd>/<kbd>h</kbd><kbd>l</kbd>: navigate conflicts
|
<kbd>←</kbd><kbd>→</kbd>/<kbd>h</kbd><kbd>l</kbd>: navigate conflicts
|
||||||
<kbd>↑</kbd><kbd>↓</kbd>/<kbd>k</kbd><kbd>j</kbd>: select hunk
|
<kbd>↑</kbd><kbd>↓</kbd>/<kbd>k</kbd><kbd>j</kbd>: select hunk
|
||||||
|
@ -131,7 +131,7 @@ func (c *OSCommand) OpenFile(filename string) (*exec.Cmd, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = c.RunCommand(cmdName + " " + filename + cmdTrail) // TODO: test on linux
|
err = c.RunCommand(cmdName + " " + c.Quote(filename) + cmdTrail) // TODO: test on linux
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,15 +228,9 @@ func (gui *Gui) PrepareSubProcess(g *gocui.Gui, commands ...string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) genericFileOpen(g *gocui.Gui, v *gocui.View, open func(string) (*exec.Cmd, error)) error {
|
func (gui *Gui) genericFileOpen(g *gocui.Gui, v *gocui.View, filename string, open func(string) (*exec.Cmd, error)) error {
|
||||||
file, err := gui.getSelectedFile(g)
|
|
||||||
if err != nil {
|
sub, err := open(filename)
|
||||||
if err != gui.Errors.ErrNoFiles {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
sub, err := open(file.Name)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return gui.createErrorPanel(g, err.Error())
|
return gui.createErrorPanel(g, err.Error())
|
||||||
}
|
}
|
||||||
@ -248,19 +242,35 @@ func (gui *Gui) genericFileOpen(g *gocui.Gui, v *gocui.View, open func(string) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleFileEdit(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleFileEdit(g *gocui.Gui, v *gocui.View) error {
|
||||||
return gui.genericFileOpen(g, v, gui.OSCommand.EditFile)
|
file, err := gui.getSelectedFile(g)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return gui.genericFileOpen(g, v, file.Name, gui.OSCommand.EditFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleFileOpen(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleFileOpen(g *gocui.Gui, v *gocui.View) error {
|
||||||
return gui.genericFileOpen(g, v, gui.OSCommand.OpenFile)
|
file, err := gui.getSelectedFile(g)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return gui.genericFileOpen(g, v, file.Name, gui.OSCommand.OpenFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleSublimeFileOpen(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleSublimeFileOpen(g *gocui.Gui, v *gocui.View) error {
|
||||||
return gui.genericFileOpen(g, v, gui.OSCommand.SublimeOpenFile)
|
file, err := gui.getSelectedFile(g)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return gui.genericFileOpen(g, v, file.Name, gui.OSCommand.SublimeOpenFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleVsCodeFileOpen(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleVsCodeFileOpen(g *gocui.Gui, v *gocui.View) error {
|
||||||
return gui.genericFileOpen(g, v, gui.OSCommand.VsCodeOpenFile)
|
file, err := gui.getSelectedFile(g)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return gui.genericFileOpen(g, v, file.Name, gui.OSCommand.VsCodeOpenFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleRefreshFiles(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleRefreshFiles(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
@ -257,7 +257,9 @@ func (gui *Gui) layout(g *gocui.Gui) error {
|
|||||||
v.BgColor = gocui.ColorDefault
|
v.BgColor = gocui.ColorDefault
|
||||||
v.FgColor = gocui.ColorGreen
|
v.FgColor = gocui.ColorGreen
|
||||||
v.Frame = false
|
v.Frame = false
|
||||||
gui.renderString(g, "version", version)
|
if err := gui.renderString(g, "version", version); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// these are only called once
|
// these are only called once
|
||||||
gui.handleFileSelect(g, filesView)
|
gui.handleFileSelect(g, filesView)
|
||||||
@ -265,7 +267,9 @@ func (gui *Gui) layout(g *gocui.Gui) error {
|
|||||||
gui.refreshBranches(g)
|
gui.refreshBranches(g)
|
||||||
gui.refreshCommits(g)
|
gui.refreshCommits(g)
|
||||||
gui.refreshStashEntries(g)
|
gui.refreshStashEntries(g)
|
||||||
gui.nextView(g, nil)
|
if err := gui.switchFocus(g, nil, filesView); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gui.resizePopupPanels(g)
|
gui.resizePopupPanels(g)
|
||||||
|
@ -23,6 +23,8 @@ func (gui *Gui) keybindings(g *gocui.Gui) error {
|
|||||||
{ViewName: "", Key: 'P', Modifier: gocui.ModNone, Handler: gui.pushFiles},
|
{ViewName: "", Key: 'P', Modifier: gocui.ModNone, Handler: gui.pushFiles},
|
||||||
{ViewName: "", Key: 'p', Modifier: gocui.ModNone, Handler: gui.pullFiles},
|
{ViewName: "", Key: 'p', Modifier: gocui.ModNone, Handler: gui.pullFiles},
|
||||||
{ViewName: "", Key: 'R', Modifier: gocui.ModNone, Handler: gui.handleRefresh},
|
{ViewName: "", Key: 'R', Modifier: gocui.ModNone, Handler: gui.handleRefresh},
|
||||||
|
{ViewName: "status", Key: 'e', Modifier: gocui.ModNone, Handler: gui.handleEditConfig},
|
||||||
|
{ViewName: "status", Key: 'o', Modifier: gocui.ModNone, Handler: gui.handleOpenConfig},
|
||||||
{ViewName: "files", Key: 'c', Modifier: gocui.ModNone, Handler: gui.handleCommitPress},
|
{ViewName: "files", Key: 'c', Modifier: gocui.ModNone, Handler: gui.handleCommitPress},
|
||||||
{ViewName: "files", Key: 'C', Modifier: gocui.ModNone, Handler: gui.handleCommitEditorPress},
|
{ViewName: "files", Key: 'C', Modifier: gocui.ModNone, Handler: gui.handleCommitEditorPress},
|
||||||
{ViewName: "files", Key: gocui.KeySpace, Modifier: gocui.ModNone, Handler: gui.handleFilePress},
|
{ViewName: "files", Key: gocui.KeySpace, Modifier: gocui.ModNone, Handler: gui.handleFilePress},
|
||||||
@ -70,7 +72,7 @@ func (gui *Gui) keybindings(g *gocui.Gui) error {
|
|||||||
|
|
||||||
// Would make these keybindings global but that interferes with editing
|
// Would make these keybindings global but that interferes with editing
|
||||||
// input in the confirmation panel
|
// input in the confirmation panel
|
||||||
for _, viewName := range []string{"files", "branches", "commits", "stash"} {
|
for _, viewName := range []string{"status", "files", "branches", "commits", "stash"} {
|
||||||
bindings = append(bindings, []Binding{
|
bindings = append(bindings, []Binding{
|
||||||
{ViewName: viewName, Key: gocui.KeyTab, Modifier: gocui.ModNone, Handler: gui.nextView},
|
{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.KeyArrowLeft, Modifier: gocui.ModNone, Handler: gui.previousView},
|
||||||
|
@ -40,3 +40,24 @@ func (gui *Gui) refreshStatus(g *gocui.Gui) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) renderStatusOptions(g *gocui.Gui) error {
|
||||||
|
return gui.renderOptionsMap(g, map[string]string{
|
||||||
|
"o": gui.Tr.SLocalize("OpenConfig"),
|
||||||
|
"e": gui.Tr.SLocalize("EditConfig"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) handleStatusSelect(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
return gui.renderStatusOptions(g)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) handleOpenConfig(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
filename := gui.Config.GetUserConfig().ConfigFileUsed()
|
||||||
|
return gui.genericFileOpen(g, v, filename, gui.OSCommand.OpenFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) handleEditConfig(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
filename := gui.Config.GetUserConfig().ConfigFileUsed()
|
||||||
|
return gui.genericFileOpen(g, v, filename, gui.OSCommand.EditFile)
|
||||||
|
}
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/jesseduffield/gocui"
|
"github.com/jesseduffield/gocui"
|
||||||
)
|
)
|
||||||
|
|
||||||
var cyclableViews = []string{"files", "branches", "commits", "stash"}
|
var cyclableViews = []string{"status", "files", "branches", "commits", "stash"}
|
||||||
|
|
||||||
func (gui *Gui) refreshSidePanels(g *gocui.Gui) error {
|
func (gui *Gui) refreshSidePanels(g *gocui.Gui) error {
|
||||||
gui.refreshBranches(g)
|
gui.refreshBranches(g)
|
||||||
@ -81,6 +81,8 @@ func (gui *Gui) newLineFocused(g *gocui.Gui, v *gocui.View) error {
|
|||||||
mainView.SetOrigin(0, 0)
|
mainView.SetOrigin(0, 0)
|
||||||
|
|
||||||
switch v.Name() {
|
switch v.Name() {
|
||||||
|
case "status":
|
||||||
|
return gui.handleStatusSelect(g, v)
|
||||||
case "files":
|
case "files":
|
||||||
return gui.handleFileSelect(g, v)
|
return gui.handleFileSelect(g, v)
|
||||||
case "branches":
|
case "branches":
|
||||||
|
@ -294,6 +294,12 @@ func addEnglish(i18nObject *i18n.Bundle) {
|
|||||||
}, &i18n.Message{
|
}, &i18n.Message{
|
||||||
ID: "MergeAborted",
|
ID: "MergeAborted",
|
||||||
Other: "Merge aborted",
|
Other: "Merge aborted",
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "OpenConfig",
|
||||||
|
Other: "open config file",
|
||||||
|
}, &i18n.Message{
|
||||||
|
ID: "EditConfig",
|
||||||
|
Other: "edit config file",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user