轻量 Neovim 插件:用 Neovim 右侧 Chat panel 集成 opencode serve 的本地 HTTP API,创建 session、发送 prompt、管理上下文和历史会话,并让 opencode agent 执行文件修改。
:OpencodeToggle打开/聚焦/隐藏右侧 Chat panel,默认占编辑器宽度 40%。:OpencodeAsk [prompt]发送问题;不带参数时打开输入区。- Chat 输入区按
<C-s>提交。 - Chat UI 中
<Tab>在消息区和输入区之间切换。 - Chat UI 中
<C-c>或:OpencodeCancel通过POST /session/:id/abort取消当前请求。 - Chat UI 底部固定 status bar,显示 Idle/Thinking/Streaming/Error 等状态和当前 model/variant。
- Chat UI 是 tab mirror:只要 Chat 当前可见,新建/切入 tab 会自动显示同一份 Chat;所有 tab 共享 messages、input 草稿、context、session 和状态。
- 当前 tab 只剩 opencode-chat 的 message/input/status 窗口时,会自动清理 Chat:有其它 tab 时关闭当前 tab,最后一个 tab 时允许 Neovim 正常退出。
:OpencodeAppendFile将当前文件引用和内容加入下一次提问上下文。:OpencodeAppendSelection将 Visual 选区引用和内容加入下一次提问上下文。:OpencodeAppendContext在 Normal 模式追加当前文件、Visual 模式追加选区;上下文自动去重,推荐映射为<leader>Xe,追加后保持代码 pane 焦点。:OpencodeContextRemove [index]/:OpencodeContextClear删除或清空上下文;消息区 Context 行上按d删除该项,按D清空全部。:OpencodeEdit [instruction]使用配置的 opencode agent 执行文件修改,并渲染 assistant 总结。:OpencodeSessions选择当前 project 的 session,picker 内按r重命名、按d并确认后删除;:OpencodeNewSession新建 session 且不重启 server。:OpencodeModels选择白名单模型,:OpencodeVariants按当前 provider 选择 variant。:OpencodeStop停止 opencode job 并关闭插件窗口。
- 必需:Neovim、
curl、可用的opencodeCLI。 - 推荐:
nui.nvim。插件会优先用nui.menu渲染 session/model/variant 选择器;缺失时会退回内置浮窗选择器,便于测试和最小环境运行。
require("opencode_chat").setup({
agent = "build",
model = "deepseek/deepseek-v4-flash",
providers = {
deepseek = {
variants = { "low", "medium", "high", "max" },
models = {
{ id = "deepseek-v4-flash", default_variant = "low" },
{ id = "deepseek-v4-pro", default_variant = "high" },
},
},
},
keymaps = {
toggle = "<M-->",
append_context = "<leader>Xe",
append_selection = "<M-->",
sessions = "<leader>Xl",
new_session = "<leader>Xn",
models = "<leader>Xm",
variants = "<leader>Xt",
},
ui = {
width = 0.4,
height = 1.0,
message_height = nil,
input_height = 5,
},
})model 使用 provider/model 格式,必须存在于 providers 白名单中;每个 provider 定义自己的 variants,每个 model 定义 default_variant。创建 session 时使用 { providerID, id, variant },发送 message 时使用 { providerID, modelID } 并附带 agent / variant。
如果当前 opencode server 支持 /event/subscribe SSE 事件流,插件会尝试根据 message.part.delta / message.part.updated 增量刷新 assistant 回复;不可用时自动退回非流式响应。
插件默认不绑定全局快捷键;如需快捷键,请在 keymaps 中显式配置:
- Normal
<M-->:toggle Chat UI - Normal/Visual
<leader>Xe:追加当前文件或 Visual 选区上下文,保持代码 pane 焦点 - Visual
<M-->:旧选区上下文追加入口,会聚焦 Chat input - Normal
<leader>Xl/<leader>Xn/<leader>Xm/<leader>Xt:选择 session、新建 session、选择 model、选择 variant;session picker 内r重命名、d确认删除
:OpencodeToggle 在当前 tab 面板隐藏时打开 Chat 镜像;当前 tab 面板已打开但当前焦点不在 Chat 内时,会重新聚焦到 Chat 输入区;焦点已在 Chat 内时会隐藏所有 tab 的 Chat UI。只要 Chat 处于可见状态,新建或切入 tab 会自动显示同一份 Chat 镜像。
本仓库内置自闭环测试,使用 headless Neovim 运行:
nvim --headless -l tests/run.lua不修改全局 Neovim 配置,直接加载当前仓库插件并启动 Neovim:
./scripts/dev-sandbox该命令会创建并打开 /tmp/opencode-chat.nvim-sandbox/src/example.lua,不会使用仓库内受 Git 管理的文件做测试目标。
开发态脚本会显式注入推荐测试快捷键:<M-->、<leader>Xe、<leader>Xl、<leader>Xn、<leader>Xm、<leader>Xt;插件默认配置仍不注册全局快捷键。