diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Editor.cxx | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index ceaa1398d..28d680d7a 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -5776,13 +5776,17 @@ Sci::Position Editor::GetTag(char *tagValue, int tagNumber) { Sci::Position Editor::ReplaceTarget(ReplaceType replaceType, std::string_view text) { UndoGroup ug(pdoc); + + std::string substituted; // Copy in case of re-entrance + if (replaceType == ReplaceType::patterns) { Sci::Position length = text.length(); const char *p = pdoc->SubstituteByPosition(text.data(), &length); if (!p) { return 0; } - text = std::string_view(p, length); + substituted.assign(p, length); + text = substituted; } if (replaceType == ReplaceType::minimal) { @@ -5797,19 +5801,25 @@ Sci::Position Editor::ReplaceTarget(ReplaceType replaceType, std::string_view te targetRange = SelectionSegment(start, SelectionPosition(range.end)); } + // Make a copy of targetRange in case callbacks use target + SelectionSegment replaceRange = targetRange; + // Remove the text inside the range - if (targetRange.Length() > 0) - pdoc->DeleteChars(targetRange.start.Position(), targetRange.Length()); - targetRange.end = targetRange.start; + if (replaceRange.Length() > 0) + pdoc->DeleteChars(replaceRange.start.Position(), replaceRange.Length()); // Realize virtual space of target start - const Sci::Position startAfterSpaceInsertion = RealizeVirtualSpace(targetRange.start.Position(), targetRange.start.VirtualSpace()); - targetRange.start.SetPosition(startAfterSpaceInsertion); - targetRange.end = targetRange.start; + const Sci::Position startAfterSpaceInsertion = RealizeVirtualSpace(replaceRange.start.Position(), replaceRange.start.VirtualSpace()); + replaceRange.start.SetPosition(startAfterSpaceInsertion); + replaceRange.end = replaceRange.start; // Insert the new text - const Sci::Position lengthInserted = pdoc->InsertString(targetRange.start.Position(), text); - targetRange.end.SetPosition(targetRange.start.Position() + lengthInserted); + const Sci::Position lengthInserted = pdoc->InsertString(replaceRange.start.Position(), text); + replaceRange.end.SetPosition(replaceRange.start.Position() + lengthInserted); + + // Copy back to targetRange in case application is chaining modifications + targetRange = replaceRange; + return text.length(); } |