diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2019-10-07 12:34:12 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2019-11-11 21:45:31 +1100 |
commit | cbc82cd3c1e8668d37aad049401222a382613f98 (patch) | |
tree | 1925bc51831d4f8c7505947e1cef70e7f88d2e68 | |
parent | 29ee2399876bccbc4fe388252545df2763b11029 (diff) |
allow for changing the current directory on exit
For this to work you'll need to put this in your ~/.zshrc (or equivalent rc file):
lg()
{
export LAZYGIT_NEW_DIR_FILE=/Users/jesseduffieldduffield/Library/Application\ Support/jesseduffield/lazygit/.lastd
lazygit "$@"
if [ -f $LAZYGIT_NEW_DIR_FILE ]; then
cd "$(cat $LAZYGIT_NEW_DIR_FILE)"
rm -f $LAZYGIT_NEW_DIR_FILE > /dev/null
fi
}
-rw-r--r-- | pkg/gui/gui.go | 19 | ||||
-rw-r--r-- | pkg/gui/keybindings.go | 11 | ||||
-rw-r--r-- | pkg/gui/quitting.go | 48 |
3 files changed, 63 insertions, 15 deletions
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index b65f01747..982e1879c 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -160,6 +160,7 @@ type guiState struct { Context string // important not to set this value directly but to use gui.changeContext("new context") CherryPickedCommits []*commands.Commit SplitMainPanel bool + RetainOriginalDir bool } // for now the split view will always be on @@ -779,6 +780,12 @@ func (gui *Gui) RunWithSubprocesses() error { for { if err := gui.Run(); err != nil { if err == gocui.ErrQuit { + if !gui.State.RetainOriginalDir { + if err := gui.recordCurrentDirectory(); err != nil { + return err + } + } + break } else if err == gui.Errors.ErrSwitchRepo { continue @@ -818,18 +825,6 @@ func (gui *Gui) runCommand() error { return nil } -func (gui *Gui) quit(g *gocui.Gui, v *gocui.View) error { - if gui.State.Updating { - return gui.createUpdateQuitConfirmation(g, v) - } - if gui.Config.GetUserConfig().GetBool("confirmOnQuit") { - return gui.createConfirmationPanel(g, v, true, "", gui.Tr.SLocalize("ConfirmQuit"), func(g *gocui.Gui, v *gocui.View) error { - return gocui.ErrQuit - }, nil) - } - return gocui.ErrQuit -} - func (gui *Gui) handleDonate(g *gocui.Gui, v *gocui.View) error { if !gui.g.Mouse { return nil diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 9bcd7ec42..6b1aec020 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -72,17 +72,22 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { ViewName: "", Key: 'q', Modifier: gocui.ModNone, - Handler: gui.quit, + Handler: gui.handleQuit, + }, { + ViewName: "", + Key: 'Q', + Modifier: gocui.ModNone, + Handler: gui.handleQuitWithoutChangingDirectory, }, { ViewName: "", Key: gocui.KeyCtrlC, Modifier: gocui.ModNone, - Handler: gui.quit, + Handler: gui.handleQuit, }, { ViewName: "", Key: gocui.KeyEsc, Modifier: gocui.ModNone, - Handler: gui.quit, + Handler: gui.handleQuit, }, { ViewName: "", Key: gocui.KeyPgup, diff --git a/pkg/gui/quitting.go b/pkg/gui/quitting.go new file mode 100644 index 000000000..fca71d221 --- /dev/null +++ b/pkg/gui/quitting.go @@ -0,0 +1,48 @@ +package gui + +import ( + "os" + + "github.com/jesseduffield/gocui" +) + +// when a user runs lazygit with the LAZYGIT_NEW_DIR_FILE env variable defined +// we will write the current directory to that file on exit so that their +// shell can then change to that directory. That means you don't get kicked +// back to the directory that you started with. +func (gui *Gui) recordCurrentDirectory() error { + if os.Getenv("LAZYGIT_NEW_DIR_FILE") == "" { + return nil + } + + // determine current directory, set it in LAZYGIT_NEW_DIR_FILE + dirName, err := os.Getwd() + if err != nil { + return err + } + + return gui.OSCommand.CreateFileWithContent(os.Getenv("LAZYGIT_NEW_DIR_FILE"), dirName) +} + +func (gui *Gui) handleQuitWithoutChangingDirectory(g *gocui.Gui, v *gocui.View) error { + gui.State.RetainOriginalDir = true + return gui.quit(v) +} + +func (gui *Gui) handleQuit(g *gocui.Gui, v *gocui.View) error { + gui.State.RetainOriginalDir = false + return gui.quit(v) +} + +func (gui *Gui) quit(v *gocui.View) error { + if gui.State.Updating { + return gui.createUpdateQuitConfirmation(gui.g, v) + } + if gui.Config.GetUserConfig().GetBool("confirmOnQuit") { + return gui.createConfirmationPanel(gui.g, v, true, "", gui.Tr.SLocalize("ConfirmQuit"), func(g *gocui.Gui, v *gocui.View) error { + return gocui.ErrQuit + }, nil) + } + + return gocui.ErrQuit +} |