aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormitchell <70453897+orbitalquark@users.noreply.github.com>2021-06-05 13:37:34 -0400
committermitchell <70453897+orbitalquark@users.noreply.github.com>2021-06-05 13:37:34 -0400
commit57d946f2eba8de5f7386b553558567b470900322 (patch)
tree379f1d35b7e170b33b47d5dcc5b3a0f1819adf61
parentcb080a63dc6855409300b02195a9d154845ca66d (diff)
downloadtextadept-57d946f2eba8de5f7386b553558567b470900322.tar.gz
textadept-57d946f2eba8de5f7386b553558567b470900322.zip
Allow "Replace All" for empty regex matches.
-rw-r--r--modules/textadept/find.lua4
-rw-r--r--test/test.lua20
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')