From 7c6c63254c81a386b53af6798e19459c691eb5aa Mon Sep 17 00:00:00 2001 From: Josh Medeski Date: Thu, 12 Sep 2024 19:37:30 -0500 Subject: [PATCH 1/5] feat: add GetLastTmuxSession function --- lister/lister.go | 1 + lister/tmux.go | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/lister/lister.go b/lister/lister.go index 409f8cc..d47d913 100644 --- a/lister/lister.go +++ b/lister/lister.go @@ -10,6 +10,7 @@ import ( type Lister interface { List(opts ListOptions) (model.SeshSessions, error) FindTmuxSession(name string) (model.SeshSession, bool) + GetLastTmuxSession() (model.SeshSession, bool) FindConfigSession(name string) (model.SeshSession, bool) FindZoxideSession(name string) (model.SeshSession, bool) } diff --git a/lister/tmux.go b/lister/tmux.go index cabde8b..597b50e 100644 --- a/lister/tmux.go +++ b/lister/tmux.go @@ -47,3 +47,15 @@ func (l *RealLister) FindTmuxSession(name string) (model.SeshSession, bool) { return model.SeshSession{}, false } } + +func (l *RealLister) GetLastTmuxSession() (model.SeshSession, bool) { + sessions, err := listTmux(l) + if err != nil { + return model.SeshSession{}, false + } + if len(sessions.OrderedIndex) < 2 { + return model.SeshSession{}, false + } + secondSessionIndex := sessions.OrderedIndex[1] + return sessions.Directory[secondSessionIndex], true +} From 3ac7cd5c1185f39082d15589bdbb84214263579b Mon Sep 17 00:00:00 2001 From: Josh Medeski Date: Thu, 12 Sep 2024 19:39:39 -0500 Subject: [PATCH 2/5] feat: add a last cli command --- seshcli/last.go | 26 ++++++++++++++++++++++++++ seshcli/seshcli.go | 1 + 2 files changed, 27 insertions(+) create mode 100644 seshcli/last.go diff --git a/seshcli/last.go b/seshcli/last.go new file mode 100644 index 0000000..bf909b1 --- /dev/null +++ b/seshcli/last.go @@ -0,0 +1,26 @@ +package seshcli + +import ( + "github.com/joshmedeski/sesh/lister" + "github.com/joshmedeski/sesh/tmux" + cli "github.com/urfave/cli/v2" +) + +func Last(l lister.Lister, t tmux.Tmux) *cli.Command { + return &cli.Command{ + Name: "last", + Aliases: []string{"L"}, + Usage: "Connect to the last tmux session", + UseShortOptionHandling: true, + Flags: []cli.Flag{}, + Action: func(cCtx *cli.Context) error { + lastSession, exists := l.GetLastTmuxSession() + if !exists { + // TODO: silently fail? + return cli.Exit("No last session found", 1) + } + t.SwitchClient(lastSession.Name) + return nil + }, + } +} diff --git a/seshcli/seshcli.go b/seshcli/seshcli.go index bc2791b..b835adc 100644 --- a/seshcli/seshcli.go +++ b/seshcli/seshcli.go @@ -59,6 +59,7 @@ func App(version string) cli.App { Usage: "Smart session manager for the terminal", Commands: []*cli.Command{ List(icon, json, lister), + Last(lister, tmux), Connect(connector, icon), Clone(), }, From 4e71c11e1210229a2c905decde5079708e5a3525 Mon Sep 17 00:00:00 2001 From: Josh Medeski Date: Thu, 12 Sep 2024 19:50:18 -0500 Subject: [PATCH 3/5] docs: describe sesh last and config sample --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 8119680..5f93225 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,18 @@ bind-key x kill-pane # skip "kill-pane 1? (y/n)" prompt set -g detach-on-destroy off # don't exit from tmux when closing a session ``` +## Bonus: sesh last + +The default `+L` command will "Switch the attached client back to the last session." However, if you close a session while `detach-on-destroy off` is set, the last session will not be found. To fix this, I have a `sesh last` command that will always switch the client to the second to last session that has been attached. + +Add the following to your `tmux.conf` to overwrite the default `last-session` command: + +```sh +bind -N "last-session (via sesh) " L run-shell "sesh-dev last" +``` + +```` + ## Configuration You can configure sesh by creating a `sesh.toml` file in your `$XDG_CONFIG_HOME/sesh` or `$HOME/.config/sesh` directory. From b10c402437574489d93246cfc8d5f8a4b0f73c14 Mon Sep 17 00:00:00 2001 From: Josh Medeski Date: Thu, 12 Sep 2024 19:51:21 -0500 Subject: [PATCH 4/5] chore: udpate mock lister --- lister/mock_Lister.go | 57 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/lister/mock_Lister.go b/lister/mock_Lister.go index d2055e8..71ae468 100644 --- a/lister/mock_Lister.go +++ b/lister/mock_Lister.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package lister @@ -188,6 +188,61 @@ func (_c *MockLister_FindZoxideSession_Call) RunAndReturn(run func(string) (mode return _c } +// GetLastTmuxSession provides a mock function with given fields: +func (_m *MockLister) GetLastTmuxSession() (model.SeshSession, bool) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetLastTmuxSession") + } + + var r0 model.SeshSession + var r1 bool + if rf, ok := ret.Get(0).(func() (model.SeshSession, bool)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() model.SeshSession); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(model.SeshSession) + } + + if rf, ok := ret.Get(1).(func() bool); ok { + r1 = rf() + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// MockLister_GetLastTmuxSession_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastTmuxSession' +type MockLister_GetLastTmuxSession_Call struct { + *mock.Call +} + +// GetLastTmuxSession is a helper method to define mock.On call +func (_e *MockLister_Expecter) GetLastTmuxSession() *MockLister_GetLastTmuxSession_Call { + return &MockLister_GetLastTmuxSession_Call{Call: _e.mock.On("GetLastTmuxSession")} +} + +func (_c *MockLister_GetLastTmuxSession_Call) Run(run func()) *MockLister_GetLastTmuxSession_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *MockLister_GetLastTmuxSession_Call) Return(_a0 model.SeshSession, _a1 bool) *MockLister_GetLastTmuxSession_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *MockLister_GetLastTmuxSession_Call) RunAndReturn(run func() (model.SeshSession, bool)) *MockLister_GetLastTmuxSession_Call { + _c.Call.Return(run) + return _c +} + // List provides a mock function with given fields: opts func (_m *MockLister) List(opts ListOptions) (model.SeshSessions, error) { ret := _m.Called(opts) From 9cdaf83df95eef75d4ca87b2c56ca4b68f5a2f57 Mon Sep 17 00:00:00 2001 From: Josh Medeski Date: Thu, 12 Sep 2024 19:51:27 -0500 Subject: [PATCH 5/5] feat: update mockery version --- cloner/mock_Cloner.go | 2 +- configurator/mock_Configurator.go | 2 +- connector/mock_Connector.go | 2 +- dir/mock_Dir.go | 2 +- execwrap/mock_Exec.go | 2 +- execwrap/mock_ExecCmd.go | 2 +- git/mock_Git.go | 2 +- home/mock_Home.go | 2 +- icon/mock_Icon.go | 2 +- json/mock_Json.go | 2 +- lister/mock_srcStrategy.go | 2 +- namer/mock_Namer.go | 2 +- oswrap/mock_Os.go | 2 +- pathwrap/mock_Path.go | 2 +- runtimewrap/mock_Runtime.go | 2 +- shell/mock_Shell.go | 2 +- startup/mock_Startup.go | 2 +- tmux/mock_Tmux.go | 2 +- zoxide/mock_Zoxide.go | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/cloner/mock_Cloner.go b/cloner/mock_Cloner.go index f5d81b2..b5d79b3 100644 --- a/cloner/mock_Cloner.go +++ b/cloner/mock_Cloner.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package cloner diff --git a/configurator/mock_Configurator.go b/configurator/mock_Configurator.go index 8c9cc55..174e33c 100644 --- a/configurator/mock_Configurator.go +++ b/configurator/mock_Configurator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package configurator diff --git a/connector/mock_Connector.go b/connector/mock_Connector.go index 0f35fb2..c0b74bb 100644 --- a/connector/mock_Connector.go +++ b/connector/mock_Connector.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package connector diff --git a/dir/mock_Dir.go b/dir/mock_Dir.go index a9567fa..a5ee41a 100644 --- a/dir/mock_Dir.go +++ b/dir/mock_Dir.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package dir diff --git a/execwrap/mock_Exec.go b/execwrap/mock_Exec.go index cca0153..a3509f8 100644 --- a/execwrap/mock_Exec.go +++ b/execwrap/mock_Exec.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package execwrap diff --git a/execwrap/mock_ExecCmd.go b/execwrap/mock_ExecCmd.go index 77863a2..ce01172 100644 --- a/execwrap/mock_ExecCmd.go +++ b/execwrap/mock_ExecCmd.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package execwrap diff --git a/git/mock_Git.go b/git/mock_Git.go index a853e5c..c852a23 100644 --- a/git/mock_Git.go +++ b/git/mock_Git.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package git diff --git a/home/mock_Home.go b/home/mock_Home.go index ce48cb3..e3a1e33 100644 --- a/home/mock_Home.go +++ b/home/mock_Home.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package home diff --git a/icon/mock_Icon.go b/icon/mock_Icon.go index 5c9395c..8c383b5 100644 --- a/icon/mock_Icon.go +++ b/icon/mock_Icon.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package icon diff --git a/json/mock_Json.go b/json/mock_Json.go index 235207d..e070bc3 100644 --- a/json/mock_Json.go +++ b/json/mock_Json.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package json diff --git a/lister/mock_srcStrategy.go b/lister/mock_srcStrategy.go index eb835b0..28163fa 100644 --- a/lister/mock_srcStrategy.go +++ b/lister/mock_srcStrategy.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package lister diff --git a/namer/mock_Namer.go b/namer/mock_Namer.go index 19d2eed..0a407f4 100644 --- a/namer/mock_Namer.go +++ b/namer/mock_Namer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package namer diff --git a/oswrap/mock_Os.go b/oswrap/mock_Os.go index be66496..b0028bf 100644 --- a/oswrap/mock_Os.go +++ b/oswrap/mock_Os.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package oswrap diff --git a/pathwrap/mock_Path.go b/pathwrap/mock_Path.go index cdd70ad..299bc3c 100644 --- a/pathwrap/mock_Path.go +++ b/pathwrap/mock_Path.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package pathwrap diff --git a/runtimewrap/mock_Runtime.go b/runtimewrap/mock_Runtime.go index d647bbf..72c5d28 100644 --- a/runtimewrap/mock_Runtime.go +++ b/runtimewrap/mock_Runtime.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package runtimewrap diff --git a/shell/mock_Shell.go b/shell/mock_Shell.go index c48ca86..5537b4b 100644 --- a/shell/mock_Shell.go +++ b/shell/mock_Shell.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package shell diff --git a/startup/mock_Startup.go b/startup/mock_Startup.go index c33b25b..18b039c 100644 --- a/startup/mock_Startup.go +++ b/startup/mock_Startup.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package startup diff --git a/tmux/mock_Tmux.go b/tmux/mock_Tmux.go index ed914ed..a5fb90c 100644 --- a/tmux/mock_Tmux.go +++ b/tmux/mock_Tmux.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package tmux diff --git a/zoxide/mock_Zoxide.go b/zoxide/mock_Zoxide.go index bebabbe..37f73e0 100644 --- a/zoxide/mock_Zoxide.go +++ b/zoxide/mock_Zoxide.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.45.0. DO NOT EDIT. +// Code generated by mockery v2.45.1. DO NOT EDIT. package zoxide