Files
nvim/lua/plugins/opencode.lua
Morten Olsen d9950b3e4d add opencode
2026-01-26 22:25:49 +01:00

77 lines
3.5 KiB
Lua

return {
{
"NickvanDyke/opencode.nvim",
dependencies = {
"folke/snacks.nvim",
"ThePrimeagen/harpoon",
},
---@type opencode.Config
opts = {
auto_reload = true, -- Automatically reload buffers edited by opencode
auto_focus = false, -- Focus the opencode window after prompting
win = {
position = "right",
enter = false,
width = 0.4, -- 40% of screen width
},
context = {
-- Custom context: include harpooned files in prompts
["@harpoon"] = function()
local ok, harpoon = pcall(require, "harpoon")
if not ok then
return nil
end
local list = harpoon:list()
if not list or list:length() == 0 then
return nil
end
local paths = {}
for i = 1, list:length() do
local item = list:get(i)
if item and item.value then
table.insert(paths, item.value)
end
end
if #paths == 0 then
return nil
end
return "Harpooned files:\n" .. table.concat(paths, "\n")
end,
},
},
-- stylua: ignore
keys = {
-- Core commands
{ "<leader>kk", function() require("opencode").toggle() end, desc = "Toggle opencode" },
{ "<leader>ka", function() require("opencode").ask() end, desc = "Ask opencode", mode = { "n", "v" } },
{ "<leader>kA", function() require("opencode").ask("@file ") end, desc = "Ask opencode about current file", mode = { "n", "v" } },
{ "<leader>kn", function() require("opencode").command("/new") end, desc = "New session" },
-- Code understanding
{ "<leader>ke", function() require("opencode").prompt("Explain @cursor and its context") end, desc = "Explain code near cursor" },
{ "<leader>kE", function() require("opencode").prompt("Explain @selection in detail") end, desc = "Explain selection", mode = "v" },
-- Code review & quality
{ "<leader>kr", function() require("opencode").prompt("Review @file for correctness and readability") end, desc = "Review file" },
{ "<leader>kg", function() require("opencode").prompt("Review @diff for bugs, edge cases, and improvements") end, desc = "Review git diff" },
{ "<leader>kq", function() require("opencode").prompt("Help me fix these issues from @quickfix") end, desc = "Fix quickfix items" },
-- Code fixes & improvements
{ "<leader>kf", function() require("opencode").prompt("Fix these @diagnostics") end, desc = "Fix errors" },
{ "<leader>ko", function() require("opencode").prompt("Optimize @selection for performance and readability") end, desc = "Optimize selection", mode = "v" },
{ "<leader>kR", function() require("opencode").prompt("Refactor @selection to be more maintainable") end, desc = "Refactor selection", mode = "v" },
-- Code generation
{ "<leader>kd", function() require("opencode").prompt("Add documentation comments for @selection") end, desc = "Document selection", mode = "v" },
{ "<leader>kt", function() require("opencode").prompt("Add tests for @selection") end, desc = "Test selection", mode = "v" },
-- Harpoon integration
{ "<leader>kh", function() require("opencode").ask("@harpoon ") end, desc = "Ask about harpooned files" },
{ "<leader>kH", function() require("opencode").prompt("Analyze the relationships between @harpoon and suggest improvements") end, desc = "Analyze harpooned files" },
},
},
}