Просмотр исходного кода

feat: add messages_last_user command to scroll TUI to last user message (implements #4847) (#4855)

Co-authored-by: GitHub Action <[email protected]>
Co-authored-by: Aiden Cline <[email protected]>
Ariane Emory 2 месяцев назад
Родитель
Сommit
921b98066d

+ 31 - 0
packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

@@ -557,6 +557,37 @@ export function Session() {
         dialog.clear()
         dialog.clear()
       },
       },
     },
     },
+    {
+      title: "Jump to last user message",
+      value: "session.messages_last_user",
+      keybind: "messages_last_user",
+      category: "Session",
+      onSelect: () => {
+        const messages = sync.data.message[route.sessionID]
+        if (!messages || !messages.length) return
+
+        // Find the most recent user message with non-ignored, non-synthetic text parts
+        for (let i = messages.length - 1; i >= 0; i--) {
+          const message = messages[i]
+          if (!message || message.role !== "user") continue
+
+          const parts = sync.data.part[message.id]
+          if (!parts || !Array.isArray(parts)) continue
+
+          const hasValidTextPart = parts.some(
+            (part) => part && part.type === "text" && !part.synthetic && !part.ignored,
+          )
+
+          if (hasValidTextPart) {
+            const child = scroll.getChildren().find((child) => {
+              return child.id === message.id
+            })
+            if (child) scroll.scrollBy(child.y - scroll.y - 1)
+            break
+          }
+        }
+      },
+    },
     {
     {
       title: "Copy last assistant message",
       title: "Copy last assistant message",
       value: "messages.copy",
       value: "messages.copy",

+ 1 - 0
packages/opencode/src/config/config.ts

@@ -418,6 +418,7 @@ export namespace Config {
         .describe("Scroll messages down by half page"),
         .describe("Scroll messages down by half page"),
       messages_first: z.string().optional().default("ctrl+g,home").describe("Navigate to first message"),
       messages_first: z.string().optional().default("ctrl+g,home").describe("Navigate to first message"),
       messages_last: z.string().optional().default("ctrl+alt+g,end").describe("Navigate to last message"),
       messages_last: z.string().optional().default("ctrl+alt+g,end").describe("Navigate to last message"),
+      messages_last_user: z.string().optional().default("none").describe("Navigate to last user message"),
       messages_copy: z.string().optional().default("<leader>y").describe("Copy message"),
       messages_copy: z.string().optional().default("<leader>y").describe("Copy message"),
       messages_undo: z.string().optional().default("<leader>u").describe("Undo message"),
       messages_undo: z.string().optional().default("<leader>u").describe("Undo message"),
       messages_redo: z.string().optional().default("<leader>r").describe("Redo message"),
       messages_redo: z.string().optional().default("<leader>r").describe("Redo message"),

+ 4 - 0
packages/sdk/js/src/gen/types.gen.ts

@@ -796,6 +796,10 @@ export type KeybindsConfig = {
    * Navigate to last message
    * Navigate to last message
    */
    */
   messages_last?: string
   messages_last?: string
+  /**
+   * Navigate to last user message
+   */
+  messages_last_user?: string
   /**
   /**
    * Copy message
    * Copy message
    */
    */

+ 1 - 0
packages/web/src/content/docs/keybinds.mdx

@@ -35,6 +35,7 @@ OpenCode has a list of keybinds that you can customize through the OpenCode conf
     "messages_copy": "<leader>y",
     "messages_copy": "<leader>y",
     "messages_undo": "<leader>u",
     "messages_undo": "<leader>u",
     "messages_redo": "<leader>r",
     "messages_redo": "<leader>r",
+    "messages_last_user": "none",
     "messages_toggle_conceal": "<leader>h",
     "messages_toggle_conceal": "<leader>h",
     "model_list": "<leader>m",
     "model_list": "<leader>m",
     "model_cycle_recent": "f2",
     "model_cycle_recent": "f2",