Fitten_Code Neovim配置推荐:Lua脚本AI补全

2026-06-28阅读 0热度 0
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 建议将始终排在队尾,肉眼无法察觉。

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策