summaryrefslogtreecommitdiffhomepage
path: root/packages
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
parentadd81b97396730ed3e838e8ca8e3a20a64013113 (diff)
downloadopencode-57d1a60efcd0bc7cc5709fac75a46270e344e43d.tar.gz
opencode-57d1a60efcd0bc7cc5709fac75a46270e344e43d.zip
feat(tui): shift+tab to cycle modes backward (#1049)
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/config/config.ts3
-rwxr-xr-xpackages/tui/cmd/opencode/opencodebin0 -> 26164734 bytes
-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
-rw-r--r--packages/tui/sdk/config.go3
6 files changed, 35 insertions, 6 deletions
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 851d68064..c22bd7ca4 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -81,7 +81,8 @@ export namespace Config {
.object({
leader: z.string().optional().default("ctrl+x").describe("Leader key for keybind combinations"),
app_help: z.string().optional().default("<leader>h").describe("Show help dialog"),
- switch_mode: z.string().optional().default("tab").describe("Switch mode"),
+ switch_mode: z.string().optional().default("tab").describe("Next mode"),
+ switch_mode_reverse: z.string().optional().default("shift+tab").describe("Previous Mode"),
editor_open: z.string().optional().default("<leader>e").describe("Open external editor"),
session_export: z.string().optional().default("<leader>x").describe("Export session to editor"),
session_new: z.string().optional().default("<leader>n").describe("Create a new session"),
diff --git a/packages/tui/cmd/opencode/opencode b/packages/tui/cmd/opencode/opencode
new file mode 100755
index 000000000..d13ced3ea
--- /dev/null
+++ b/packages/tui/cmd/opencode/opencode
Binary files differ
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...")
diff --git a/packages/tui/sdk/config.go b/packages/tui/sdk/config.go
index 7c04cd14b..4f5bf8a07 100644
--- a/packages/tui/sdk/config.go
+++ b/packages/tui/sdk/config.go
@@ -560,6 +560,8 @@ type Keybinds struct {
SessionUnshare string `json:"session_unshare,required"`
// Switch mode
SwitchMode string `json:"switch_mode,required"`
+ // Switch mode reverse
+ SwitchModeReverse string `json:"switch_mode_reverse,required"`
// List available themes
ThemeList string `json:"theme_list,required"`
// Toggle tool details
@@ -601,6 +603,7 @@ type keybindsJSON struct {
SessionShare apijson.Field
SessionUnshare apijson.Field
SwitchMode apijson.Field
+ SwitchModeReverse apijson.Field
ThemeList apijson.Field
ToolDetails apijson.Field
raw string