Fitten_Code Neovim配置推荐:Lua脚本AI补全
要在 Neovim 中集成 Fitten Code 的 AI 补全,流程稍显曲折——官方未提供 Neovim 原生支持,必须自行通过 Lua 脚本模拟 API 请求,再将补全结果注入 LSP 管道。否则编辑器不会弹出任何 AI 建议。
不手动打通这条链路,Fitten Code 的能力就和 Neovim 完全无关。
确认 Fitten Code 服务可访问
先确认 API 端点是否可达。打开终端执行 curl -s -o /dev/null -w "%{http_code}" https://api.fittentech.com/v1/chat/completions --head,返回 200 表明基础端点存活。返回 401 或 403 则暂停前进——API Key 未配置或账户未激活。
接着,在 ~/.config/nvim/lua/config/fitten.lua 路径下创建空文件,准备写入集成逻辑。
这一步不可跳过。Fitten Code 在 Neovim 侧缺乏官方 SDK,所有通信需手动构建 HTTP 请求头和 payload。认证不过关,后续所有补全请求会无声失败,连错误提示都不会出现。
配置API密钥与基础请求参数
然后在 fitten.lua 中写入以下内容:
local api_key = os.getenv("FITEN_CODE_API_KEY") or "sk-xxx"
if not api_key or api_key == "sk-xxx" then error("FITEN_CODE_API_KEY 环境变量未设置或值为默认占位符") end
vim.g.fitten_api_key = api_key
务必警惕:密钥必须通过环境变量传入,硬编码在配置里一旦 Git 泄露将造成严重风险。
构建异步补全提供器
接下来有两种实现思路。
方法一:基于 nvim-cmp 的 source 扩展
前提是已安装 nvim-cmp 和 cmp_lsp。然后在 fitten.lua 中继续追加:
local cmp = require("cmp")
local json = vim.fn.json_encode
local function make_fitten_request(bufnr, input)
local payload = {
model = "fitten-pro",
messages = { { role = "user", content = "补全当前代码行末尾,只返回纯代码,不要解释:" .. input } },
temperature = 0.1,
max_tokens = 32
}
-- 构造curl命令并异步执行
local cmd = string.format('curl -s -X POST https://api.fittentech.com/v1/chat/completions -H "Authorization: Bearer %s" -H "Content-Type: application/json" -d %s', api_key, json(payload))
vim.fn.jobstart({ "sh", "-c", cmd }, { on_stdout = function(_, data) ... end })
end
方法二:复用 LSP 的 completion handler 接口,这种方式更轻量,无需额外插件。直接在 on_complete 回调中拦截请求,用 vim.loop.spawn 启动子进程调用 curl,避免阻塞主线程。但要求 Neovim ≥ 0.9。
一个常见陷阱:Fitten Code 的响应格式虽与 OpenAI 兼容,但 completion 字段嵌套在 choices[1].message.content 中。解析时必须逐层提取,遗漏任何一层都会返回 nil。
注册为 cmp source 并启用触发
第一步,定义 source 结构:
local fitten_source = {
get_trigger_characters = function() return { "." } end,
get_priority = function() return 1000 end,
get_completions = function(fallback, snippet, ctx)
local line = vim.api.nvim_get_current_line()
local input = line:sub(1, ctx.col - 1):match(".*%S+") or ""
if #input < 2 then return fallback() end
make_fitten_request(vim.api.nvim_get_current_buf(), input)
end
}
第二步,注入 cmp 配置:
require("cmp").setup({
sources = {
{ name = "fitten", option = fitten_source },
{ name = "nvim_lsp" },
},
preselect = "none",
})
第三步,添加自动触发规则:
vim.api.nvim_create_autocmd("TextChangedI", {
pattern = "*",
callback = function() vim.schedule(function() require("cmp").refresh() end) end,
})
这三步缺一不可。缺少 autocommand 则补全不会随输入实时刷新;缺少 get_trigger_characters 则点号后不会自动唤起;priority 值若低于 LSP 源,AI 建议将始终排在队尾,肉眼无法察觉。
