[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-nickjvandyke--opencode.nvim":3,"tool-nickjvandyke--opencode.nvim":62},[4,18,26,36,46,54],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",159267,2,"2026-04-17T11:29:14",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":42,"last_commit_at":43,"category_tags":44,"status":17},8272,"opencode","anomalyco\u002Fopencode","OpenCode 是一款开源的 AI 编程助手（Coding Agent），旨在像一位智能搭档一样融入您的开发流程。它不仅仅是一个代码补全插件，而是一个能够理解项目上下文、自主规划任务并执行复杂编码操作的智能体。无论是生成全新功能、重构现有代码，还是排查难以定位的 Bug，OpenCode 都能通过自然语言交互高效完成，显著减少开发者在重复性劳动和上下文切换上的时间消耗。\n\n这款工具专为软件开发者、工程师及技术研究人员设计，特别适合希望利用大模型能力来提升编码效率、加速原型开发或处理遗留代码维护的专业人群。其核心亮点在于完全开源的架构，这意味着用户可以审查代码逻辑、自定义行为策略，甚至私有化部署以保障数据安全，彻底打破了传统闭源 AI 助手的“黑盒”限制。\n\n在技术体验上，OpenCode 提供了灵活的终端界面（Terminal UI）和正在测试中的桌面应用程序，支持 macOS、Windows 及 Linux 全平台。它兼容多种包管理工具，安装便捷，并能无缝集成到现有的开发环境中。无论您是追求极致控制权的资深极客，还是渴望提升产出的独立开发者，OpenCode 都提供了一个透明、可信",144296,1,"2026-04-16T14:50:03",[13,45],"插件",{"id":47,"name":48,"github_repo":49,"description_zh":50,"stars":51,"difficulty_score":32,"last_commit_at":52,"category_tags":53,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108322,"2026-04-10T11:39:34",[14,15,13],{"id":55,"name":56,"github_repo":57,"description_zh":58,"stars":59,"difficulty_score":32,"last_commit_at":60,"category_tags":61,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[45,13,15,14],{"id":63,"github_repo":64,"name":65,"description_en":66,"description_zh":67,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":78,"owner_email":79,"owner_twitter":80,"owner_website":80,"owner_url":81,"languages":82,"stars":87,"forks":88,"last_commit_at":89,"license":90,"difficulty_score":32,"env_os":91,"env_gpu":91,"env_ram":91,"env_deps":92,"category_tags":99,"github_topics":100,"view_count":32,"oss_zip_url":80,"oss_zip_packed_at":80,"status":17,"created_at":109,"updated_at":110,"faqs":111,"releases":139},8624,"nickjvandyke\u002Fopencode.nvim","opencode.nvim","Integrate Neovim and OpenCode AI to stay in your flow.","opencode.nvim 是一款专为 Neovim 打造的 AI 编程助手插件，旨在让开发者在不离开编辑器的情况下，无缝集成 OpenCode AI 能力，保持流畅的编码心流。它解决了传统 AI 工具需要频繁切换窗口、手动复制上下文代码的痛点，让你直接在熟悉的 Vim 环境中与 AI 对话、生成代码并应用修改。\n\n这款工具特别适合习惯使用 Neovim 的软件开发者和工程师。其核心亮点在于深度的\"Vim 原生”体验：不仅支持可视选择、操作符范围（如 `go` 命令）和点重复（dot-repeat）等经典 Vim 特性，还能自动共享当前缓冲区、选中内容甚至诊断信息作为 AI 上下文。用户可以直接在编辑器内查看 AI 生成的差异对比，灵活选择接受、拒绝或重载修改，并通过内置的 LSP 协议实现低延迟交互。此外，它还提供了丰富的提示词库和可定制的快捷键，配合简单的默认配置，帮助用户快速构建高效的 AI 辅助开发工作流。无论是日常代码补全还是复杂的重构任务，opencode.nvim 都能让 AI 真正成为你指尖的自然延伸。","# opencode.nvim\n\n\u003Chttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F077daa78-d401-4b8b-98d1-9ba9f94c2330>\n\n## ✨ Features\n\n- Connect to _any_ `opencode`, or provide an integrated instance\n- Share editor context (buffer, selection, diagnostics, etc.)\n- Input prompts with completions, highlights, and normal-mode support\n- Select prompts from a library and define your own\n- Execute commands\n- Monitor and respond to events\n- View, accept or reject, and reload edits\n- Interact with `opencode` via an in-process LSP\n- _Vim-y_ — supports ranges and dot-repeat\n- Simple, sensible defaults to get you started quickly\n\n## 📦 Setup\n\n### [lazy.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Flazy.nvim)\n\n```lua\n{\n  \"nickjvandyke\u002Fopencode.nvim\",\n  version = \"*\", -- Latest stable release\n  dependencies = {\n    {\n      -- `snacks.nvim` integration is recommended, but optional\n      ---@module \"snacks\" \u003C- Loads `snacks.nvim` types for configuration intellisense\n      \"folke\u002Fsnacks.nvim\",\n      optional = true,\n      opts = {\n        input = {}, -- Enhances `ask()`\n        picker = { -- Enhances `select()`\n          actions = {\n            opencode_send = function(...) return require(\"opencode\").snacks_picker_send(...) end,\n          },\n          win = {\n            input = {\n              keys = {\n                [\"\u003Ca-a>\"] = { \"opencode_send\", mode = { \"n\", \"i\" } },\n              },\n            },\n          },\n        },\n      },\n    },\n  },\n  config = function()\n    ---@type opencode.Opts\n    vim.g.opencode_opts = {\n      -- Your configuration, if any; goto definition on the type or field for details\n    }\n\n    vim.o.autoread = true -- Required for `opts.events.reload`\n\n    -- Recommended\u002Fexample keymaps\n    vim.keymap.set({ \"n\", \"x\" }, \"\u003CC-a>\", function() require(\"opencode\").ask(\"@this: \", { submit = true }) end, { desc = \"Ask opencode…\" })\n    vim.keymap.set({ \"n\", \"x\" }, \"\u003CC-x>\", function() require(\"opencode\").select() end,                          { desc = \"Execute opencode action…\" })\n    vim.keymap.set({ \"n\", \"t\" }, \"\u003CC-.>\", function() require(\"opencode\").toggle() end,                          { desc = \"Toggle opencode\" })\n\n    vim.keymap.set({ \"n\", \"x\" }, \"go\",  function() return require(\"opencode\").operator(\"@this \") end,        { desc = \"Add range to opencode\", expr = true })\n    vim.keymap.set(\"n\",          \"goo\", function() return require(\"opencode\").operator(\"@this \") .. \"_\" end, { desc = \"Add line to opencode\", expr = true })\n\n    vim.keymap.set(\"n\", \"\u003CS-C-u>\", function() require(\"opencode\").command(\"session.half.page.up\") end,   { desc = \"Scroll opencode up\" })\n    vim.keymap.set(\"n\", \"\u003CS-C-d>\", function() require(\"opencode\").command(\"session.half.page.down\") end, { desc = \"Scroll opencode down\" })\n\n    -- You may want these if you use the opinionated `\u003CC-a>` and `\u003CC-x>` keymaps above — otherwise consider `\u003Cleader>o…` (and remove terminal mode from the `toggle` keymap)\n    vim.keymap.set(\"n\", \"+\", \"\u003CC-a>\", { desc = \"Increment under cursor\", noremap = true })\n    vim.keymap.set(\"n\", \"-\", \"\u003CC-x>\", { desc = \"Decrement under cursor\", noremap = true })\n  end,\n}\n```\n\n### [nixvim](https:\u002F\u002Fgithub.com\u002Fnix-community\u002Fnixvim)\n\n```nix\nprograms.nixvim = {\n  extraPlugins = [\n    pkgs.vimPlugins.opencode-nvim\n  ];\n};\n```\n\n> [!TIP]\n> Run `:checkhealth opencode` after setup.\n\n## ⚙️ Configuration\n\n`opencode.nvim` provides a rich and reliable default experience — see all available options and their defaults [here](.\u002Flua\u002Fopencode\u002Fconfig.lua).\n\n### Contexts\n\n`opencode.nvim` replaces placeholders in prompts with the corresponding context:\n\n| Placeholder    | Context                                                         |\n| -------------- | --------------------------------------------------------------- |\n| `@this`        | Operator range or visual selection if any, else cursor position |\n| `@buffer`      | Current buffer                                                  |\n| `@buffers`     | Open buffers                                                    |\n| `@visible`     | Visible text                                                    |\n| `@diagnostics` | Current buffer diagnostics                                      |\n| `@quickfix`    | Quickfix list                                                   |\n| `@diff`        | Git diff                                                        |\n| `@marks`       | Global marks                                                    |\n| `@grapple`     | [grapple.nvim](https:\u002F\u002Fgithub.com\u002Fcbochs\u002Fgrapple.nvim) tags     |\n\n> [!TIP]\n> `opencode` reads referenced files from disk — save your changes!\n\n### Prompts\n\nSelect or reference prompts to review, explain, and improve your code:\n\n| Name          | Prompt                                                                 |\n| ------------- | ---------------------------------------------------------------------- |\n| `diagnostics` | Explain `@diagnostics`                                                 |\n| `diff`        | Review the following git diff for correctness and readability: `@diff` |\n| `document`    | Add comments documenting `@this`                                       |\n| `explain`     | Explain `@this` and its context                                        |\n| `fix`         | Fix `@diagnostics`                                                     |\n| `implement`   | Implement `@this`                                                      |\n| `optimize`    | Optimize `@this` for performance and readability                       |\n| `review`      | Review `@this` for correctness and readability                         |\n| `test`        | Add tests for `@this`                                                  |\n\n### Server\n\nYou can manually run `opencode`s however you like and `opencode.nvim` will find them!\n\n> [!IMPORTANT]\n> You _must_ run `opencode` with the `--port` flag to expose its server.\n\nIf `opencode.nvim` can't find an existing `opencode`, it uses the configured server to start one for you, defaulting to an embedded terminal.\n\n#### Keymaps\n\n`opencode.nvim` sets these normal-mode keymaps in the embedded terminal for Neovim-like message navigation:\n\n| Keymap  | Command                  | Description           |\n| ------- | ------------------------ | --------------------- |\n| `\u003CC-u>` | `session.half.page.up`   | Scroll up half page   |\n| `\u003CC-d>` | `session.half.page.down` | Scroll down half page |\n| `gg`    | `session.first`          | Go to first message   |\n| `G`     | `session.last`           | Go to last message    |\n| `\u003CEsc>` | `session.interrupt`      | Interrupt             |\n\n#### Customization\n\nExample using [`snacks.terminal`](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim\u002Fblob\u002Fmain\u002Fdocs\u002Fterminal.md) instead:\n\n```lua\nlocal opencode_cmd = 'opencode --port'\n---@type snacks.terminal.Opts\nlocal snacks_terminal_opts = {\n  win = {\n    position = 'right',\n    enter = false,\n    on_win = function(win)\n      -- Set up keymaps and cleanup for an arbitrary terminal\n      require('opencode.terminal').setup(win.win)\n    end,\n  },\n}\n---@type opencode.Opts\nvim.g.opencode_opts = {\n  server = {\n    start = function()\n      require('snacks.terminal').open(opencode_cmd, snacks_terminal_opts)\n    end,\n    stop = function()\n      require('snacks.terminal').get(opencode_cmd, snacks_terminal_opts):close()\n    end,\n    toggle = function()\n      require('snacks.terminal').toggle(opencode_cmd, snacks_terminal_opts)\n    end,\n  },\n}\n```\n\n## 🚀 Usage\n\n### Ask — `require(\"opencode\").ask()`\n\nInput a prompt for `opencode`.\n\n- Press `\u003CUp>` to browse recent asks.\n- Highlights and completes contexts and `opencode` subagents.\n  - Press `\u003CTab>` to trigger built-in completion.\n- End the prompt with `\\n` to append instead of submit.\n- Additionally, when using `snacks.input`:\n  - Press `\u003CS-CR>` to append instead of submit.\n  - Offers completions via in-process LSP.\n\n### Select — `require(\"opencode\").select()`\n\nSelect from all `opencode.nvim` functionality.\n\n- Prompts\n- Commands\n- Server controls\n\nHighlights and previews items when using `snacks.picker`.\n\n### Prompt — `require(\"opencode\").prompt()`\n\nPrompt `opencode`.\n\n- Resolves named references to configured prompts.\n- Injects configured contexts.\n- `opencode` will interpret `@` references to files or subagents.\n\n### Operator — `require(\"opencode\").operator()`\n\nWraps `prompt` as an operator, supporting ranges and dot-repeat.\n\n### Command — `require(\"opencode\").command()`\n\nCommand `opencode`:\n\n| Command                  | Description                                        |\n| ------------------------ | -------------------------------------------------- |\n| `session.list`           | List sessions                                      |\n| `session.new`            | Start a new session                                |\n| `session.select`         | Select a session                                   |\n| `session.share`          | Share the current session                          |\n| `session.interrupt`      | Interrupt the current session                      |\n| `session.compact`        | Compact the current session (reduce context size)  |\n| `session.page.up`        | Scroll messages up by one page                     |\n| `session.page.down`      | Scroll messages down by one page                   |\n| `session.half.page.up`   | Scroll messages up by half a page                  |\n| `session.half.page.down` | Scroll messages down by half a page                |\n| `session.first`          | Jump to the first message in the session           |\n| `session.last`           | Jump to the last message in the session            |\n| `session.undo`           | Undo the last action in the current session        |\n| `session.redo`           | Redo the last undone action in the current session |\n| `prompt.submit`          | Submit the TUI input                               |\n| `prompt.clear`           | Clear the TUI input                                |\n| `agent.cycle`            | Cycle the selected agent                           |\n\n### LSP\n\n> [!WARNING]\n> This feature is experimental! Try it out with `vim.g.opencode_opts.lsp.enabled = true`.\n\n`opencode.nvim` provides an in-process LSP to interact with `opencode` via the LSP functions you're used to!\n\n| LSP Function | `opencode.nvim` Handler                                                |\n| ------------ | ---------------------------------------------------------------------- |\n| Hover        | Asks `opencode` for a brief explanation of the symbol under the cursor |\n| Code Actions | Asks `opencode` to explain or fix diagnostics under the cursor         |\n\n## 👀 Events\n\n`opencode.nvim` forwards `opencode`'s Server-Sent-Events as an `OpencodeEvent` autocmd:\n\n```lua\n-- Handle `opencode` events\nvim.api.nvim_create_autocmd(\"User\", {\n  pattern = \"OpencodeEvent:*\", -- Optionally filter event types\n  callback = function(args)\n    ---@type opencode.server.Event\n    local event = args.data.event\n    ---@type number\n    local port = args.data.port\n\n    -- See the available event types and their properties\n    vim.notify(vim.inspect(event))\n    -- Do something useful\n    if event.type == \"session.idle\" then\n      vim.notify(\"`opencode` finished responding\")\n    end\n  end,\n})\n```\n\n### Edits\n\nWhen `opencode` edits a file, `opencode.nvim` automatically reloads the corresponding buffer.\n\n### Permissions\n\nWhen `opencode` requests a permission, `opencode.nvim` waits for idle to ask you to approve or deny it.\n\n#### Edits\n\nFor edit requests, `opencode.nvim` opens the target file in a new tab and uses Neovim's `:diffpatch` to display the proposed changes side-by-side. See `:h 'diffopt'` for customization.\n\n| Keymap  | Function                                                                      |\n| ------- | ----------------------------------------------------------------------------- |\n| `da`    | Accept the entire edit request                                                |\n| `dr`    | Reject the entire edit request                                                |\n| `]c\u002F[c` | Next\u002Fprev change                                                              |\n| `dp`    | Natively accept _only_ the hunk under the cursor, and reject the edit request |\n| `do`    | Natively reject _only_ the hunk under the cursor, and reject the edit request |\n| `q`     | Close the diff                                                                |\n\n### Statusline\n\n```lua\nrequire(\"lualine\").setup({\n  sections = {\n    lualine_z = {\n      {\n        require(\"opencode\").statusline,\n      },\n    }\n  }\n})\n```\n\n## 🙏 Acknowledgments\n\n- Inspired by [nvim-aider](https:\u002F\u002Fgithub.com\u002FGeorgesAlkhouri\u002Fnvim-aider), [neopencode.nvim](https:\u002F\u002Fgithub.com\u002Floukotal\u002Fneopencode.nvim), and [sidekick.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim).\n- Uses `opencode`'s TUI for simplicity — see [sudo-tee\u002Fopencode.nvim](https:\u002F\u002Fgithub.com\u002Fsudo-tee\u002Fopencode.nvim) for a Neovim frontend.\n- [mcp-neovim-server](https:\u002F\u002Fgithub.com\u002Fbigcodegen\u002Fmcp-neovim-server) may better suit you, but it lacks customization and tool calls are slow and unreliable.\n","# opencode.nvim\n\n\u003Chttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F077daa78-d401-4b8b-98d1-9ba9f94c2330>\n\n## ✨ 功能\n\n- 连接到_任何_ `opencode`，或提供一个集成的实例\n- 共享编辑器上下文（缓冲区、选区、诊断信息等）\n- 带有补全、高亮和普通模式支持的输入提示\n- 从库中选择提示并自定义自己的提示\n- 执行命令\n- 监控并响应事件\n- 查看、接受或拒绝，并重新加载编辑内容\n- 通过进程内 LSP 与 `opencode` 交互\n- _Vim 风格_ — 支持范围操作和点重复\n- 简单而合理的默认设置，助你快速上手\n\n## 📦 安装\n\n### [lazy.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Flazy.nvim)\n\n```lua\n{\n  \"nickjvandyke\u002Fopencode.nvim\",\n  version = \"*\", -- 最新稳定版\n  dependencies = {\n    {\n      -- 推荐但非强制使用 `snacks.nvim` 集成\n      ---@module \"snacks\" \u003C- 加载 `snacks.nvim` 类型以提供配置智能感知\n      \"folke\u002Fsnacks.nvim\",\n      optional = true,\n      opts = {\n        input = {}, -- 增强 `ask()`\n        picker = { -- 增强 `select()`\n          actions = {\n            opencode_send = function(...) return require(\"opencode\").snacks_picker_send(...) end,\n          },\n          win = {\n            input = {\n              keys = {\n                [\"\u003Ca-a>\"] = { \"opencode_send\", mode = { \"n\", \"i\" } },\n              },\n            },\n          },\n        },\n      },\n    },\n  },\n  config = function()\n    ---@type opencode.Opts\n    vim.g.opencode_opts = {\n      -- 您的配置，如有；详情请跳转到类型或字段的定义处\n    }\n\n    vim.o.autoread = true -- `opts.events.reload` 所需\n\n    -- 推荐\u002F示例键位映射\n    vim.keymap.set({ \"n\", \"x\" }, \"\u003CC-a>\", function() require(\"opencode\").ask(\"@this: \", { submit = true }) end, { desc = \"向 opencode 提问…\" })\n    vim.keymap.set({ \"n\", \"x\" }, \"\u003CC-x>\", function() require(\"opencode\").select() end,                          { desc = \"执行 opencode 操作…\" })\n    vim.keymap.set({ \"n\", \"t\" }, \"\u003CC-.>\", function() require(\"opencode\").toggle() end,                          { desc = \"切换 opencode\" })\n\n    vim.keymap.set({ \"n\", \"x\" }, \"go\",  function() return require(\"opencode\").operator(\"@this \") end,        { desc = \"将范围添加到 opencode\", expr = true })\n    vim.keymap.set(\"n\",          \"goo\", function() return require(\"opencode\").operator(\"@this \") .. \"_\" end, { desc = \"将行添加到 opencode\", expr = true })\n\n    vim.keymap.set(\"n\", \"\u003CS-C-u>\", function() require(\"opencode\").command(\"session.half.page.up\") end,   { desc = \"向上滚动 opencode\" })\n    vim.keymap.set(\"n\", \"\u003CS-C-d>\", function() require(\"opencode\").command(\"session.half.page.down\") end, { desc = \"向下滚动 opencode\" })\n\n    -- 如果您使用了上面带有偏好的 `\u003CC-a>` 和 `\u003CC-x>` 键位映射，可能需要这些设置；否则可以考虑使用 `\u003Cleader>o…`（并从 `toggle` 键位映射中移除终端模式）\n    vim.keymap.set(\"n\", \"+\", \"\u003CC-a>\", { desc = \"增加光标下的数值\", noremap = true })\n    vim.keymap.set(\"n\", \"-\", \"\u003CC-x>\", { desc = \"减少光标下的数值\", noremap = true })\n  end,\n}\n```\n\n### [nixvim](https:\u002F\u002Fgithub.com\u002Fnix-community\u002Fnixvim)\n\n```nix\nprograms.nixvim = {\n  extraPlugins = [\n    pkgs.vimPlugins.opencode-nvim\n  ];\n};\n```\n\n> [!TIP]\n> 安装完成后运行 `:checkhealth opencode`。\n\n## ⚙️ 配置\n\n`opencode.nvim` 提供丰富且可靠的默认体验——所有可用选项及其默认值请参见[此处](.\u002Flua\u002Fopencode\u002Fconfig.lua)。\n\n### 上下文\n\n`opencode.nvim` 会将提示中的占位符替换为相应的上下文：\n\n| 占位符    | 上下文                                                         |\n| -------------- | --------------------------------------------------------------- |\n| `@this`        | 操作符范围或可视选区（如有），否则为光标位置                 |\n| `@buffer`      | 当前缓冲区                                                    |\n| `@buffers`     | 已打开的缓冲区                                                |\n| `@visible`     | 可见文本                                                      |\n| `@diagnostics` | 当前缓冲区的诊断信息                                          |\n| `@quickfix`    | 快速修复列表                                                  |\n| `@diff`        | Git 差异                                                        |\n| `@marks`       | 全局标记                                                      |\n| `@grapple`     | [grapple.nvim](https:\u002F\u002Fgithub.com\u002Fcbochs\u002Fgrapple.nvim) 标签     |\n\n> [!TIP]\n> `opencode` 会从磁盘读取引用的文件——请保存您的更改！\n\n### 提示\n\n选择或引用提示来审查、解释并改进您的代码：\n\n| 名称          | 提示                                                                 |\n| ------------- | ---------------------------------------------------------------------- |\n| `diagnostics` | 解释 `@diagnostics`                                                 |\n| `diff`        | 审查以下 Git 差异是否存在正确性和可读性问题：`@diff`               |\n| `document`    | 为 `@this` 添加注释文档                                             |\n| `explain`     | 解释 `@this` 及其上下文                                              |\n| `fix`         | 修复 `@diagnostics`                                                 |\n| `implement`   | 实现 `@this`                                                        |\n| `optimize`    | 优化 `@this` 以提升性能和可读性                                     |\n| `review`      | 审查 `@this` 的正确性和可读性                                       |\n| `test`        | 为 `@this` 添加测试                                                  |\n\n### 服务器\n\n你可以按自己的方式手动运行 `opencode`，`opencode.nvim` 会自动找到它们！\n\n> [!重要]\n> 你必须使用 `--port` 标志来运行 `opencode`，以暴露其服务器。\n\n如果 `opencode.nvim` 找不到现有的 `opencode` 实例，它会使用配置的服务器为你启动一个，默认情况下会在嵌入式终端中运行。\n\n#### 键位映射\n\n`opencode.nvim` 在嵌入式终端中设置了以下普通模式键位映射，用于类似 Neovim 的消息导航：\n\n| 键位映射  | 命令                  | 描述           |\n| ------- | ------------------------ | --------------------- |\n| `\u003CC-u>` | `session.half.page.up`   | 向上滚动半页   |\n| `\u003CC-d>` | `session.half.page.down` | 向下滚动半页 |\n| `gg`    | `session.first`          | 跳转到第一条消息   |\n| `G`     | `session.last`           | 跳转到最后一条消息    |\n| `\u003CEsc>` | `session.interrupt`      | 中断             |\n\n#### 自定义\n\n以下示例使用 [`snacks.terminal`](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim\u002Fblob\u002Fmain\u002Fdocs\u002Fterminal.md) 替代默认行为：\n\n```lua\nlocal opencode_cmd = 'opencode --port'\n---@type snacks.terminal.Opts\nlocal snacks_terminal_opts = {\n  win = {\n    position = 'right',\n    enter = false,\n    on_win = function(win)\n      -- 设置任意终端的键位映射并进行清理\n      require('opencode.terminal').setup(win.win)\n    end,\n  },\n}\n---@type opencode.Opts\nvim.g.opencode_opts = {\n  server = {\n    start = function()\n      require('snacks.terminal').open(opencode_cmd, snacks_terminal_opts)\n    end,\n    stop = function()\n      require('snacks.terminal').get(opencode_cmd, snacks_terminal_opts):close()\n    end,\n    toggle = function()\n      require('snacks.terminal').toggle(opencode_cmd, snacks_terminal_opts)\n    end,\n  },\n}\n```\n\n## 🚀 使用方法\n\n### 提问 — `require(\"opencode\").ask()`\n\n输入一个提示给 `opencode`。\n\n- 按 `\u003CUp>` 可浏览最近的提问。\n- 高亮显示并补全上下文和 `opencode` 子代理。\n  - 按 `\u003CTab>` 触发内置补全。\n- 使用 `\\n` 结束提示以追加内容而非提交。\n- 此外，当使用 `snacks.input` 时：\n  - 按 `\u003CS-CR>` 可追加内容而非提交。\n  - 通过进程内 LSP 提供补全选项。\n\n### 选择 — `require(\"opencode\").select()`\n\n从所有 `opencode.nvim` 功能中进行选择。\n\n- 提示\n- 命令\n- 服务器控制\n\n使用 `snacks.picker` 时，会高亮显示并预览各项内容。\n\n### 提示 — `require(\"opencode\").prompt()`\n\n向 `opencode` 发出提示。\n\n- 将命名引用解析为已配置的提示。\n- 注入已配置的上下文。\n- `opencode` 会解释 `@` 引用的文件或子代理。\n\n### 操作符 — `require(\"opencode\").operator()`\n\n将 `prompt` 包装为操作符，支持范围操作和点重复。\n\n### 命令 — `require(\"opencode\").command()`\n\n执行 `opencode` 命令：\n\n| 命令                  | 描述                                        |\n| ------------------------ | -------------------------------------------------- |\n| `session.list`           | 列出会话                                      |\n| `session.new`            | 开始一个新的会话                                |\n| `session.select`         | 选择一个会话                                   |\n| `session.share`          | 分享当前会话                                  |\n| `session.interrupt`      | 中断当前会话                                  |\n| `session.compact`        | 整理当前会话（减少上下文大小）                |\n| `session.page.up`        | 向上滚动一页消息                               |\n| `session.page.down`      | 向下滚动一页消息                               |\n| `session.half.page.up`   | 向上滚动半页消息                              |\n| `session.half.page.down` | 向下滚动半页消息                              |\n| `session.first`          | 跳转到会话中的第一条消息                       |\n| `session.last`           | 跳转到会话中的最后一条消息                     |\n| `session.undo`           | 撤销当前会话中的最后一步                      |\n| `session.redo`           | 重做当前会话中被撤销的操作                    |\n| `prompt.submit`          | 提交 TUI 输入                                 |\n| `prompt.clear`           | 清除 TUI 输入                                 |\n| `agent.cycle`            | 切换当前选中的代理                            |\n\n### LSP\n\n> [!警告]\n> 此功能目前处于实验阶段！请尝试设置 `vim.g.opencode_opts.lsp.enabled = true` 来体验。\n\n`opencode.nvim` 提供了一个进程内 LSP，让你可以通过熟悉的 LSP 接口与 `opencode` 交互！\n\n| LSP 函数 | `opencode.nvim` 处理程序                                                |\n| ------------ | ---------------------------------------------------------------------- |\n| Hover        | 向 `opencode` 请求光标下的符号的简要说明                           |\n| Code Actions | 向 `opencode` 请求解释或修复光标下的诊断信息                       |\n\n## 👀 事件\n\n`opencode.nvim` 会将 `opencode` 的服务器发送事件转发为 `OpencodeEvent` 自动命令：\n\n```lua\n-- 处理 `opencode` 事件\nvim.api.nvim_create_autocmd(\"User\", {\n  pattern = \"OpencodeEvent:*\", -- 可选地过滤事件类型\n  callback = function(args)\n    ---@type opencode.server.Event\n    local event = args.data.event\n    ---@type number\n    local port = args.data.port\n\n    -- 查看可用的事件类型及其属性\n    vim.notify(vim.inspect(event))\n    -- 执行一些有用的操作\n    if event.type == \"session.idle\" then\n      vim.notify(\"`opencode` 已完成响应\")\n    end\n  end,\n})\n```\n\n### 编辑\n\n当 `opencode` 编辑文件时，`opencode.nvim` 会自动重新加载对应的缓冲区。\n\n### 权限\n\n当 `opencode` 请求权限时，`opencode.nvim` 会等待空闲状态，然后提示你批准或拒绝该请求。\n\n#### 编辑\n\n对于编辑请求，`opencode.nvim` 会在新标签页中打开目标文件，并使用 Neovim 的 `:diffpatch` 功能并排显示建议的更改。可参考 `:h 'diffopt'` 进行自定义。\n\n| 键位映射  | 功能                                                                      |\n| ------- | ----------------------------------------------------------------------------- |\n| `da`    | 接受整个编辑请求                                                            |\n| `dr`    | 拒绝整个编辑请求                                                            |\n| `]c\u002F[c` | 切换到下一个\u002F上一个更改                                                      |\n| `dp`    | 仅接受光标下的变更块，同时拒绝整个编辑请求                                |\n| `do`    | 仅拒绝光标下的变更块，同时拒绝整个编辑请求                                |\n| `q`     | 关闭差异对比窗口                                                            |\n\n### 状态栏\n\n```lua\nrequire(\"lualine\").setup({\n  sections = {\n    lualine_z = {\n      {\n        require(\"opencode\").statusline,\n      },\n    }\n  }\n})\n```\n\n## 🙏 致谢\n\n- 灵感来源于 [nvim-aider](https:\u002F\u002Fgithub.com\u002FGeorgesAlkhouri\u002Fnvim-aider)、[neopencode.nvim](https:\u002F\u002Fgithub.com\u002Floukotal\u002Fneopencode.nvim) 和 [sidekick.nvim](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsidekick.nvim)。\n- 为保持简洁，使用了 `opencode` 的 TUI——有关 Neovim 前端，请参阅 [sudo-tee\u002Fopencode.nvim](https:\u002F\u002Fgithub.com\u002Fsudo-tee\u002Fopencode.nvim)。\n- [mcp-neovim-server](https:\u002F\u002Fgithub.com\u002Fbigcodegen\u002Fmcp-neovim-server) 可能更适合您，但它缺乏自定义功能，且工具调用速度慢、稳定性不足。","# opencode.nvim 快速上手指南\n\n`opencode.nvim` 是一个强大的 Neovim 插件，旨在将 `opencode` AI 助手无缝集成到编辑器中。它支持共享编辑器上下文（缓冲区、选中内容、诊断信息等），提供类似 Vim 的操作符支持，并允许你通过 LSP 与 AI 进行交互。\n\n## 环境准备\n\n在开始之前，请确保满足以下要求：\n\n1.  **Neovim**: 建议使用最新稳定版 (v0.9+)。\n2.  **Opencode CLI**: 必须预先安装 `opencode` 命令行工具。\n    *   安装方式请参考 [opencode 官方文档](https:\u002F\u002Fgithub.com\u002Fopencode-ai\u002Fopencode)。\n    *   **重要**: 运行 `opencode` 时必须携带 `--port` 参数以暴露服务端，插件会自动检测或启动该服务。\n3.  **依赖插件 (可选但推荐)**:\n    *   [`snacks.nvim`](https:\u002F\u002Fgithub.com\u002Ffolke\u002Fsnacks.nvim): 用于增强输入框 (`ask`) 和选择器 (`select`) 的体验。\n    *   [`lazy.nvim`](https:\u002F\u002Fgithub.com\u002Ffolke\u002Flazy.nvim): 推荐的插件管理器。\n\n## 安装步骤\n\n### 使用 lazy.nvim 安装\n\n在你的 Neovim 配置文件中（例如 `lua\u002Fplugins\u002Fopencode.lua`），添加以下配置：\n\n```lua\n{\n  \"nickjvandyke\u002Fopencode.nvim\",\n  version = \"*\", -- 锁定最新稳定版本\n  dependencies = {\n    {\n      -- 推荐集成 snacks.nvim 以获得更好的 UI 体验（可选）\n      \"folke\u002Fsnacks.nvim\",\n      optional = true,\n      opts = {\n        input = {}, -- 增强 ask() 功能\n        picker = { -- 增强 select() 功能\n          actions = {\n            opencode_send = function(...) return require(\"opencode\").snacks_picker_send(...) end,\n          },\n          win = {\n            input = {\n              keys = {\n                [\"\u003Ca-a>\"] = { \"opencode_send\", mode = { \"n\", \"i\" } },\n              },\n            },\n          },\n        },\n      },\n    },\n  },\n  config = function()\n    ---@type opencode.Opts\n    vim.g.opencode_opts = {\n      -- 在此处添加自定义配置，留空则使用默认值\n    }\n\n    -- 必须开启 autoread 以支持编辑重载功能\n    vim.o.autoread = true\n\n    -- 推荐快捷键映射\n    vim.keymap.set({ \"n\", \"x\" }, \"\u003CC-a>\", function() require(\"opencode\").ask(\"@this: \", { submit = true }) end, { desc = \"Ask opencode…\" })\n    vim.keymap.set({ \"n\", \"x\" }, \"\u003CC-x>\", function() require(\"opencode\").select() end,                          { desc = \"Execute opencode action…\" })\n    vim.keymap.set({ \"n\", \"t\" }, \"\u003CC-.>\", function() require(\"opencode\").toggle() end,                          { desc = \"Toggle opencode\" })\n\n    -- 操作符映射 (支持范围选择和重复操作)\n    vim.keymap.set({ \"n\", \"x\" }, \"go\",  function() return require(\"opencode\").operator(\"@this \") end,        { desc = \"Add range to opencode\", expr = true })\n    vim.keymap.set(\"n\",          \"goo\", function() return require(\"opencode\").operator(\"@this \") .. \"_\" end, { desc = \"Add line to opencode\", expr = true })\n\n    -- 会话滚动映射\n    vim.keymap.set(\"n\", \"\u003CS-C-u>\", function() require(\"opencode\").command(\"session.half.page.up\") end,   { desc = \"Scroll opencode up\" })\n    vim.keymap.set(\"n\", \"\u003CS-C-d>\", function() require(\"opencode\").command(\"session.half.page.down\") end, { desc = \"Scroll opencode down\" })\n  end,\n}\n```\n\n### 使用 Nixvim 安装\n\n如果你使用 Nix 管理配置：\n\n```nix\nprograms.nixvim = {\n  extraPlugins = [\n    pkgs.vimPlugins.opencode-nvim\n  ];\n};\n```\n\n> **提示**: 安装完成后，请在 Neovim 中运行 `:checkhealth opencode` 检查安装状态。\n\n## 基本使用\n\n安装完成后，你可以通过以下几种核心方式与 AI 交互：\n\n### 1. 提问 (Ask)\n按下 `\u003CC-a>` (或在可视模式下选中代码后按 `\u003CC-a>`) 唤起输入框。\n*   **上下文自动注入**: 输入 `@this` 会自动替换为当前选区或光标所在行；输入 `@buffer` 代表当前文件内容。\n*   **智能补全**: 输入 `\u003CTab>` 可触发上下文或子代理的自动补全。\n*   **示例**: 选中一段代码，按 `\u003CC-a>`，输入 `解释 @this 的逻辑` 并回车。\n\n### 2. 选择预设动作 (Select)\n按下 `\u003CC-x>` 打开功能选择器。\n*   你可以从库中选择预设的 Prompt（如 `fix`, `review`, `test` 等）。\n*   也可以执行服务器控制命令（如新建会话、中断会话）。\n*   若安装了 `snacks.nvim`，选择器将支持高亮预览。\n\n### 3. 使用操作符 (Operator)\n利用 Vim 原生的操作符逻辑调用 AI：\n*   **范围操作**: 输入 `go` 然后移动光标选择范围（如 `goj` 选择下一行），AI 将自动处理该范围。\n*   **整行操作**: 输入 `goo` 快速对当前行进行操作。\n*   **重复操作**: 使用 `.` 键即可重复上一次的 AI 操作。\n\n### 4. 查看与接受编辑\n当 `opencode` 生成代码修改建议时：\n*   插件会自动在新标签页打开差异对比视图 (`diffpatch`)。\n*   **接受修改**: 按 `da` 接受所有更改。\n*   **拒绝修改**: 按 `dr` 拒绝所有更改。\n*   **导航变更**: 使用 `]c` 和 `[c` 跳转到下一个或上一个变更点。\n\n### 5. 常用上下文占位符\n在输入 Prompt 时，可以使用以下占位符动态注入信息：\n\n| 占位符 | 含义 |\n| :--- | :--- |\n| `@this` | 操作符范围、可视选区或光标位置 |\n| `@buffer` | 当前缓冲区内容 |\n| `@diagnostics` | 当前文件的错误\u002F警告信息 |\n| `@diff` | Git 差异内容 |\n| `@visible` | 屏幕上可见的文本 |\n\n> **注意**: `opencode` 会从磁盘读取引用的文件，因此在发送请求前请确保已保存文件 (`:w`)。","资深后端工程师正在重构一个遗留的 Python 微服务模块，需要在不离开编辑器的情况下，让 AI 协助优化复杂的异步逻辑并修复类型错误。\n\n### 没有 opencode.nvim 时\n- **上下文割裂严重**：必须手动复制代码片段粘贴到外部 AI 网页端，再切回编辑器粘贴结果，频繁切换窗口打断了深度思考的心流。\n- **上下文传递繁琐**：为了让 AI 理解报错原因，需额外复制堆栈信息和相关依赖文件，沟通成本极高且容易遗漏关键细节。\n- **操作效率低下**：无法直接对选中的多行代码或特定函数范围发起指令，每次交互都像是在进行“搬运工”式的机械劳动。\n- **审查流程断裂**：AI 返回的代码需要人工逐行比对差异，缺乏原生的接受或拒绝机制，极易引入细微的逻辑偏差。\n\n### 使用 opencode.nvim 后\n- **沉浸式交互体验**：直接在 Neovim 内通过 `\u003CC-a>` 唤起对话框，利用 `@this` 自动带入当前选中代码或光标上下文，全程无需切换窗口。\n- **智能上下文感知**：只需输入简短提示词，opencode.nvim 自动将缓冲区内容、诊断错误（diagnostics）及可见代码作为背景信息发送给 AI，精准度大幅提升。\n- **原生 Vim 操作习惯**：支持可视模式选区和 Dot-repeat（`.` 重复命令），可像执行宏一样对多个相似函数批量应用相同的重构指令。\n- **闭环代码审查**：AI 生成的修改建议以 Diff 形式直接呈现在编辑器中，可一键接受、拒绝或重新加载，确保每一行变更都在掌控之中。\n\nopencode.nvim 通过将 AI 能力无缝融入 Neovim 的原生工作流，让开发者在保持极致心流的同时，实现了从“询问代码”到“即时演进代码”的效率飞跃。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickjvandyke_opencode.nvim_3d5f8926.png","nickjvandyke","Nick van Dyke","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fnickjvandyke_34fe3e70.jpg","Building systems, tools, and teams that make great engineering fun.","Polco","Denver, CO","nickjvandyke15@gmail.com",null,"https:\u002F\u002Fgithub.com\u002Fnickjvandyke",[83],{"name":84,"color":85,"percentage":86},"Lua","#000080",100,3204,114,"2026-04-17T12:00:23","MIT","未说明",{"notes":93,"python":91,"dependencies":94},"该工具是 Neovim 插件，核心依赖外部运行的 'opencode' 命令行服务（需通过 --port 标志启动）。支持通过 LSP、终端嵌入或独立服务器模式交互。无特定 Python 或 GPU 要求，具体资源需求取决于后端连接的 'opencode' 服务配置。建议使用 snacks.nvim 以获得更好的输入和选择器体验。",[95,96,97,98],"Neovim","lazy.nvim (可选)","snacks.nvim (可选)","opencode CLI",[45,15,13,14],[101,102,103,104,38,105,106,107,108],"ai-agents","ai-assistant","neovim","nvim","plugin","terminal","neovim-plugin","ai","2026-03-27T02:49:30.150509","2026-04-18T02:20:29.840810",[112,117,122,127,131,135],{"id":113,"question_zh":114,"answer_zh":115,"source_url":116},38624,"为什么停止插件时 `opencode` 进程会变成孤儿进程（orphaned processes）？","维护者已决定移除对多种外部终端提供者（如 tmux, kitty, wezterm）的原生支持，以减少维护复杂度和避免此类进程管理问题。目前仅保留了嵌入式终端（embedded terminal），其中已包含修复孤儿进程的代码。\n\n如果你使用其他终端（如 `snacks.terminal`），可以通过调用以下 API 手动应用修复：\n`require(\"opencode.terminal\").setup(\u003Cwindow_id>)`\n\n对于高级用户，建议编写自定义命令来手动启动和清理 `opencode` 进程，而不是依赖插件的自动管理。","https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F118",{"id":118,"question_zh":119,"answer_zh":120,"source_url":121},38625,"如何配置插件以在代理修改文件后自动重新加载缓冲区（SSE 事件）？","你可以通过监听 `User OpencodeEvent` 自动命令来实现。当发生 `file.edited`、`permission.replied` 或 `session.idle` 事件时，触发 `:checktime` 命令来刷新缓冲区。\n\n配置示例如下：\n```lua\nvim.api.nvim_create_autocmd('User', {\n    pattern = 'OpencodeEvent',\n    callback = function(args)\n        local eventType = args.data.type\n        if eventType == 'session.idle' or eventType == 'file.edited' or eventType == 'permission.replied' then\n            vim.schedule(function()\n                vim.cmd.checktime()\n            end)\n        end\n    end,\n})\n```\n注意：此功能通常需要在插件内部启动 opencode 进程（通过 `opts.provider` 或 `toggle`）才能可靠接收 SSE 事件。","https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F54",{"id":123,"question_zh":124,"answer_zh":125,"source_url":126},38626,"为什么在配置 `vim.g.opencode_opts` 的 `keys` 选项时报错 \"Couldn't convert lua value\"？","这是由于 Neovim 在处理包含 Lua 函数表的配置转换时存在的限制，导致无法直接将函数赋值给 `keys` 配置项。\n\n目前的解决方案是不要直接在 `vim.g.opencode_opts` 中定义包含函数的 `keys` 表。如果必须自定义按键映射，建议在插件加载完成后，通过正常的 Neovim 按键映射命令（如 `vim.keymap.set`）针对生成的窗口缓冲区进行设置，或者等待插件未来与 `snacks.nvim` 更深度的集成来解决此问题。","https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F36",{"id":128,"question_zh":129,"answer_zh":130,"source_url":116},38627,"插件不再支持 tmux\u002Fkitty\u002Fwezterm 等外部终端提供者了吗？","是的，出于维护原因，维护者已移除了对多种外部终端提供者的原生支持。因为随着插件增长，管理各种外部工作流的怪异行为（quirks）变得不可持续。\n\n现在插件主要专注于嵌入式终端。如果你需要使用 tmux 或其他终端，你需要自己编写脚本来启动 `opencode` 进程，并在退出 Neovim 时手动清理。插件不再负责这些外部进程的生命周期管理。",{"id":132,"question_zh":133,"answer_zh":134,"source_url":116},38628,"如何在非嵌入式终端（如 snacks.terminal）中修复 opencode 进程孤儿问题？","虽然插件移除了对多种提供者的自动管理，但修复孤儿进程的核心逻辑仍然可用。如果你使用 `snacks.terminal` 或其他自定义终端窗口运行 opencode，可以在终端窗口创建后调用以下函数来应用修复：\n\n`require(\"opencode.terminal\").setup(\u003Cwindow_id>)`\n\n请将 `\u003Cwindow_id>` 替换为你实际终端窗口的 ID。这能确保当 Neovim 关闭或会话结束时，关联的 `opencode` 进程也能被正确清理。",{"id":136,"question_zh":137,"answer_zh":138,"source_url":121},38629,"为什么我在外部启动 opencode 时收不到 SSE 事件通知？","SSE（Server-Sent Events）事件监听器通常需要在插件内部启动 opencode 进程时注册。如果你在外部独立启动 `opencode` TUI，插件可能无法自动连接并注册事件监听器。\n\n目前的建议是:\n1. 尽量通过插件的配置（如 `opts.provider` 或 `toggle` 命令）来启动 opencode，这样插件会自动处理 SSE 注册。\n2. 如果必须外部启动，可能需要开发一个 opencode 插件 shim，在 TUI 启动时通过 RPC 通知 Neovim 加载 `opencode.nvim` 并注册监听器（这是一个较复杂的变通方案）。",[140,145,150,155,160,165,170,175,180],{"id":141,"version":142,"summary_zh":143,"released_at":144},314530,"v0.7.0","## [0.7.0](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcompare\u002Fv0.6.0...v0.7.0) (2026-04-07)\n\n\n### ⚠ 重大变更\n\n* **配置：** 移除未文档化的清除内置上下文和提示的功能\n* 从 `ask` 和 `prompt` 中移除有 bug 的 `opts.clear`\n\n### Bug 修复\n\n* 从 `ask` 和 `prompt` 中移除有 bug 的 `opts.clear` ([3a0b484](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F3a0b484831f9edb1aac6423b30093a03335672f2))\n* **终端：** 回退到窗口选项以保持向后兼容 ([fd7b4e5](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Ffd7b4e5899a4ade903e8bee4305ac72c1a36f522))\n\n\n### 代码重构\n\n* **配置：** 移除未文档化的清除内置上下文和提示的功能 ([78b720d](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F78b720dfa6a55c3e2d167165320adc5c0ae87471))","2026-04-07T21:36:33",{"id":146,"version":147,"summary_zh":148,"released_at":149},314531,"v0.6.0","## [0.6.0](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcompare\u002Fv0.5.2...v0.6.0) (2026-03-29)\n\n\n### 功能\n\n* 支持 `opencode` 编辑的差异对比及接受\u002F拒绝操作 ([8b4ec07](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F8b4ec075cbaf869bb86f1a52e78f1478ea525000))\n* **编辑权限：** 允许单独禁用编辑权限 ([8804ffb](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F8804ffb81f9784dcd0e9af43a2068fb55282c4dd))\n* **权限：** 当编辑功能被禁用时，回退到通用权限设置 ([53014bc](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F53014bc40fbe529a26c6feafbe395ffe5e3acda5))\n* **服务器：** 支持任意端口的自动发现 ([5067c80](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F5067c80ee1f37b5f8a54244e184df44944175a84))\n\n\n### 错误修复\n\n* **健康检查：** 仅在次版本号匹配时检查 `opencode` 补丁版本 ([#217](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F217)) ([ecd6e9b](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fecd6e9b50d732280ef63f325ec29ec206f78be71))\n* **上下文：** 仅使用列出的缓冲区来处理 `[@buffers](https:\u002F\u002Fgithub.com\u002Fbuffers)` ([#213](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F213)) ([e64a4a1](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fe64a4a1172401a9dffd732bf61f032d038fd947c))\n* **差异对比：** 在接受或拒绝单个代码块后不再关闭差异对比窗口 ([c7adcfe](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fc7adcfe997535add53ac094a564a15348ab0c0de))\n* 取消 `command` 服务器选择时，不再显示空的错误提示 ([9db5914](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F9db59145730ff9b8029b3dc9c5c6e714cd5485a8))\n* **权限：** 回复请求时出现错误 ([931f94b](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F931f94b99a6f70af43f5f7bce897a9e127b167c0))\n* **状态：** 处理忙碌和空闲状态的新事件类型，并更新权限事件类型 ([3d07744](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F3d07744a05cc682c6706db21d90e43e513702dc4))\n* **终端：** 不将其包含在会话中 ([f8c46ed](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Ff8c46edbc1a905f35db3c076ee6cee73eab3df65))\n* **终端：** 防止其出现在 bufferline 中 ([#214](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F214)) ([4f4ff2c](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F4f4ff2c2a4bd979bf8f20a90e44be1b86855cfea))","2026-03-29T18:47:38",{"id":151,"version":152,"summary_zh":153,"released_at":154},314532,"v0.5.2","## [0.5.2](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcompare\u002Fv0.5.1...v0.5.2)（2026-03-06）\n\n\n### 错误修复\n\n* **server:** 在 Unix 系统上未找到进程时正确报错 ([df98bfb](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fdf98bfba94190ca3584f862f5f0526c6dcd016fc))\n* **terminal:** 退出 Neovim 并杀死 `opencode` 时出现的罕见错误 ([c451511](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fc451511a27d1a9c05bab173c919ef882cd6f72f3))","2026-03-06T13:54:34",{"id":156,"version":157,"summary_zh":158,"released_at":159},314533,"v0.5.1","## [0.5.1](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcompare\u002Fv0.5.0...v0.5.1) (2026-03-03)\n\n\n### 错误修复\n\n* **服务器：** 有时会返回没有端口的进程 ([#195](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F195)) ([12a7c4e](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F12a7c4e5496cd6a2c38533356c37bb7f3ee6d4d7))","2026-03-03T14:16:55",{"id":161,"version":162,"summary_zh":163,"released_at":164},314534,"v0.5.0","## [0.5.0](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcompare\u002Fv0.4.0...v0.5.0) (2026-03-02)\n\n\n### ⚠ 破坏性变更\n\n* **provider:** 用更简单、更易维护的 `server` 选项替代 providers\n\n### 功能\n\n* **server:** 允许使用 _所有_ 服务器（但仍优先共享当前工作目录）([6d00f30](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F6d00f3094af83748f94224647f62a215bca6a920))\n\n\n### Bug 修复\n\n* **ask:** 在补全文档中保留格式化内容 ([9048f10](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F9048f10130f76a39c4b5d0ba77890ec5031bb543))\n* **client:** 防止 `opencode` 挂起时出现卡死问题 ([#183](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F183)) ([c1afcf5](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fc1afcf5ab4dce992ee41108fb056522db7385dd6))\n* **context:** 总是选择重叠占位符中较长的一个 ([e4f7555](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fe4f755591db3ddf7b9ff6dcb4ae469faa36926b6))\n* **context:** 诊断上下文错误 ([a4dff90](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fa4dff90c1a13b0bc5fdfc750feeba4e2501f5ef5))\n* **context:** 当没有位置信息时，移除文件名后的空格，并使用 `:` 分隔；将多个上下文列表用 `, ` 连接 ([8992d0c](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F8992d0c6168ad28f91b03f7dcdb98b5ebb675c32))\n* **health:** 当 `opts.server` 未配置时显示错误 ([37468a4](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F37468a41d87fd71b4cc6180c5811d6719442f525))\n* **server:** 即使事件被禁用，也缓存已连接的服务器 ([6b3eed0](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F6b3eed0bce4c4cff928a8ef7222a0513382adcfc))\n* **server:** 不再无谓地重新连接到服务器 ([1b90ae8](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F1b90ae8936245255786b7789496f7d910ab8434d))\n* **server:** 更可靠地检测服务器是否消失 ([67a09c8](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F67a09c88ca2326c12e6ca02ffa669f716341ddf1))\n* **server:** 解决可能导致从新选中的服务器断开连接的竞争条件 ([c72a7bf](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fc72a7bf28ac13fc54e3f12a99554b2309d0da175))\n\n\n### 代码重构\n\n* **provider:** 用更简单、更易维护的 `server` 选项替代 providers ([82332cf](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F82332cf924458dc9b6fcaecf25f52111544a1663))","2026-03-02T13:16:43",{"id":166,"version":167,"summary_zh":168,"released_at":169},314535,"v0.4.0","## [0.4.0](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcompare\u002Fv0.3.0...v0.4.0) (2026-02-20)\n\n\n### 功能特性\n\n* **lsp:** 添加用于解释光标下诊断信息的代码动作 ([8d95230](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F8d9523081e89dc1775a2ac91ae1c2922d8293bd8))\n* **lsp:** 添加悬停功能。为保证稳定性，默认禁用 lsp。([7d410cc](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F7d410cc2c2f4d708fc79491c9d8ab0ff46a04116))\n* **lsp:** 添加持久化的进程内 LSP，以及用于修复诊断的代码动作 ([a841138](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fa841138e056f337c6ee7ad0aad0cc18b36806deb))\n* **lsp:** 允许配置模型 ([bdb59d8](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fbdb59d85ab8d1f323c4596dac9efc0229ab74fec))\n\n\n### Bug 修复\n\n* **ask:** 高亮时 blink.cmp 报错 ([0a5306e](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F0a5306ecd0e3d3a9358e8a6b15b55da12d611278))\n* **provider:** 更可靠的退出时调用 stop 的 autocmd ([1e31bbc](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F1e31bbcea06966c004eb3b41e54e1c74136227c8))\n* **provider:** 可靠地杀死终端、snacks 和 tmux 提供程序中孤立的 `opencode` 进程 ([#168](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F168)) ([125c7dc](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F125c7dc991996446f4529ed6aa9e58965dbb9d01))\n* **tmux:** 干净地关闭 `opencode` 进程 ([#178](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F178)) ([1d1b39f](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F1d1b39fd0f4a3951b048be944ed2a65348aad3f8))","2026-02-20T21:54:45",{"id":171,"version":172,"summary_zh":173,"released_at":174},314536,"v0.3.0","## [0.3.0](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcompare\u002Fv0.2.0...v0.3.0) (2026-02-18)\n\n\n### 功能特性\n\n* **ask:** 结束提示时使用 `\\n` 或按 `\u003CC-CR>` 来追加内容，而不是直接提交 ([65ce845](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F65ce8453a9e73fc259c6d1899b3b99778e754108))\n* **ask:** 使用 `opencode` 时，发送实际的换行符以实现追加功能 ([7cffee3](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F7cffee32e5b7ab8cfbe5a8217ae563555f973220))\n* **ask:** 通过进程内 LSP 支持所有补全插件 :D ([55ae1e5](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F55ae1e5a75d46fadf450699f7b267a0be12940f3))\n* **ask:** 使用 `\u003CS-CR>` 替代 `\u003CC-CR>` 来追加内容——更符合标准 ([72e85ae](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F72e85ae13a37213195d35b334739de6f3bc8f4b4))\n* **snacks:** 添加 `snacks.picker` 操作，用于将项目发送到 `opencode` ([#152](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F152)) ([e478fce](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fe478fce4a7d05e1ee0e0aed8cb582f0501228183))\n\n\n### 错误修复\n\n* **ask:** 找到 LSP 模块的可靠位置 ([5336d93](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F5336d93b4895b9c25940ca5e8194291ae16e59ed))\n* **server:** 当已配置端口时，不再搜索其他服务器 ([#175](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F175)) ([9fa26f0](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F9fa26f0146fa00801f2c0eaefb4b75f0051d7292))","2026-02-18T15:45:20",{"id":176,"version":177,"summary_zh":178,"released_at":179},314537,"v0.2.0","## [0.2.0](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcompare\u002Fv0.1.0...v0.2.0) (2026-02-09)\n\n\n### 功能\n\n* **provider:** 用于导航消息的普通模式键映射（[#151](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fissues\u002F151)）（[a847e5e](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Fa847e5e5a6b738ed56b30c9dbb66d161914bb27c)）\n* 可从可用的 `opencode` 服务器中进行选择（[fa26e86](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002Ffa26e865200ceb0841284c9f2e86ffbd2d353233)）\n\n\n### 错误修复\n\n* **select:** 当不在 Git 仓库中时不再报错（[5de2380](https:\u002F\u002Fgithub.com\u002Fnickjvandyke\u002Fopencode.nvim\u002Fcommit\u002F5de2380a4e87d493149838eab6599cf9f4b33a3e)）","2026-02-10T19:12:47",{"id":181,"version":182,"summary_zh":183,"released_at":184},314538,"v0.1.0","`opencode.nvim` 开始推出带标签的发布版本啦！希望这能提升稳定性和清晰度 🙂\n\n感谢您使用我的插件！","2026-02-02T16:44:58"]