vim-ai
在 Vim/Neovim 编辑器中原地调用 AI 生成、编辑代码或进行交互式对话的插件,支持 GPT
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
在 Vim/Neovim 编辑器中原地调用 AI 生成、编辑代码或进行交互式对话的插件,支持 GPT
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下这样的场景:你正在 Vim 里写一段 Python 代码,忽然想不起来某个 API 的用法。传统的做法是切换到浏览器搜索,或者打开另一个终端查文档。但如果现在你只需要在 Vim 里敲一行命令,AI 就能直接在你的代码缓冲区里"吐出"补全结果——这就是 vim-ai 正在做的事。
vim-ai(madox2/vim-ai)是一款将大语言模型能力深度集成到 Vim 和 Neovim 编辑器中的开源插件,截至目前已积累超过 1167 个 GitHub Stars 和 113 个 Fork,在 Vim 插件生态中属于相当活跃的项目。它并非简单的调用外部 API 生成文本,而是真正将 AI 能力融入了编辑器的每一次击键、每一次选择之中。
Vim 作为 Unix 世界的标志性编辑器,已经存在了超过 30 年。它以高效的键盘驱动操作和几乎无处不在的可用性著称,但在大语言模型(LLM)浪潮席卷整个软件行业的背景下,Vim 生态很长一段时间里缺少一个真正"深度集成"的 AI 插件方案——要么是简单的 API 调用窗口,要么需要复杂的外部脚本串联。
vim-ai 的出现填补了这个空白。项目作者 madox2 受到 GitHub Copilot 等工具的启发,目标是让 AI 能力像语法高亮和自动补全一样自然地融入 Vim 工作流中,而不是让用户频繁切换上下文去使用外部 AI 服务。
该项目的主要特点包括:支持 OpenAI 全系列模型(GPT-4o、GPT-4o-mini、o1 等)、通过 OpenRouter 代理支持 Claude、Gemini 等第三方模型、以及一个可扩展的 Provider 插件系统,方便社区开发者接入更多 AI 服务商。
vim-ai 的架构设计值得玩味。整个插件分为两层:
VimScript 前端(autoload/vim_ai.vim,560 行): 负责编辑器交互逻辑,包括命令注册、缓冲区管理、聊天窗口渲染等。在 plugin/vim-ai.vim 中可以看到,所有 AI 命令(:AI、:AIEdit、:AIChat、:AIImage)都是在这里注册的:
command! -range -nargs=? -complete=customlist,vim_ai#RoleCompletionComplete AI <line1>,<line2>call vim_ai#AIRun(<range>, {}, <q-args>)
command! -range -nargs=? -complete=customlist,vim_ai#RoleCompletionEdit AIEdit <line1>,<line2>call vim_ai#AIEditRun(<range>, {}, <q-args>)
command! -range -nargs=? -complete=customlist,vim_AI#RoleCompletionChat AIChat <line1>,<line2>call vim_AI#AIChatRun(<range>, {}, <q-args>)
command! -range -nargs=? -complete=customlist,vim_ai#RoleCompletionImage AIImage <line1>,<line2>call vim_AI#AIImageRun(<range>, {}, <q-args>)
Python 后端(py/ 目录): 负责实际的 AI API 调用。其中 py/providers/openai.py(~220 行)是核心,它封装了 OpenAI 的 Chat Completions API 和 Images API,支持流式输出(streaming)和多种认证方式(Bearer token / API Key)。值得注意的是,openai.py 中专门处理了 reasoning_content(DeepSeek)和 reasoning(OpenRouter)等第三方模型特有的响应字段,体现了良好的兼容性设计。
异步通信通过 Python 线程(threading)实现,run_ai_chat 和 run_ai_completition 函数在后台线程中发起 HTTP 请求,而主线程(Vim)保持响应。响应数据通过 vim.command("normal! a" + text) 直接写入当前缓冲区,实现了真正的"原地编辑"。
:AI(代码补全)这是最基础也是最实用的功能。在正常模式下输入 :AI 解释这段代码 或 :AI 补全函数,AI 会在当前光标位置插入响应。与 GitHub Copilot 不同,vim-ai 的补全是完全"按需"的——每次都需要你给出明确的指令,而不是被动地在后台猜测。
结合 Vim 的可视化选择(Visual Selection),你可以选中一段代码后执行 :AI refactor,AI 会对选中区域进行重构并直接替换:
:'<,'>AIE refactor this function
:AIEdit(原地编辑)对选中文本进行 AI 驱动的原地编辑。用法与 :AI 类似,但专门针对"修改"场景设计(如语法修正、翻译、重写)。内置的"撤销边界"机制(undojoin)确保每次 AI 编辑都可以独立撤销,不会污染 Vim 的撤销树。
:AIChat(交互式对话)这是最接近"Copilot Chat"的功能。:AIChat 会打开一个专用缓冲区(scratch buffer),以 Markdown 格式渲染多轮对话记录。你可以在同一个聊天窗口中持续对话,上下文会被自动维护。_populate_options 函数在聊天头部注入 provider 和 options 配置,使得每次对话都可以独立设置模型、温度等参数。
:AIImage(图像生成)调用 OpenAI DALL-E 3 API,根据 prompt 生成图像。配置文件 roles-default.ini 中预置了 hd.image(高质量)和 natural.image(自然风格)两种角色。
vim-ai 的角色系统是其最具扩展性的设计亮点。角色本质上是一段系统提示词(System Prompt)加上模型参数配置的组合,通过 .ini 配置文件定义:
[grammar]
prompt = fix spelling and grammar
options.temperature = 0.4
[refactor]
prompt = You are a Clean Code expert...
options.model = gpt-4o
options.temperature = 0.4
用户可以通过 :AIEdit /grammar、:AIChat /refactor 的方式引用角色。项目还内置了 OpenRouter 集成示例,只需简单配置即可切换到 Claude 或 Gemini 模型。
项目采用清晰的模块划分:
| 模块 | 文件 | 职责 |
|---|---|---|
| 插件入口 | plugin/vim-ai.vim | 注册命令、注册 Provider |
| 核心逻辑 | autoload/vim_ai.vim | 缓冲区管理、聊天窗口、命令分发 |
| 配置管理 | autoload/vim_ai_config.vim | 配置加载与验证 |
| Provider 注册 | autoload/vim_ai_provider.vim | Provider 插件注册表 |
| API 调用 | py/providers/openai.py | OpenAI API HTTP 请求封装 |
| 工具函数 | py/utils.py | Token 加载、代理设置、错误处理 |
| 对话管理 | py/chat.py | 多轮对话上下文解析与渲染 |
| 补全逻辑 | py/complete.py | 补全命令实现 |
| 角色系统 | py/roles.py | 角色文件解析与加载 |
| 图像生成 | py/image.py | DALL-E API 调用封装 |
代码质量方面,py/providers/openai.py 中的 _parse_raw_options 函数对每个配置项都做了类型转换和错误处理,避免了运行时类型错误。py/utils.py 中的 render_text_chunks 使用了 undojoin 机制来处理 AI 输出的撤销粒度问题——这是 Vim 插件开发中的常见痛点,项目处理得相当优雅。
项目 README 中的动态演示 gif 展示了完整的 AI 对话流程,包括补全、编辑和聊天三种模式的使用场景:

