From 6a12ec7b0aab52f3aab55724139670d9f1868847 Mon Sep 17 00:00:00 2001 From: JP Appel Date: Tue, 1 Apr 2025 19:27:24 -0400 Subject: Add keybind for language server ranged format --- nvim/lua/shared.lua | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) (limited to 'nvim/lua/shared.lua') diff --git a/nvim/lua/shared.lua b/nvim/lua/shared.lua index ae97cdd..2dc398e 100644 --- a/nvim/lua/shared.lua +++ b/nvim/lua/shared.lua @@ -5,18 +5,44 @@ function M.cmd_pcall(string) local success, msg = pcall(function() vim.cmd(string) end) if not success then msg = string.match(tostring(msg), "E%d+.*") - vim.api.nvim_err_writeln(msg) + vim.api.nvim_echo({ { msg } }, true, { err = true }) end end ---- Get the lines of a visual selection ---- @return { lines : string[], range : { start : integer, stop : integer } } -M.get_visual = function() +--- Get the positions of the current visual selection using (1,0) indexing +--- @param opts {reset_mark: boolean?, reselect_text: boolean?} +--- @return { start: integer[], stop:integer[]} +M.get_visual_range = function(opts) + local old_start = {} + local old_stop = {} + if opts.reset_mark then + old_start = vim.api.nvim_buf_get_mark(0, "<") + old_stop = vim.api.nvim_buf_get_mark(0, ">") + end -- return to normal mode to correctly set '< and '> marks vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("", true, false, true), 'x', false) + local start_sel = vim.api.nvim_buf_get_mark(0, "<") + local stop_sel = vim.api.nvim_buf_get_mark(0, ">") - local range = { start = vim.api.nvim_buf_get_mark(0, "<")[1], stop = vim.api.nvim_buf_get_mark(0, ">")[1] } + if opts.reselect_text then + vim.cmd("normal! gv") + end + + if opts.reset_mark then + vim.api.nvim_buf_set_mark(0, "<", old_start[1], old_start[2], {}) + vim.api.nvim_buf_set_mark(0, ">", old_stop[1], old_stop[2], {}) + end + return { + start = start_sel, + stop = stop_sel, + } +end + +--- Get the lines of a visual selection +--- @return { lines : string[], range : { start : integer, stop : integer } } +M.get_visual = function() + local range = M.get_visual_range({}) local lines = vim.api.nvim_buf_get_lines(0, range.start - 1, range.stop, false) return { lines = lines, range = range } @@ -39,9 +65,7 @@ end -- Shift the visual selection by amount, clamping to buffer size --- @param amount integer function M.vert_shift_selection(amount) - vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("", true, false, true), 'x', false) - - local init = { start = vim.api.nvim_buf_get_mark(0, '<'), stop = vim.api.nvim_buf_get_mark(0, '>') } + local init = M.get_visual_range({}) local target = { start = { init.start[1] + amount, init.start[2] }, stop = { init.stop[1] + amount, init.stop[2] } -- cgit v1.2.3