From ce1fe5feb1d863f9c1e50110226ad11b6771e6f9 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 16 Jan 2026 23:27:04 +0100 Subject: [PATCH] Fix ReplaceAll bug --- src/text_editor/commands.cpp | 10 +++---- src/text_editor/view.cpp | 53 +++++++++++++++++++++--------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index a0b9907..2cd0653 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -747,8 +747,8 @@ void Coro_ReplaceAll(mco_coro *co) { NextActiveWindowID = main.window->id; RawAppendf(main.buffer, ":Submit (enter) :Cancel (escape)\nString to search for::%S", string8); - Caret field_seek = FindNext(main.buffer, u"for::", MakeCaret(0)); - main.view->carets[0] = FindNext(main.buffer, string, field_seek); + Caret field_seek = BaseFindNext(main.buffer, u"for::", MakeCaret(0), SeekFlag_None); + main.view->carets[0] = MakeCaret(main.buffer->len, field_seek.range.max); AddCommand(&main.view->commands, "Submit", "enter", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Submit";}); AddCommand(&main.view->commands, "Cancel", "escape", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Cancel";}); @@ -770,7 +770,7 @@ void Coro_ReplaceAll(mco_coro *co) { return; } - field_seek = FindNext(main.buffer, u"for::", MakeCaret(0)); + field_seek = BaseFindNext(main.buffer, u"for::", MakeCaret(0), SeekFlag_None); Range range = {field_seek.range.max, main.buffer->len}; needle = GetString(main.buffer, range); } @@ -780,7 +780,7 @@ void Coro_ReplaceAll(mco_coro *co) { NextActiveWindowID = main.window->id; RawAppendf(main.buffer, ":Submit (enter) :Cancel (escape)\nString to replace with::%S", ToString(CoCurr->arena, needle)); - Caret field_seek = FindNext(main.buffer, u"with::", MakeCaret(0)); + Caret field_seek = BaseFindNext(main.buffer, u"with::", MakeCaret(0), SeekFlag_None); main.view->carets[0] = MakeCaret(main.buffer->len, field_seek.range.max); AddCommand(&main.view->commands, "Submit", "enter", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Submit";}); AddCommand(&main.view->commands, "Cancel", "escape", [](){BSet active = GetBSet(ActiveWindowID); active.view->hook_cmd = "Cancel";}); @@ -803,7 +803,7 @@ void Coro_ReplaceAll(mco_coro *co) { return; } - field_seek = FindNext(main.buffer, u"with::", MakeCaret(0)); + field_seek = BaseFindNext(main.buffer, u"with::", MakeCaret(0), SeekFlag_None); Range range = {field_seek.range.max, main.buffer->len}; replace = GetString(main.buffer, range); } diff --git a/src/text_editor/view.cpp b/src/text_editor/view.cpp index 774706a..a0ff2af 100644 --- a/src/text_editor/view.cpp +++ b/src/text_editor/view.cpp @@ -167,16 +167,31 @@ void IndentedNewLine(View *view) { EndEdit(buffer, &edits, &view->carets, KILL_SELECTION); } -Caret FindPrev(Buffer *buffer, String16 needle, Caret caret) { - Int pos = GetMin(caret); - String16 medium = GetString(buffer, {0, pos}); - SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase; - if (SearchWordBoundary) { - flag |= SeekFlag_WordBoundary; - } +// WARNING: Don't use in user facing stuff +Caret BaseFindNext(Buffer *buffer, String16 needle, Caret caret, SeekFlag flag) { + Int pos = GetMax(caret); + String16 medium = GetString(buffer, {pos, INT64_MAX}); Caret result = caret; - Int index = 0; + Int index = 0; + if (Seek(medium, needle, &index, flag)) { + result = MakeCaret(pos + index + needle.len, pos + index); + } else { + medium = GetString(buffer); + if (Seek(medium, needle, &index, flag)) { + result = MakeCaret(index + needle.len, index); + } + } + + return result; +} + +// WARNING: Don't use in user facing stuff +Caret BaseFindPrev(Buffer *buffer, String16 needle, Caret caret, SeekFlag flag) { + Int pos = GetMin(caret); + String16 medium = GetString(buffer, {0, pos}); + Caret result = caret; + Int index = 0; if (Seek(medium, needle, &index, flag | SeekFlag_MatchFindLast)) { result = MakeCaret(index, index + needle.len); } else { @@ -189,26 +204,20 @@ Caret FindPrev(Buffer *buffer, String16 needle, Caret caret) { return result; } -Caret FindNext(Buffer *buffer, String16 needle, Caret caret) { - Int pos = GetMax(caret); - String16 medium = GetString(buffer, {pos, INT64_MAX}); +Caret FindPrev(Buffer *buffer, String16 needle, Caret caret) { SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase; if (SearchWordBoundary) { flag |= SeekFlag_WordBoundary; } + return BaseFindPrev(buffer, needle, caret, flag); +} - Caret result = caret; - Int index = 0; - if (Seek(medium, needle, &index, flag)) { - result = MakeCaret(pos + index + needle.len, pos + index); - } else { - medium = GetString(buffer); - if (Seek(medium, needle, &index, flag)) { - result = MakeCaret(index + needle.len, index); - } +Caret FindNext(Buffer *buffer, String16 needle, Caret caret) { + SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase; + if (SearchWordBoundary) { + flag |= SeekFlag_WordBoundary; } - - return result; + return BaseFindNext(buffer, needle, caret, flag); } void FindAllEx(Array *n, Buffer *buffer, String16 needle) {