From 816dc899139f2da66b30337a4501ccd5de45ccc6 Mon Sep 17 00:00:00 2001 From: EdenQwQ Date: Mon, 10 Mar 2025 21:31:37 +0800 Subject: [PATCH] nixvim: copilot -> fitten --- home/programs/coding/nixvim/ai.nix | 274 ++++++++++++------------ home/programs/coding/nixvim/cmp.nix | 1 - home/programs/coding/nixvim/default.nix | 1 - 3 files changed, 140 insertions(+), 136 deletions(-) diff --git a/home/programs/coding/nixvim/ai.nix b/home/programs/coding/nixvim/ai.nix index 5dafdf7..a03272b 100644 --- a/home/programs/coding/nixvim/ai.nix +++ b/home/programs/coding/nixvim/ai.nix @@ -1,152 +1,158 @@ { config, + pkgs, ... }: +let + get_base_secret = + path: + builtins.split "/" path + |> builtins.tail + |> builtins.filter (value: builtins.isString value) + |> builtins.concatStringsSep "/"; +in { programs.nixvim = { + extraPlugins = [ + (pkgs.vimUtils.buildVimPlugin { + name = "fittencode"; + src = pkgs.fetchFromGitHub { + owner = "luozhiya"; + repo = "fittencode.nvim"; + rev = "a52440968404917d0a3625a60c809edf65e52787"; + hash = "sha256-Xw34CLaVIXDbX6knW9TZgE0eaz6bT4UGKiBHesH/KcQ="; + }; + }) + ]; + extraConfigLua = + # lua + '' + require("fittencode").setup({ + completion_mode = "inline", + keymaps = { + inline = { + [""] = "accept_all_suggestions", + }, + }, + }) + ''; plugins = { - copilot-lua = { - enable = true; - settings.panel.enabled = false; - settings.suggestion.enabled = false; - settings.filetypes.markdown = true; - }; - copilot-chat.enable = true; + cmp.settings.sources = [ + { + name = "fittencode"; + group_index = 1; + } + ]; codecompanion = { enable = true; - settings = - let - get_base_secret = - path: - builtins.split "/" path - |> builtins.tail - |> builtins.filter (value: builtins.isString value) - |> builtins.concatStringsSep "/"; - in - { - adapters.copilot.__raw = - # lua - '' - function() - return require("codecompanion.adapters").extend("copilot", { - schema = { - model = { - default = "claude-3.7-sonnet", - }, - max_tokens = { - default = 65536, - } + settings = { + adapters.deepseek.__raw = + # lua + '' + function() + local deepseek_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.deepseek_token.path}", "r") + local deepseek_api_key = deepseek_token_file:read() + deepseek_token_file:close() + return require("codecompanion.adapters").extend("deepseek", { + env = { + url = "https://api.deepseek.ai", + api_key = deepseek_api_key, + } + }) + end + ''; + adapters.siliconflow.__raw = + # lua + '' + function () + local siliconflow_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.siliconflow_token.path}", "r") + local siliconflow_api_key = siliconflow_token_file:read() + siliconflow_token_file:close() + return require("codecompanion.adapters").extend("openai_compatible", { + name = "siliconflow", + env = { + url = "https://api.siliconflow.cn", + api_key = siliconflow_api_key, + }, + schema = { + model = { + default = "Pro/deepseek-ai/DeepSeek-V3", } - }) - end - ''; - adapters.deepseek.__raw = - # lua - '' - function() - local deepseek_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.deepseek_token.path}", "r") - local deepseek_api_key = deepseek_token_file:read() - deepseek_token_file:close() - return require("codecompanion.adapters").extend("deepseek", { - env = { - url = "https://api.deepseek.ai", - api_key = deepseek_api_key, + } + }) + end + ''; + adapters.zjuchat.__raw = + # lua + '' + function () + local zjuchat_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.zjuchat_token.path}", "r") + local zjuchat_api_key = zjuchat_token_file:read() + zjuchat_token_file:close() + return require("codecompanion.adapters").extend("openai_compatible", { + name = "zjuchat", + env = { + url = "https://chat.zju.edu.cn/api/ai", + api_key = zjuchat_api_key, + }, + schema = { + model = { + default = "deepseek-v3-671b", } - }) - end - ''; - adapters.siliconflow.__raw = - # lua - '' - function () - local siliconflow_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.siliconflow_token.path}", "r") - local siliconflow_api_key = siliconflow_token_file:read() - siliconflow_token_file:close() - return require("codecompanion.adapters").extend("openai_compatible", { - name = "siliconflow", - env = { - url = "https://api.siliconflow.cn", - api_key = siliconflow_api_key, - }, - schema = { - model = { - default = "Pro/deepseek-ai/DeepSeek-V3", - } + } + }) + end + ''; + adapters.gemini.__raw = + # lua + '' + function() + local gemini_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.gemini_token.path}", "r") + local gemini_api_key = gemini_token_file:read() + gemini_token_file:close() + return require("codecompanion.adapters").extend("gemini", { + env = { + api_key = gemini_api_key, + }, + schema = { + model = { + default = "gemini-2.0-flash-thinking-exp-01-21", } - }) - end - ''; - adapters.zjuchat.__raw = - # lua - '' - function () - local zjuchat_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.zjuchat_token.path}", "r") - local zjuchat_api_key = zjuchat_token_file:read() - zjuchat_token_file:close() - return require("codecompanion.adapters").extend("openai_compatible", { - name = "zjuchat", - env = { - url = "https://chat.zju.edu.cn/api/ai", - api_key = zjuchat_api_key, - }, - schema = { - model = { - default = "deepseek-v3-671b", - } - } - }) - end - ''; - adapters.gemini.__raw = - # lua - '' - function() - local gemini_token_file = io.open(os.getenv("XDG_RUNTIME_DIR") .. "/" .. "${get_base_secret config.age.secrets.gemini_token.path}", "r") - local gemini_api_key = gemini_token_file:read() - gemini_token_file:close() - return require("codecompanion.adapters").extend("gemini", { - env = { - api_key = gemini_api_key, - }, - schema = { - model = { - default = "gemini-2.0-flash-thinking-exp-01-21", - } - } - }) - end - ''; - strategies = { - inline = { - adapter = "siliconflow"; - keymaps = { - accept_change.modes.n = "ca"; - reject_change.modes.n = "cr"; - }; + } + }) + end + ''; + strategies = { + inline = { + adapter = "siliconflow"; + keymaps = { + accept_change.modes.n = "ca"; + reject_change.modes.n = "cr"; }; - chat = { - adapter = "siliconflow"; - slash_commands.__raw = # lua - '' - { - ["file"] = { - opts = { - provider = "telescope", - }, - }, - }, - { - ["buffer"] = { - opts = { - provider = "telescope", - }, - }, - }, - ''; - }; - agent.adapter = "siliconflow"; }; + chat = { + adapter = "siliconflow"; + slash_commands.__raw = # lua + '' + { + ["file"] = { + opts = { + provider = "telescope", + }, + }, + }, + { + ["buffer"] = { + opts = { + provider = "telescope", + }, + }, + }, + ''; + }; + agent.adapter = "siliconflow"; }; + }; }; }; keymaps = [ diff --git a/home/programs/coding/nixvim/cmp.nix b/home/programs/coding/nixvim/cmp.nix index a662000..7b0649c 100644 --- a/home/programs/coding/nixvim/cmp.nix +++ b/home/programs/coding/nixvim/cmp.nix @@ -9,7 +9,6 @@ { name = "emoji"; } { name = "luasnip"; } { name = "nvim_lsp"; } - { name = "copilot"; } ]; settings.mapping = { "" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})"; diff --git a/home/programs/coding/nixvim/default.nix b/home/programs/coding/nixvim/default.nix index 4383332..dfd33c8 100644 --- a/home/programs/coding/nixvim/default.nix +++ b/home/programs/coding/nixvim/default.nix @@ -22,7 +22,6 @@ enable = true; standalonePlugins = [ "nvim-treesitter" - "copilot.lua" ]; }; globals = {