diff options
Diffstat (limited to 'lua/config/codecompanion-save.lua')
| -rw-r--r-- | lua/config/codecompanion-save.lua | 145 |
1 files changed, 92 insertions, 53 deletions
diff --git a/lua/config/codecompanion-save.lua b/lua/config/codecompanion-save.lua index 46f2d94..1659b22 100644 --- a/lua/config/codecompanion-save.lua +++ b/lua/config/codecompanion-save.lua @@ -1,60 +1,99 @@ --- add 2 commands: --- CodeCompanionSave [space delimited args] --- CodeCompanionLoad --- Save will save current chat in a md file named 'space-delimited-args.md' --- Load will use a telescope filepicker to open a previously saved chat - --- create a folder to store our chats -local Path = require("plenary.path") -local data_path = vim.fn.stdpath("data") -local save_folder = Path:new(data_path, "cc_saves") -if not save_folder:exists() then - save_folder:mkdir({ parents = true }) +local copilot_fn = function() + local copilot_config = { + + schema = { + model = { + default = "claude-3.5-sonnet", + }, + }, + } + return require("codecompanion.adapters").extend("copilot", copilot_config) +end + +local supported_adapters = { + copilot = copilot_fn, +} +local function save_path() + local Path = require("plenary.path") + local p = Path:new(vim.fn.stdpath("data") .. "/cc_saves") + p:mkdir({ parents = true }) + return p end --- telescope picker for our saved chats +--- Load a saved codecompanion.nvim chat file into a new CodeCompanion chat buffer. +--- Usage: CodeCompanionLoad vim.api.nvim_create_user_command("CodeCompanionLoad", function() - local t_builtin = require("telescope.builtin") - local t_actions = require("telescope.actions") - local t_action_state = require("telescope.actions.state") - - local function start_picker() - t_builtin.find_files({ - prompt_title = "Saved CodeCompanion Chats | <c-d>: delete", - cwd = save_folder:absolute(), - attach_mappings = function(_, map) - map("i", "<c-d>", function(prompt_bufnr) - local selection = t_action_state.get_selected_entry() - local filepath = selection.path or selection.filename - os.remove(filepath) - t_actions.close(prompt_bufnr) - start_picker() - end) - return true - end, - }) - end - start_picker() + local fzf = require("fzf-lua") + + local function select_adapter(filepath) + local adapters = vim.tbl_keys(supported_adapters) + + fzf.fzf_exec(adapters, { + prompt = "Select CodeCompanion Adapter> ", + actions = { + ["default"] = function(selected) + local adapter = selected[1] + -- Open new CodeCompanion chat with selected adapter + vim.cmd("CodeCompanionChat " .. adapter) + + -- Read contents of saved chat file + local lines = vim.fn.readfile(filepath) + + -- Get the current buffer (which should be the new CodeCompanion chat) + local current_buf = vim.api.nvim_get_current_buf() + + -- Paste contents into the new chat buffer + vim.api.nvim_buf_set_lines(current_buf, 0, -1, false, lines) + end, + }, + }) + end + + local function start_picker() + local files = vim.fn.glob(save_path() .. "/*", false, true) + + fzf.fzf_exec(files, { + prompt = "Saved CodeCompanion Chats | <c-r>: remove >", + previewer = "builtin", + actions = { + ["default"] = function(selected) + if #selected > 0 then + local filepath = selected[1] + select_adapter(filepath) + end + end, + ["ctrl-r"] = function(selected) + if #selected > 0 then + local filepath = selected[1] + os.remove(filepath) + -- Refresh the picker + start_picker() + end + end, + }, + }) + end + + start_picker() end, {}) --- save current chat, `CodeCompanionSave foo bar baz` will save as 'foo-bar-baz.md' +--- Save the current codecompanion.nvim chat buffer to a file in the save_folder. +--- Usage: CodeCompanionSave <filename>.md +---@param opts table vim.api.nvim_create_user_command("CodeCompanionSave", function(opts) - local codecompanion = require("codecompanion") - local success, chat = pcall(function() - return codecompanion.buf_get_chat(0) - end) - if not success or chat == nil then - vim.notify( - "CodeCompanionSave should only be called from CodeCompanion chat buffers", - vim.log.levels.ERROR - ) - return - end - if #opts.fargs == 0 then - vim.notify("CodeCompanionSave requires at least 1 arg to make a file name", vim.log.levels.ERROR) - end - local save_name = table.concat(opts.fargs, "-") .. ".md" - local save_path = Path:new(save_folder, save_name) - local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) - save_path:write(table.concat(lines, "\n"), "w") + local codecompanion = require("codecompanion") + local success, chat = pcall(function() + return codecompanion.buf_get_chat(0) + end) + if not success or chat == nil then + vim.notify("CodeCompanionSave should only be called from CodeCompanion chat buffers", vim.log.levels.ERROR) + return + end + if #opts.fargs == 0 then + vim.notify("CodeCompanionSave requires at least 1 arg to make a file name", vim.log.levels.ERROR) + end + local save_name = table.concat(opts.fargs, "-") .. ".md" + local save_file = save_path():joinpath(save_name) + local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) + save_file:write(table.concat(lines, "\n"), "w") end, { nargs = "*" }) |