summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBrendan Allan <[email protected]>2026-03-21 22:13:09 +0800
committerGitHub <[email protected]>2026-03-21 22:13:09 +0800
commit9ad6588f3e0066125033810a5e0e4dc08f0c6961 (patch)
treeb11f63dc288f9c9cc9638caf5ef684c1795919ca
parentfb6bf0b35e623113d23d15cc1a12b28fedd31f88 (diff)
downloadopencode-9ad6588f3e0066125033810a5e0e4dc08f0c6961.tar.gz
opencode-9ad6588f3e0066125033810a5e0e4dc08f0c6961.zip
app: allow navigating projects with keybinds (#18502)
-rw-r--r--packages/app/src/i18n/en.ts2
-rw-r--r--packages/app/src/pages/layout.tsx34
2 files changed, 36 insertions, 0 deletions
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index 72caed40a..8efd9d3bc 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -23,6 +23,8 @@ export const dict = {
"command.sidebar.toggle": "Toggle sidebar",
"command.project.open": "Open project",
+ "command.project.previous": "Previous project",
+ "command.project.next": "Next project",
"command.provider.connect": "Connect provider",
"command.server.switch": "Switch server",
"command.settings.open": "Open settings",
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index 8e2248469..2adcd3b56 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -936,6 +936,26 @@ export default function Layout(props: ParentProps) {
navigateToSession(session)
}
+ function navigateProjectByOffset(offset: number) {
+ const projects = layout.projects.list()
+ if (projects.length === 0) return
+
+ const current = currentProject()?.worktree
+ const fallback = currentDir() ? projectRoot(currentDir()) : undefined
+ const active = current ?? fallback
+ const index = active ? projects.findIndex((project) => project.worktree === active) : -1
+
+ const target =
+ index === -1
+ ? offset > 0
+ ? projects[0]
+ : projects[projects.length - 1]
+ : projects[(index + offset + projects.length) % projects.length]
+ if (!target) return
+
+ openProject(target.worktree)
+ }
+
function navigateSessionByUnseen(offset: number) {
const sessions = currentSessions()
if (sessions.length === 0) return
@@ -1003,6 +1023,20 @@ export default function Layout(props: ParentProps) {
onSelect: () => chooseProject(),
},
{
+ id: "project.previous",
+ title: language.t("command.project.previous"),
+ category: language.t("command.category.project"),
+ keybind: "mod+alt+arrowup",
+ onSelect: () => navigateProjectByOffset(-1),
+ },
+ {
+ id: "project.next",
+ title: language.t("command.project.next"),
+ category: language.t("command.category.project"),
+ keybind: "mod+alt+arrowdown",
+ onSelect: () => navigateProjectByOffset(1),
+ },
+ {
id: "provider.connect",
title: language.t("command.provider.connect"),
category: language.t("command.category.provider"),