图1:vim-ai 完整工作流演示 — 从代码补全到交互式对话,覆盖日常开发中的主要 AI 辅助场景。
尽管 vim-ai 在 Vim 生态中已经相当成熟,但仍有一些客观局限值得潜在用户知晓:
API 成本不可忽视。 项目明确表示使用 OpenAI API 需付费,费用与 token 用量成正比。虽然单次请求成本极低,但在大规模日常使用中累积起来也需要考虑。OpenRouter 提供了许多免费模型(如 Claude 3 Haiku),是一个值得尝试的替代方案。
需要手动管理 API Key。 虽然项目支持从文件和环境变量加载 API Key,但在中国大陆环境下,访问 OpenAI API 本身需要代理。项目支持配置 g:vim_ai_proxy 参数来设置 HTTP 代理,但这个配置需要用户自行处理。
Vim/Python 环境依赖。 插件要求 Vim 编译时开启 Python3 支持(+python3),某些最小化编译的 Vim 发行版可能不满足要求。Neovim 用户通常不受此影响。
流式输出的体验依赖网络质量。 虽然代码支持流式输出(streaming),但在国内访问 OpenAI API 的延迟可能影响实时感。
vim-ai 成功地将大语言模型的强大能力融入 Vim 的原生编辑体验中,通过精心设计的 VimScript/Python 双层架构,在保持轻量的同时实现了完整的功能集合。相比于 VS Code 系的 GitHub Copilot 或 JetBrains 的 AI Assistant,vim-ai 的优势在于极低的资源占用(仅约 10MB 磁盘空间)、与现有 Vim 工作流的无缝融合,以及对任何 OpenAI 兼容 API 的广泛支持。
对于已经习惯在终端中完成所有工作的开发者来说,vim-ai 提供了一种不需要离开编辑器就能获得 AI 辅助的高效路径。如果你是一个 Vim 重度用户,同时希望将 AI 能力引入日常编码流程,vim-ai 绝对值得一试。