From f81316624d077360447fd4ba977b7cb22ee2061b Mon Sep 17 00:00:00 2001 From: mitchell <70453897+orbitalquark@users.noreply.github.com> Date: Thu, 17 Mar 2022 12:15:18 -0400 Subject: Fixed "Find Next" for zero-width regex searches. "Find Prev" still does not work and appears to be a Scintilla bug. --- modules/textadept/find.lua | 2 ++ test/test.lua | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/modules/textadept/find.lua b/modules/textadept/find.lua index 67fe1038..4c0bf21b 100644 --- a/modules/textadept/find.lua +++ b/modules/textadept/find.lua @@ -213,6 +213,8 @@ local function find(text, next, flags, no_wrap, wrapped) -- If text is selected, assume it is from the current search and move the caret appropriately -- for the next search. buffer:goto_pos(next and buffer.selection_end or buffer.selection_start) + if not M.incremental and M.regex and find_text == text and found_text == '' and next and + not wrapped then buffer:goto_pos(buffer.current_pos + (next and 1 or -1)) end -- Scintilla search. buffer:search_anchor() diff --git a/test/test.lua b/test/test.lua index 4c25a598..c3c7a695 100644 --- a/test/test.lua +++ b/test/test.lua @@ -2623,6 +2623,42 @@ function test_ui_find_incremental_not_found() buffer:close(true) end +function test_ui_find_find_regex_empty() + buffer.new() + buffer:set_text('foo\n\n\nfoo') + ui.find.regex = true + for _, text in ipairs{'^', '$', '^.*$'} do + buffer:document_start() + ui.find.find_entry_text = text + for i = 1, buffer.line_count do + ui.find.find_next() + assert(buffer:line_from_position(buffer.current_pos), i) + if #text == 1 then + assert(buffer.selection_empty, 'zero-width find result expected') + else + assert_equal(buffer:get_sel_text(), buffer:get_line(i):match('^[^\r\n]*')) + end + end + if #text > 1 then + ui.find.find_next() -- should wrap + assert_equal(buffer:line_from_position(buffer.current_pos), 1) + end + end + ui.find.regex = false + buffer:close(true) +end + +function test_ui_find_find_prev_regex_empty() + buffer.new() + buffer:add_text('foo\n\n\nfoo') + ui.find.find_entry_text, ui.find.regex = '$', true + ui.find.find_prev() + assert_equal(buffer:line_from_position(buffer.current_pos), buffer.line_count - 1) + ui.find.regex = false + buffer:close(true) +end +expected_failure(test_ui_find_find_prev_regex_empty) -- Scintilla bug? + function test_ui_find_find_in_files() ui.find.find_entry_text = 'foo' ui.find.match_case = true -- cgit v1.2.3