diff --git a/lua/nvim-treesitter-textobjects/shared.lua b/lua/nvim-treesitter-textobjects/shared.lua index 15099ffe..d3eac95f 100644 --- a/lua/nvim-treesitter-textobjects/shared.lua +++ b/lua/nvim-treesitter-textobjects/shared.lua @@ -214,21 +214,24 @@ end ---@param range Range4 ---@param row integer ---@param col integer +---@param end_col_offset integer? nil (implies 0) or -1 - see tests/select/python/selection_mode.py ---@return boolean -local function is_in_range(range, row, col) +local function is_in_range(range, row, col, end_col_offset) local start_row, start_col, end_row, end_col = unpack(range) ---@type integer, integer, integer, integer - end_col = end_col - 1 - local is_in_rows = start_row <= row and end_row >= row - local is_after_start_col_if_needed = true - if start_row == row then - is_after_start_col_if_needed = col >= start_col + if start_row > row or end_row < row then + return false end - local is_before_end_col_if_needed = true - if end_row == row then - is_before_end_col_if_needed = col <= end_col + + if start_row == row and col < start_col then + return false end - return is_in_rows and is_after_start_col_if_needed and is_before_end_col_if_needed + + if end_row ~= row then + return true + end + + return col <= end_col + (end_col_offset or 0) end ---@param range1 Range4 @@ -266,7 +269,7 @@ local function best_range_at_point(ranges, row, col, opts) local lookbehind_earliest_start ---@type integer for _, range in pairs(ranges) do - if range and is_in_range(M.torange4(range), row, col) then + if range and is_in_range(M.torange4(range), row, col, -1) then local length = range[6] - range[3] if not range_length or length < range_length then smallest_range = range diff --git a/tests/select/python/selection_mode.py b/tests/select/python/selection_mode.py index ecc3e1c9..3a137c32 100644 --- a/tests/select/python/selection_mode.py +++ b/tests/select/python/selection_mode.py @@ -6,3 +6,8 @@ def __init__(self, *arg): my_list.append(arg_) self.my_list = my_list + + # see https://github.com/nvim-treesitter/nvim-treesitter-textobjects/issues/700 + print(1, type('1'), ['1']) + print(['1', '2'], 3) + print(['1', '2']) diff --git a/tests/select/python_spec.lua b/tests/select/python_spec.lua index 9efd6c9c..aeffc59a 100644 --- a/tests/select/python_spec.lua +++ b/tests/select/python_spec.lua @@ -27,7 +27,10 @@ describe('command equality Python:', function() run:compare_cmds('aligned_indent.py', { row = 1, col = 0, cmds = { 'd]a', 'v]ad', 'c]a' } }) run:compare_cmds( 'selection_mode.py', - { row = 2, col = 4, cmds = { 'dam', 'dVam', 'vamd', 'Vamd' } } + { row = 2, col = 4, cmds = { 'dam', 'dVam', 'vamd', 'Vamd', 'dG' } } ) run:compare_cmds('selection_mode.py', { row = 5, col = 8, cmds = { 'dVao', 'dao' } }, nil, false) + run:compare_cmds('selection_mode.py', { row = 10, col = 17, cmds = { 'dia', 'dt,' } }) + run:compare_cmds('selection_mode.py', { row = 11, col = 23, cmds = { 'dia', 'd%' } }) + run:compare_cmds('selection_mode.py', { row = 12, col = 23, cmds = { 'dia', 'd%' } }) end)