|
1 | 1 | local M = {} |
2 | 2 |
|
3 | 3 | local context_tools = require("jumpy.context-tools") |
| 4 | +local utils = require("jumpy.utils") |
4 | 5 |
|
5 | 6 | local state = { |
6 | 7 | win = nil, |
@@ -75,9 +76,16 @@ function M.open() |
75 | 76 | return |
76 | 77 | end |
77 | 78 |
|
| 79 | + local mode = vim.api.nvim_get_mode().mode |
| 80 | + local is_scoped = mode == "v" or mode == "V" or mode == "\22" |
| 81 | + |
78 | 82 | state.source_buf = vim.api.nvim_get_current_buf() |
79 | 83 | state.reprompt_hunk_idx = nil |
80 | | - state.buf, state.win = create_float(" jumpy ") |
| 84 | + |
| 85 | + state.visual_selection = is_scoped and utils.get_visual_selection(state.source_buf) or nil |
| 86 | + local title = is_scoped and " jumpy (scoped) " or " jumpy " |
| 87 | + |
| 88 | + state.buf, state.win = create_float(title) |
81 | 89 |
|
82 | 90 | M._set_submit_keymap() |
83 | 91 | M._setup_completions(state.buf) |
@@ -173,7 +181,10 @@ function M._submit() |
173 | 181 | end |
174 | 182 |
|
175 | 183 | local source_buf = state.source_buf |
176 | | - local source_lines = vim.api.nvim_buf_get_lines(source_buf, 0, -1, false) |
| 184 | + |
| 185 | + local source_lines = state.visual_selection and vim.split(state.visual_selection.text, "\n", { plain = true }) |
| 186 | + or vim.api.nvim_buf_get_lines(source_buf, 0, -1, false) |
| 187 | + |
177 | 188 | local filetype = vim.bo[source_buf].filetype |
178 | 189 | local reprompt_idx = state.reprompt_hunk_idx |
179 | 190 |
|
@@ -242,6 +253,13 @@ function M._submit() |
242 | 253 | end |
243 | 254 |
|
244 | 255 | local hunks = diff.compute(source_lines, proposed_lines) |
| 256 | + if state.visual_selection then |
| 257 | + local offset = state.visual_selection.start_line - 1 |
| 258 | + |
| 259 | + for _, hunk in ipairs(hunks) do |
| 260 | + hunk.old_start = hunk.old_start + offset |
| 261 | + end |
| 262 | + end |
245 | 263 |
|
246 | 264 | if #hunks == 0 then |
247 | 265 | vim.notify("jumpy: no changes proposed", vim.log.levels.INFO) |
|
0 commit comments