Skip to content

Commit

Permalink
feat(lsp): preserve cursor position for move_item command
Browse files Browse the repository at this point in the history
  • Loading branch information
MunifTanjim committed Oct 1, 2024
1 parent 1e97a9e commit 1929605
Showing 1 changed file with 27 additions and 0 deletions.
27 changes: 27 additions & 0 deletions lua/rustaceanvim/commands/move_item.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down

0 comments on commit 1929605

Please sign in to comment.