summaryrefslogtreecommitdiffhomepage
path: root/packages/tui/internal
diff options
context:
space:
mode:
authorAdi Yeroslav <[email protected]>2025-07-16 15:43:48 +0300
committerGitHub <[email protected]>2025-07-16 07:43:48 -0500
commit57d1a60efcd0bc7cc5709fac75a46270e344e43d (patch)
treebbf56e3cd86a15eeff653fad9e98dd5f7a2cb835 /packages/tui/internal
parentadd81b97396730ed3e838e8ca8e3a20a64013113 (diff)
downloadopencode-57d1a60efcd0bc7cc5709fac75a46270e344e43d.tar.gz
opencode-57d1a60efcd0bc7cc5709fac75a46270e344e43d.zip
feat(tui): shift+tab to cycle modes backward (#1049)
Diffstat (limited to 'packages/tui/internal')
-rw-r--r--packages/tui/internal/app/app.go23
-rw-r--r--packages/tui/internal/commands/command.go8
-rw-r--r--packages/tui/internal/tui/tui.go4
3 files changed, 30 insertions, 5 deletions
diff --git a/packages/tui/internal/app/app.go b/packages/tui/internal/app/app.go
index 52be32694..818203b98 100644
--- a/packages/tui/internal/app/app.go
+++ b/packages/tui/internal/app/app.go
@@ -205,10 +205,17 @@ func (a *App) SetClipboard(text string) tea.Cmd {
return tea.Sequence(cmds...)
}
-func (a *App) SwitchMode() (*App, tea.Cmd) {
- a.ModeIndex++
- if a.ModeIndex >= len(a.Modes) {
- a.ModeIndex = 0
+func (a *App) cycleMode(forward bool) (*App, tea.Cmd) {
+ if forward {
+ a.ModeIndex++
+ if a.ModeIndex >= len(a.Modes) {
+ a.ModeIndex = 0
+ }
+ } else {
+ a.ModeIndex--
+ if a.ModeIndex < 0 {
+ a.ModeIndex = len(a.Modes) - 1
+ }
}
a.Mode = &a.Modes[a.ModeIndex]
@@ -244,6 +251,14 @@ func (a *App) SwitchMode() (*App, tea.Cmd) {
}
}
+func (a *App) SwitchMode() (*App, tea.Cmd) {
+ return a.cycleMode(true)
+}
+
+func (a *App) SwitchModeReverse() (*App, tea.Cmd) {
+ return a.cycleMode(false)
+}
+
func (a *App) InitializeProvider() tea.Cmd {
providersResponse, err := a.Client.Config.Providers(context.Background())
if err != nil {
diff --git a/packages/tui/internal/commands/command.go b/packages/tui/internal/commands/command.go
index f04bbfa12..6ceec5fa1 100644
--- a/packages/tui/internal/commands/command.go
+++ b/packages/tui/internal/commands/command.go
@@ -87,6 +87,7 @@ func (r CommandRegistry) Matches(msg tea.KeyPressMsg, leader bool) []Command {
const (
AppHelpCommand CommandName = "app_help"
SwitchModeCommand CommandName = "switch_mode"
+ SwitchModeReverseCommand CommandName = "switch_mode_reverse"
EditorOpenCommand CommandName = "editor_open"
SessionNewCommand CommandName = "session_new"
SessionListCommand CommandName = "session_list"
@@ -156,10 +157,15 @@ func LoadFromConfig(config *opencode.Config) CommandRegistry {
},
{
Name: SwitchModeCommand,
- Description: "switch mode",
+ Description: "next mode",
Keybindings: parseBindings("tab"),
},
{
+ Name: SwitchModeReverseCommand,
+ Description: "previous mode",
+ Keybindings: parseBindings("shift+tab"),
+ },
+ {
Name: EditorOpenCommand,
Description: "open editor",
Keybindings: parseBindings("<leader>e"),
diff --git a/packages/tui/internal/tui/tui.go b/packages/tui/internal/tui/tui.go
index 3227b4950..eb7d1d3c5 100644
--- a/packages/tui/internal/tui/tui.go
+++ b/packages/tui/internal/tui/tui.go
@@ -810,6 +810,10 @@ func (a appModel) executeCommand(command commands.Command) (tea.Model, tea.Cmd)
updated, cmd := a.app.SwitchMode()
a.app = updated
cmds = append(cmds, cmd)
+ case commands.SwitchModeReverseCommand:
+ updated, cmd := a.app.SwitchModeReverse()
+ a.app = updated
+ cmds = append(cmds, cmd)
case commands.EditorOpenCommand:
if a.app.IsBusy() {
// status.Warn("Agent is working, please wait...")