为 Neovim 设计的 AI 编程助手客户端,支持多 AI Provider(OpenCode/Claude Code/Cursor Agent/Gemini CLI),提供可视化选择 AI 辅助、智能上下文管理(#规则引用/@文件引用)、自动 markdown 文件注入等功能,面向仍享受手写代码乐趣的开发者。
项目概述#
99 是一款由 ThePrimeagen 开发的 Neovim AI 客户端,项目定位为 "The AI client that Neovim deserves, built by those that still enjoy to code."(Neovim 理应拥有的 AI 客户端,由仍然享受编码的人构建)。
这是一个探索 AI 与传统编码(tradcoding)结合的实验性项目,核心理念是手写代码仍然非常重要,目前最好的产品仍然依赖手写代码。
核心功能#
核心 API#
- visual implementation: 基于可视化选择实现 AI 辅助
- search: AI 驱动的搜索功能
- debug: 调试功能
- Extensions.Worker.work: 扩展工作器机制
- stop_all_requests(): 停止所有进行中的 AI 请求
- view_logs(): 查看运行日志
多 Provider 支持#
| Provider | CLI 工具 | 默认模型 |
|---|---|---|
| OpenCodeProvider (默认) | opencode | opencode/claude-sonnet-4-5 |
| ClaudeCodeProvider | claude | claude-sonnet-4-5 |
| CursorAgentProvider | cursor-agent | sonnet-4.5 |
| GeminiCLIProvider | gemini | auto |
智能上下文管理#
- # 规则引用: 在提示中输入
#可自动完成规则文件 - @ 文件引用: 输入
@可模糊搜索项目文件 - md_files 配置: 自动查找并添加基于请求发起位置的 markdown 文件
- custom_rules: 支持自定义技能规则目录(SKILL.md 格式)
UI/UX 扩展集成#
- Telescope 集成: 模型选择器和 Provider 选择器
- fzf-lua 支持: 与 telescope 相同的选择器功能
- 补全源支持: nvim-cmp / blink.cmp 二选一
项目架构#
99/
├── .github/ # GitHub 配置
├── lua/99/ # 核心 Lua 代码
├── queries/ # Tree-sitter 查询定义
├── scratch/ # 临时文件和示例
├── scripts/ # 辅助脚本工具
├── syntax/ # 语法高亮文件
├── AGENTS.md # AI 代理开发指南
├── TUTORIAL.md # 教程规划
├── TODO.md # 待办事项与路线图
└── Makefile # 构建与测试配置
安装配置#
前置要求#
必须安装支持的 AI CLI 工具之一:opencode(推荐)、claude、cursor-agent、gemini
Lazy.nvim 安装#
{
"ThePrimeagen/99",
config = function()
local _99 = require("99")
local cwd = vim.uv.cwd()
local basename = vim.fs.basename(cwd)
_99.setup({
logger = {
level = _99.DEBUG,
path = "/tmp/" .. basename .. ".99.debug",
print_on_error = true,
},
tmp_dir = "./tmp",
completion = {
custom_rules = { "scratch/custom_rules/" },
files = { -- 配置选项 },
source = "cmp", -- 或 "blink"
},
md_files = { "AGENT.md" },
})
end,
}
基础键位映射#
-- 可视化模式 AI 请求
vim.keymap.set("v", "<leader>9v", function() _99.visual() end)
-- 停止所有请求
vim.keymap.set("n", "<leader>9x", function() _99.stop_all_requests() end)
-- 搜索功能
vim.keymap.set("n", "<leader>9s", function() _99.search() end)
典型工作流程#
- 在 Neovim 中打开代码
- 使用可视化模式选择代码段
- 触发 AI 请求(
<leader>9v) - 在提示窗口中输入请求,可使用
#引用规则,@引用文件 - AI 生成响应并进行代码修改