Fix ReplaceAll bug

This commit is contained in:
Krzosa Karol
2026-01-16 23:27:04 +01:00
parent 270109a56b
commit ce1fe5feb1
2 changed files with 36 additions and 27 deletions

View File

@@ -747,8 +747,8 @@ void Coro_ReplaceAll(mco_coro *co) {
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
RawAppendf(main.buffer, ":Submit (enter) :Cancel (escape)\nString to search for::%S", string8); RawAppendf(main.buffer, ":Submit (enter) :Cancel (escape)\nString to search for::%S", string8);
Caret field_seek = FindNext(main.buffer, u"for::", MakeCaret(0)); Caret field_seek = BaseFindNext(main.buffer, u"for::", MakeCaret(0), SeekFlag_None);
main.view->carets[0] = FindNext(main.buffer, string, field_seek); 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, "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";}); 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; 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}; Range range = {field_seek.range.max, main.buffer->len};
needle = GetString(main.buffer, range); needle = GetString(main.buffer, range);
} }
@@ -780,7 +780,7 @@ void Coro_ReplaceAll(mco_coro *co) {
NextActiveWindowID = main.window->id; NextActiveWindowID = main.window->id;
RawAppendf(main.buffer, ":Submit (enter) :Cancel (escape)\nString to replace with::%S", ToString(CoCurr->arena, needle)); 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); 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, "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";}); 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; 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}; Range range = {field_seek.range.max, main.buffer->len};
replace = GetString(main.buffer, range); replace = GetString(main.buffer, range);
} }

View File

@@ -167,35 +167,10 @@ void IndentedNewLine(View *view) {
EndEdit(buffer, &edits, &view->carets, KILL_SELECTION); EndEdit(buffer, &edits, &view->carets, KILL_SELECTION);
} }
Caret FindPrev(Buffer *buffer, String16 needle, Caret caret) { // WARNING: Don't use in user facing stuff
Int pos = GetMin(caret); Caret BaseFindNext(Buffer *buffer, String16 needle, Caret caret, SeekFlag flag) {
String16 medium = GetString(buffer, {0, pos});
SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase;
if (SearchWordBoundary) {
flag |= SeekFlag_WordBoundary;
}
Caret result = caret;
Int index = 0;
if (Seek(medium, needle, &index, flag | SeekFlag_MatchFindLast)) {
result = MakeCaret(index, index + needle.len);
} else {
medium = GetString(buffer);
if (Seek(medium, needle, &index, flag | SeekFlag_MatchFindLast)) {
result = MakeCaret(index, index + needle.len);
}
}
return result;
}
Caret FindNext(Buffer *buffer, String16 needle, Caret caret) {
Int pos = GetMax(caret); Int pos = GetMax(caret);
String16 medium = GetString(buffer, {pos, INT64_MAX}); String16 medium = GetString(buffer, {pos, INT64_MAX});
SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase;
if (SearchWordBoundary) {
flag |= SeekFlag_WordBoundary;
}
Caret result = caret; Caret result = caret;
Int index = 0; Int index = 0;
@@ -211,6 +186,40 @@ Caret FindNext(Buffer *buffer, String16 needle, Caret caret) {
return result; 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 {
medium = GetString(buffer);
if (Seek(medium, needle, &index, flag | SeekFlag_MatchFindLast)) {
result = MakeCaret(index, index + needle.len);
}
}
return result;
}
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 FindNext(Buffer *buffer, String16 needle, Caret caret) {
SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase;
if (SearchWordBoundary) {
flag |= SeekFlag_WordBoundary;
}
return BaseFindNext(buffer, needle, caret, flag);
}
void FindAllEx(Array<Caret> *n, Buffer *buffer, String16 needle) { void FindAllEx(Array<Caret> *n, Buffer *buffer, String16 needle) {
String16 string = GetString(buffer); String16 string = GetString(buffer);
String16 start = string; String16 start = string;