chat.nvim:一个源于个人需求的 Neovim AI 聊天插件
大家好,我是 Eric Wong。最近我开发了一个名为 chat.nvim 的 Neovim 插件,今天想和大家分享一下这个项目的故事。
初衷:为自己做个小工具
必须承认,现在市面上已经有很多优秀的 AI 集成工具了,比如 ChatGPT.nvim、codeium.vim、copilot.vim 等等。这些工具功能完善、团队专业、用户众多,做得都非常好。
我开发 chat.nvim,纯粹是出于个人需求和兴趣爱好。作为一个 Neovim 重度用户,我想要的只是一个简单、轻量、无侵入的 AI 聊天工具:
- 不需要复杂的代码补全,只想在写代码时随时问 AI 几个问题
- 不想离开编辑器,希望有个浮窗就能搞定
- 希望能方便地让 AI 读取我的代码文件
- 希望能管理多个对话上下文
- 最重要的是,代码要自己可控,想怎么改就怎么改
于是就动手写了这个插件。
chat.nvim 是什么?
简单来说,chat.nvim 是一个轻量级的 Neovim AI 聊天插件。它让你在编辑器里通过浮动窗口直接与 AI 助手对话,支持多种 AI 提供商,还能让 AI 读取你的文件内容作为上下文。

核心特性
- 多提供商支持:内置支持 DeepSeek、GitHub AI、Moonshot、OpenRouter、Qwen、SiliconFlow、腾讯混元等
- 工具调用:通过
@read_file和@find_files让 AI 读取你的代码 - 会话管理:自动保存对话历史,随时切换和恢复
- 流式响应:实时显示 AI 的回答,支持取消和重试
- 思考模式:支持 DeepSeek R1 等推理模型的思考过程展示
- Picker 集成:与 picker.nvim 无缝集成,快速搜索会话、切换模型
- 轻量级:纯 Lua 实现,依赖极少
技术实现:保持简单
整个插件的代码结构很简单:
lua/chat/
├── init.lua # 入口
├── windows.lua # 浮动窗口管理
├── sessions.lua # 会话持久化
├── tools.lua # 工具调用
├── config.lua # 配置管理
└── providers/ # AI 提供商适配器
├── deepseek.lua
├── github.lua
└── ...
设计上遵循几个原则:
- 最小依赖:仅依赖 job.nvim 处理异步请求,其他都是 Neovim 内置 API
- 会话持久化:对话缓存到
stdpath('cache'),JSON 格式,方便查看和备份 - 工具即函数:工具调用就是普通的 Lua 函数,用户可以轻松扩展
- 流式处理:通过 job.nvim 的 stdout 回调实时处理 AI 响应
工具调用:让 AI 读懂你的代码
这是我觉得最实用的功能。在聊天窗口里直接输入:
请帮我优化这个函数 @read_file ./lua/chat/windows.lua
AI 会读取文件内容并给出针对性建议。还支持批量查找:
分析一下项目结构 @find_files **/*.lua
工具调用的实现也很直接:解析消息中的 @tool 语法,调用对应的 Lua 函数,把结果返回给 AI。
会话管理:对话不丢失
所有对话自动保存,支持:
:Chat new- 新建会话:Chat prev/next- 切换会话:Chat delete- 删除会话:Chat clear- 清空当前会话
配合 picker.nvim 还能快速搜索历史会话:
:Picker chat
开发历程:边用边改
从 git log 能看到,这个项目是 12 天前开始的(从 v1.0.0 算起),但最近几天特别活跃:
- 第 1-2 天:搭起基本框架,支持 DeepSeek 和流式响应
- 第 3-4 天:加入会话管理、工具调用、多个提供商
- 第 5-6 天:完善 UI,添加 picker 集成、token 统计
- 第 7 天至今:疯狂修 bug,优化体验,添加新功能
说实话,很多功能都是用的时候发现需要才加的。比如:
- 发现 AI 回答太长,需要滚动查看 → 加了行号和高亮
- 想切换模型要改配置太麻烦 → 加了
:Picker chat_model - 经常忘记当前用的哪个模型 → 在窗口标题显示 provider 和 model
- 网络慢的时候不知道有没有在请求 → 加了进度 spinner
每次提交基本都是"fix:"或"feat:",很少有"refactor:",因为先跑起来再说。
当前状态:能用,但还不完美
必须坦诚地说,这个插件还有很多不足:
- 按键绑定不够灵活:目前写死在代码里,还没做成可配置
- 错误处理不够完善:网络问题、API 限频等场景处理较简单
- UI 还有优化空间:窗口布局、滚动体验等可以更好
- 文档不够详细:很多功能靠用户自己摸索
README 里我也明确写了:
Note: The plugin is currently in active development phase. Key bindings may change and may reflect the author's personal preferences. Configuration options for customizing key bindings are planned for future releases.
意思就是:还在折腾,按键绑定可能随时改,目前主要满足我自己的使用习惯。
为什么开源?
虽然是个"玩具"项目,但还是开源了,原因有三:
- 或许有人需要:可能也有朋友想要个简单轻量的工具
- 欢迎交流:AI 集成有很多玩法,希望能和大家一起探讨
- 学习参考:代码简单,适合想学习 Neovim 插件开发的朋友参考
如何使用?
安装很简单(以 nvim-plug 为例):
require('plug').add({ { 'wsdjeg/chat.nvim', depends = { 'wsdjeg/job.nvim' }, opt = { provider = 'deepseek', api_key = { deepseek = 'your-api-key', }, }, }, })
然后:
:Chat new " 新建对话 :Chat " 打开聊天窗口
在窗口里输入问题,按 <Enter> 发送,<C-c> 取消请求,q 关闭窗口。
更多用法可以参考 GitHub 仓库 。
最后的话
chat.nvim 不是要和那些成熟的 AI 工具竞争,它只是一个程序员为自己写的工具,碰巧可能也适合你。
如果你也喜欢这种简单直接的方式,欢迎试用、提 issue、甚至贡献代码。有任何想法或建议,都欢迎交流!
毕竟,在 AI 工具百花齐放的今天,多一个选择总是好的,对吧?
酷炫,但是 Neovim 用的比较少