|
1 | 1 | local Path = require("plenary.path") |
| 2 | +local State = require("mcphub.state") |
2 | 3 |
|
3 | 4 | -- Helper function to count diff blocks |
4 | 5 | local function count_diff_blocks(diff_content) |
@@ -113,6 +114,37 @@ local function apply_diff_blocks(original_content, diff_content) |
113 | 114 |
|
114 | 115 | return result |
115 | 116 | end |
| 117 | +-- Helper function to safely get keymap info |
| 118 | +local function get_keymap_info(mode, lhs, buffer) |
| 119 | + local maps = vim.api.nvim_buf_get_keymap(buffer, mode) |
| 120 | + for _, map in ipairs(maps) do |
| 121 | + if map.lhs == lhs then |
| 122 | + return map |
| 123 | + end |
| 124 | + end |
| 125 | + return nil |
| 126 | +end |
| 127 | + |
| 128 | +-- Helper function to restore keymap |
| 129 | +local function restore_keymap(mode, lhs, buffer, original_map) |
| 130 | + if original_map then |
| 131 | + -- If there was an original mapping, restore it |
| 132 | + local opts = { |
| 133 | + buffer = buffer, |
| 134 | + desc = original_map.desc, |
| 135 | + nowait = original_map.nowait == 1, |
| 136 | + silent = original_map.silent == 1, |
| 137 | + expr = original_map.expr == 1, |
| 138 | + } |
| 139 | + |
| 140 | + if original_map.callback then |
| 141 | + vim.keymap.set(mode, lhs, original_map.callback, opts) |
| 142 | + elseif original_map.rhs then |
| 143 | + vim.keymap.set(mode, lhs, original_map.rhs, opts) |
| 144 | + end |
| 145 | + end |
| 146 | +end |
| 147 | + |
116 | 148 | -- Core replace file logic |
117 | 149 | local function handle_replace_file(req, res) |
118 | 150 | if not req.params.path or not req.params.diff or req.params.diff == vim.NIL then |
@@ -216,14 +248,29 @@ local function handle_replace_file(req, res) |
216 | 248 | local response_sent = false |
217 | 249 | local changes_diff = nil |
218 | 250 |
|
| 251 | + local keymaps = State.config.builtin_tools.replace_in_file.keymaps |
| 252 | + or { |
| 253 | + accept = "ga", |
| 254 | + reject = "gr", |
| 255 | + } |
| 256 | + |
| 257 | + -- Store original keymaps before setting temporary ones |
| 258 | + local original_accept_map = get_keymap_info("n", keymaps.accept, bufnr) |
| 259 | + local original_reject_map = get_keymap_info("n", keymaps.reject, bufnr) |
| 260 | + |
219 | 261 | local function cleanup_diff() |
220 | 262 | vim.cmd("diffoff!") |
221 | 263 | if vim.api.nvim_buf_is_valid(diff_bufnr) then |
222 | 264 | vim.api.nvim_buf_delete(diff_bufnr, { force = true }) |
223 | 265 | end |
224 | 266 | if vim.api.nvim_buf_is_valid(bufnr) then |
225 | | - vim.keymap.del("n", "ga", { buffer = bufnr }) |
226 | | - vim.keymap.del("n", "gr", { buffer = bufnr }) |
| 267 | + -- Safely delete our temporary keymaps and restore originals |
| 268 | + pcall(vim.keymap.del, "n", keymaps.accept, { buffer = bufnr }) |
| 269 | + pcall(vim.keymap.del, "n", keymaps.reject, { buffer = bufnr }) |
| 270 | + |
| 271 | + -- Restore original keymaps if they existed |
| 272 | + restore_keymap("n", keymaps.accept, bufnr, original_accept_map) |
| 273 | + restore_keymap("n", keymaps.reject, bufnr, original_reject_map) |
227 | 274 | end |
228 | 275 | if not augroup_cleared then |
229 | 276 | pcall(vim.api.nvim_del_augroup_by_id, augroup) |
@@ -278,13 +325,13 @@ local function handle_replace_file(req, res) |
278 | 325 | vim.cmd("write") |
279 | 326 | end |
280 | 327 |
|
281 | | - -- Set up key mappings |
282 | | - vim.keymap.set("n", "ga", function() |
| 328 | + -- Set up key mappings using configured keys |
| 329 | + vim.keymap.set("n", keymaps.accept, function() |
283 | 330 | vim.cmd("write") |
284 | 331 | handle_post_write() |
285 | 332 | end, { buffer = bufnr, desc = "Accept changes" }) |
286 | 333 |
|
287 | | - vim.keymap.set("n", "gr", function() |
| 334 | + vim.keymap.set("n", keymaps.reject, function() |
288 | 335 | handle_reject() |
289 | 336 | end, { buffer = bufnr, desc = "Reject changes" }) |
290 | 337 |
|
|
0 commit comments