Skip to content

Commit 4ea4e23

Browse files
committed
feat: add keybinds from ctrl+p menu and mcp
1 parent abbf600 commit 4ea4e23

4 files changed

Lines changed: 98 additions & 0 deletions

File tree

packages/opencode/src/cli/cmd/tui/app.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,10 +391,52 @@ function App() {
391391
slash: {
392392
name: "mcps",
393393
},
394+
keybind: "mcp_toggle",
394395
onSelect: () => {
395396
dialog.replace(() => <DialogMcp />)
396397
},
397398
},
399+
...Array.from({ length: 10 }, (_, i) => {
400+
const slot = i + 1
401+
return {
402+
title: `Toggle MCP slot ${slot}`,
403+
value: `mcp.toggle.${slot}`,
404+
category: "Agent",
405+
keybind: `mcp_toggle_${slot}` as keyof typeof sync.data.config.keybinds,
406+
hidden: true,
407+
onSelect: async () => {
408+
const mcpNames = Object.keys(sync.data.mcp).sort()
409+
const mcpName = mcpNames[i]
410+
if (!mcpName) {
411+
toast.show({
412+
variant: "warning",
413+
message: `No MCP configured in slot ${slot}`,
414+
duration: 2000,
415+
})
416+
return
417+
}
418+
try {
419+
await local.mcp.toggle(mcpName)
420+
const status = await sdk.client.mcp.status()
421+
if (status.data) {
422+
sync.set("mcp", status.data)
423+
}
424+
const isEnabled = local.mcp.isEnabled(mcpName)
425+
toast.show({
426+
variant: "info",
427+
message: `${mcpName}: ${isEnabled ? "enabled" : "disabled"}`,
428+
duration: 2000,
429+
})
430+
} catch (error) {
431+
toast.show({
432+
variant: "error",
433+
message: `Failed to toggle ${mcpName}: ${error}`,
434+
duration: 3000,
435+
})
436+
}
437+
},
438+
}
439+
}),
398440
{
399441
title: "Agent cycle",
400442
value: "agent.cycle",
@@ -513,6 +555,7 @@ function App() {
513555
title: "Toggle console",
514556
category: "System",
515557
value: "app.console",
558+
keybind: "console_toggle",
516559
onSelect: (dialog) => {
517560
renderer.console.toggle()
518561
dialog.clear()

packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ export function Session() {
522522
name: "timestamps",
523523
aliases: ["toggle-timestamps"],
524524
},
525+
keybind: "timestamps_toggle",
525526
onSelect: (dialog) => {
526527
setTimestamps((prev) => (prev === "show" ? "hide" : "show"))
527528
dialog.clear()
@@ -535,11 +536,25 @@ export function Session() {
535536
name: "thinking",
536537
aliases: ["toggle-thinking"],
537538
},
539+
keybind: "thinking_toggle",
538540
onSelect: (dialog) => {
539541
setShowThinking((prev) => !prev)
540542
dialog.clear()
541543
},
542544
},
545+
{
546+
title: "Toggle diff wrapping",
547+
value: "session.toggle.diffwrap",
548+
category: "Session",
549+
slash: {
550+
name: "diffwrap",
551+
},
552+
keybind: "diffwrap_toggle",
553+
onSelect: (dialog) => {
554+
setDiffWrapMode((prev) => (prev === "word" ? "none" : "word"))
555+
dialog.clear()
556+
},
557+
},
543558
{
544559
title: showDetails() ? "Hide tool details" : "Show tool details",
545560
value: "session.toggle.actions",

packages/opencode/src/config/config.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,21 @@ export namespace Config {
681681
sidebar_toggle: z.string().optional().default("<leader>b").describe("Toggle sidebar"),
682682
scrollbar_toggle: z.string().optional().default("none").describe("Toggle session scrollbar"),
683683
username_toggle: z.string().optional().default("none").describe("Toggle username visibility"),
684+
console_toggle: z.string().optional().default("none").describe("Toggle console"),
685+
mcp_toggle: z.string().optional().default("none").describe("Toggle MCP dialog"),
686+
mcp_toggle_1: z.string().optional().default("none").describe("Toggle MCP slot 1"),
687+
mcp_toggle_2: z.string().optional().default("none").describe("Toggle MCP slot 2"),
688+
mcp_toggle_3: z.string().optional().default("none").describe("Toggle MCP slot 3"),
689+
mcp_toggle_4: z.string().optional().default("none").describe("Toggle MCP slot 4"),
690+
mcp_toggle_5: z.string().optional().default("none").describe("Toggle MCP slot 5"),
691+
mcp_toggle_6: z.string().optional().default("none").describe("Toggle MCP slot 6"),
692+
mcp_toggle_7: z.string().optional().default("none").describe("Toggle MCP slot 7"),
693+
mcp_toggle_8: z.string().optional().default("none").describe("Toggle MCP slot 8"),
694+
mcp_toggle_9: z.string().optional().default("none").describe("Toggle MCP slot 9"),
695+
mcp_toggle_10: z.string().optional().default("none").describe("Toggle MCP slot 10"),
696+
timestamps_toggle: z.string().optional().default("none").describe("Toggle timestamps visibility"),
697+
thinking_toggle: z.string().optional().default("none").describe("Toggle thinking visibility"),
698+
diffwrap_toggle: z.string().optional().default("none").describe("Toggle diff wrapping"),
684699
status_view: z.string().optional().default("<leader>s").describe("View status"),
685700
session_export: z.string().optional().default("<leader>x").describe("Export session to editor"),
686701
session_new: z.string().optional().default("<leader>n").describe("Create a new session"),
@@ -716,6 +731,7 @@ export namespace Config {
716731
messages_previous: z.string().optional().default("none").describe("Navigate to previous message"),
717732
messages_last_user: z.string().optional().default("none").describe("Navigate to last user message"),
718733
messages_copy: z.string().optional().default("<leader>y").describe("Copy message"),
734+
session_copy: z.string().optional().default("none").describe("Copy session transcript"),
719735
messages_undo: z.string().optional().default("<leader>u").describe("Undo message"),
720736
messages_redo: z.string().optional().default("<leader>r").describe("Redo message"),
721737
messages_toggle_conceal: z

packages/sdk/js/src/v2/gen/types.gen.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -964,6 +964,26 @@ export type KeybindsConfig = {
964964
* Toggle username visibility
965965
*/
966966
username_toggle?: string
967+
/**
968+
* Toggle console
969+
*/
970+
console_toggle?: string
971+
/**
972+
* Toggle MCP dialog
973+
*/
974+
mcp_toggle?: string
975+
/**
976+
* Toggle timestamps visibility
977+
*/
978+
timestamps_toggle?: string
979+
/**
980+
* Toggle thinking visibility
981+
*/
982+
thinking_toggle?: string
983+
/**
984+
* Toggle diff wrapping
985+
*/
986+
diffwrap_toggle?: string
967987
/**
968988
* View status
969989
*/
@@ -1072,6 +1092,10 @@ export type KeybindsConfig = {
10721092
* Copy message
10731093
*/
10741094
messages_copy?: string
1095+
/**
1096+
* Copy session transcript
1097+
*/
1098+
session_copy?: string
10751099
/**
10761100
* Undo message
10771101
*/

0 commit comments

Comments
 (0)