From 1929605e1b86a0335fea58a482e08db9562fd3bc Mon Sep 17 00:00:00 2001 From: Munif Tanjim Date: Tue, 1 Oct 2024 10:40:52 +0600 Subject: [PATCH] feat(lsp): preserve cursor position for move_item command --- lua/rustaceanvim/commands/move_item.lua | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lua/rustaceanvim/commands/move_item.lua b/lua/rustaceanvim/commands/move_item.lua index 524ef8e5..dc87519d 100644 --- a/lua/rustaceanvim/commands/move_item.lua +++ b/lua/rustaceanvim/commands/move_item.lua @@ -12,14 +12,41 @@ local function get_params(up) return params end +local function extract_cursor_position(text_edits) + local cursor = { text_edits[1].range.start.line } + local prev_te + for _, te in ipairs(text_edits) do + if te.newText and te.insertTextFormat == 2 then + if not cursor[2] then + if prev_te then + cursor[1] = cursor[1] + + math.max(0, te.range.start.line - prev_te.range['end'].line - 1) + - (prev_te.range.start.line == te.range.start.line and 1 or 0) + end + local pos_start = string.find(te.newText, '%$0') + local lines = vim.split(string.sub(te.newText, 1, pos_start), '\n') + local total_lines = #lines + cursor[1] = cursor[1] + total_lines + if pos_start then + cursor[2] = (total_lines == 1 and te.range.start.character or 0) + #lines[total_lines] - 1 + end + end + end + prev_te = te + end + return cursor +end + -- move it baby local function handler(_, result, ctx) if result == nil or #result == 0 then return end + local cursor = extract_cursor_position(result) local overrides = require('rustaceanvim.overrides') overrides.snippet_text_edits_to_text_edits(result) vim.lsp.util.apply_text_edits(result, ctx.bufnr, vim.lsp.get_client_by_id(ctx.client_id).offset_encoding) + vim.api.nvim_win_set_cursor(0, cursor) end local rl = require('rustaceanvim.rust_analyzer')