aboutsummaryrefslogtreecommitdiffstats
path: root/lua/config/codecompanion-save.lua
diff options
context:
space:
mode:
authorElvis Claros Castro <elvis@claros.ar>2025-01-31 14:21:32 -0300
committerElvis Claros Castro <elvis@claros.ar>2025-01-31 14:21:32 -0300
commit65eb48ffcdb0aa7a0245b462b860b0f9c2c6d906 (patch)
tree9c0261d184ed5e7c2ae59192f353f1a004b857fd /lua/config/codecompanion-save.lua
parentf27115f7c053d1d8e4b2af4b7506210fffc51c95 (diff)
downloadnvim-conf-65eb48ffcdb0aa7a0245b462b860b0f9c2c6d906.tar.gz
nvim-conf-65eb48ffcdb0aa7a0245b462b860b0f9c2c6d906.zip
Feat: agrego vimtex
Diffstat (limited to 'lua/config/codecompanion-save.lua')
-rw-r--r--lua/config/codecompanion-save.lua145
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 = "*" })