diff options
-rw-r--r-- | modules/textadept/find.lua | 4 | ||||
-rw-r--r-- | test/test.lua | 20 |
2 files changed, 22 insertions, 2 deletions
diff --git a/modules/textadept/find.lua b/modules/textadept/find.lua index b8f70ca6..c8a77d86 100644 --- a/modules/textadept/find.lua +++ b/modules/textadept/find.lua @@ -414,10 +414,10 @@ events.connect(events.REPLACE_ALL, function(ftext, rtext) buffer:set_target_range(not replace_in_sel and 1 or s, buffer.length + 1) while buffer:search_in_target(ftext) ~= -1 and (not replace_in_sel or buffer.target_end <= buffer:indicator_end(INDIC_REPLACE, s) or EOF) do - if buffer.target_start == buffer.target_end then break end -- prevent loops + local offset = buffer.target_start ~= buffer.target_end and 0 or 1 -- for preventing loops buffer:replace_target(not M.regex and rtext or unescape(rtext)) count = count + 1 - buffer:set_target_range(buffer.target_end, buffer.length + 1) + buffer:set_target_range(buffer.target_end + offset, buffer.length + 1) end buffer:end_undo_action() diff --git a/test/test.lua b/test/test.lua index 09caf59e..0ca00440 100644 --- a/test/test.lua +++ b/test/test.lua @@ -2703,6 +2703,26 @@ function test_ui_find_replace_all() buffer:close(true) end +function test_find_replace_all_empty_matches() + buffer.new() + buffer:set_text('1\n2\n3\n4') + ui.find.find_entry_text, ui.find.replace_entry_text = '$', ',' + ui.find.regex = true + ui.find.replace_all() + assert_equal(buffer:get_text(), '1,\n2,\n3,\n4,') + buffer:undo() + buffer:set_sel(buffer:position_from_line(2), buffer:position_from_line(4)) + ui.find.replace_all() + assert_equal(buffer:get_text(), '1\n2,\n3,\n4') + buffer:undo() + ui.find.find_entry_text, ui.find.replace_entry_text = '^', '$' + ui.find.replace_all() + assert_equal(buffer:get_text(), '$1\n$2\n$3\n$4') + ui.find.find_entry_text, ui.find.replace_entry_text = '', '' + ui.find.regex = false + buffer:close(true) +end + function test_find_replace_regex_transforms() buffer.new() buffer:set_text('foObaRbaz') |