diff --git a/lua/jumpy/init.lua b/lua/jumpy/init.lua index 2b9a5b3..a24b9b5 100644 --- a/lua/jumpy/init.lua +++ b/lua/jumpy/init.lua @@ -33,6 +33,7 @@ M.config = { accept_all = "A", reject_all = "X", reprompt = "r", + quickfix = "q", }, highlights = { added = "JumpyAdded", @@ -122,6 +123,9 @@ function M._setup_keymaps() map("n", c.reprompt, function() require("jumpy.prompt").reprompt() end, opts) + map("n", c.quickfix, function() + require("jumpy.navigate").add_hunks_to_quickfix() + end, opts) end return M diff --git a/lua/jumpy/navigate.lua b/lua/jumpy/navigate.lua index 3099214..65d90f4 100644 --- a/lua/jumpy/navigate.lua +++ b/lua/jumpy/navigate.lua @@ -154,6 +154,44 @@ function M.replace_hunk(bufnr, hunk_idx, new_lines) render.update_hunk_lines(bufnr, hunk_idx, new_lines) end +function M.add_hunks_to_quickfix() + local states = render.get_all_states() + local items = M._transform_hunks_to_quickfix(states) + + if #items == 0 then + vim.notify("jumpy: no hunks", vim.log.levels.INFO) + return + end + + vim.fn.setqflist(items, "r") + vim.cmd("copen") +end + +function M._transform_hunks_to_quickfix(states) + local items = {} + for bufnr, state in pairs(states) do + for _, hunk in pairs(state.hunks) do + if hunk then + local text + if #hunk.added_lines > 0 then + text = "+ " .. hunk.added_lines[1] + else + text = "- " .. hunk.removed_lines[1] + end + + table.insert(items, { + bufnr = bufnr, + lnum = hunk.old_start, + col = 1, + text = text, + }) + end + end + end + + return items +end + local offset_table = {} function M._get_offset(bufnr, hunk_idx) diff --git a/lua/jumpy/render.lua b/lua/jumpy/render.lua index 40ec1e6..3962aa3 100644 --- a/lua/jumpy/render.lua +++ b/lua/jumpy/render.lua @@ -8,6 +8,20 @@ function M.get_state(bufnr) return buf_states[bufnr] end +function M.get_all_states() + local states = {} + for _, buf in ipairs(vim.api.nvim_list_bufs()) do + if vim.api.nvim_buf_is_loaded(buf) then + local state = M.get_state(buf) + if state then + states[buf] = state + end + end + end + + return states +end + function M.show(bufnr, hunks, original_lines, proposed_lines) M.clear(bufnr)