diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2018-08-18 14:52:01 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2018-08-18 14:54:05 +1000 |
commit | a1a828a781e805a8964c35305edf0365d4aa7068 (patch) | |
tree | 6aa23a0f461d3b91adc02522e51ea0c993c99714 | |
parent | 6b150a4be0e7712d8b8706f10bb80e34094f872b (diff) |
support opening and editing config file
-rw-r--r-- | docs/Keybindings.md | 16 | ||||
-rw-r--r-- | pkg/commands/os.go | 2 | ||||
-rw-r--r-- | pkg/gui/files_panel.go | 36 | ||||
-rw-r--r-- | pkg/gui/gui.go | 8 | ||||
-rw-r--r-- | pkg/gui/keybindings.go | 4 | ||||
-rw-r--r-- | pkg/gui/status_panel.go | 21 | ||||
-rw-r--r-- | pkg/gui/view_helpers.go | 4 | ||||
-rw-r--r-- | pkg/i18n/english.go | 6 |
8 files changed, 78 insertions, 19 deletions
diff --git a/docs/Keybindings.md b/docs/Keybindings.md index 2b9f9d952..2a1b1817f 100644 --- a/docs/Keybindings.md +++ b/docs/Keybindings.md @@ -1,16 +1,25 @@ # Keybindings: ## Global: + <pre> <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) <kbd>q</kbd>: quit <kbd>p</kbd>: pull <kbd>shift</kbd>+<kbd>P</kbd>: push </pre> +## Status Panel: + +<pre> + <kbd>e</kbd>: edit config file + <kbd>o</kbd>: open config file +</pre> + ## Files Panel: + <pre> <kbd>space</kbd>: toggle staged <kbd>c</kbd>: commit changes @@ -27,6 +36,7 @@ </pre> ## Branches Panel: + <pre> <kbd>space</kbd>: checkout branch <kbd>f</kbd>: force checkout branch @@ -37,6 +47,7 @@ </pre> ## Commits Panel: + <pre> <kbd>s</kbd>: squash down (only available for topmost commit) <kbd>r</kbd>: rename commit @@ -44,6 +55,7 @@ </pre> ## Stash Panel: + <pre> <kbd>space</kbd>: apply <kbd>g</kbd>: pop @@ -51,6 +63,7 @@ </pre> ## Popup Panel: + <pre> <kbd>esc</kbd>: close/cancel <kbd>enter</kbd>: confirm @@ -58,6 +71,7 @@ </pre> ## Resolving Merge Conflicts (Diff Panel): + <pre> <kbd>←</kbd><kbd>→</kbd>/<kbd>h</kbd><kbd>l</kbd>: navigate conflicts <kbd>↑</kbd><kbd>↓</kbd>/<kbd>k</kbd><kbd>j</kbd>: select hunk diff --git a/pkg/commands/os.go b/pkg/commands/os.go index f5efbac63..32514a419 100644 --- a/pkg/commands/os.go +++ b/pkg/commands/os.go @@ -131,7 +131,7 @@ func (c *OSCommand) OpenFile(filename string) (*exec.Cmd, error) { if err != nil { 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 } diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 27589bc19..166af4108 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -228,15 +228,9 @@ func (gui *Gui) PrepareSubProcess(g *gocui.Gui, commands ...string) error { return nil } -func (gui *Gui) genericFileOpen(g *gocui.Gui, v *gocui.View, open func(string) (*exec.Cmd, error)) error { - file, err := gui.getSelectedFile(g) - if err != nil { - if err != gui.Errors.ErrNoFiles { - return err - } - return nil - } - sub, err := open(file.Name) +func (gui *Gui) genericFileOpen(g *gocui.Gui, v *gocui.View, filename string, open func(string) (*exec.Cmd, error)) error { + + sub, err := open(filename) if err != nil { 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 { - 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 { - 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 { - 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 { - 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 { diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 05d0a1ae0..1e7b6156b 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -257,7 +257,9 @@ func (gui *Gui) layout(g *gocui.Gui) error { v.BgColor = gocui.ColorDefault v.FgColor = gocui.ColorGreen v.Frame = false - gui.renderString(g, "version", version) + if err := gui.renderString(g, "version", version); err != nil { + return err + } // these are only called once gui.handleFileSelect(g, filesView) @@ -265,7 +267,9 @@ func (gui *Gui) layout(g *gocui.Gui) error { gui.refreshBranches(g) gui.refreshCommits(g) gui.refreshStashEntries(g) - gui.nextView(g, nil) + if err := gui.switchFocus(g, nil, filesView); err != nil { + return err + } } gui.resizePopupPanels(g) diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index b4f2bdc57..68cccda6b 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -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.pullFiles}, {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.handleCommitEditorPress}, {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 // 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{ {ViewName: viewName, Key: gocui.KeyTab, Modifier: gocui.ModNone, Handler: gui.nextView}, {ViewName: viewName, Key: gocui.KeyArrowLeft, Modifier: gocui.ModNone, Handler: gui.previousView}, diff --git a/pkg/gui/status_panel.go b/pkg/gui/status_panel.go index 67f133738..544f5e880 100644 --- a/pkg/gui/status_panel.go +++ b/pkg/gui/status_panel.go @@ -40,3 +40,24 @@ func (gui *Gui) refreshStatus(g *gocui.Gui) error { 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) +} diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index 95324ecde..46fc79e40 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -9,7 +9,7 @@ import ( "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 { gui.refreshBranches(g) @@ -81,6 +81,8 @@ func (gui *Gui) newLineFocused(g *gocui.Gui, v *gocui.View) error { mainView.SetOrigin(0, 0) switch v.Name() { + case "status": + return gui.handleStatusSelect(g, v) case "files": return gui.handleFileSelect(g, v) case "branches": diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index d67bd9053..c6d1d1379 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -294,6 +294,12 @@ func addEnglish(i18nObject *i18n.Bundle) { }, &i18n.Message{ ID: "MergeAborted", Other: "Merge aborted", + }, &i18n.Message{ + ID: "OpenConfig", + Other: "open config file", + }, &i18n.Message{ + ID: "EditConfig", + Other: "edit config file", }, ) } |