From 77dfa02f3ec74555039a20b9c68ea9e27eebf03c Mon Sep 17 00:00:00 2001 From: altermo <107814000+altermo@users.noreply.github.com> Date: Sat, 1 Aug 2026 18:04:09 +0200 Subject: refactor: combine all visual_selection funcions --- runtime/lua/vim/treesitter/_range.lua | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'runtime/lua/vim/treesitter/_range.lua') diff --git a/runtime/lua/vim/treesitter/_range.lua b/runtime/lua/vim/treesitter/_range.lua index b37135efc7..3f1238d036 100644 --- a/runtime/lua/vim/treesitter/_range.lua +++ b/runtime/lua/vim/treesitter/_range.lua @@ -172,4 +172,36 @@ function M.add_bytes(source, range) return { start_row, start_col, start_byte, end_row, end_col, end_byte } end +---@param range Range +function M.visual_select(range) + local start_row, start_col, end_row, end_col = M.unpack4(range) + + -- If the selection ends at column 0, adjust the position to the end of the previous line. + if end_col == 0 then + end_row = end_row - 1 + end_col = #vim.fn.getline(end_row + 1) + 1 + end + + if vim.fn.visualmode() ~= 'v' then + -- Reset visualmode() to 'v' + vim.cmd.normal({ 'v\27', bang = true }) + end + + local cursor_other_end_of_selection = false + local visual_col, visual_row = vim.fn.col('v'), vim.fn.line('v') + local cursor_col, cursor_row = vim.fn.col('.'), vim.fn.line('.') + if M.cmp_pos.gt(visual_row, visual_col, cursor_row, cursor_col) then + cursor_other_end_of_selection = true + end + + vim.fn.setpos("'<", { 0, start_row + 1, start_col + 1, 0 }) + vim.fn.setpos("'>", { 0, end_row + 1, end_col, 0 }) + + if cursor_other_end_of_selection then + vim.cmd.normal({ 'gvo', bang = true }) + else + vim.cmd.normal({ 'gv', bang = true }) + end +end + return M -- cgit