Fix ReplaceAll bug
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -167,14 +167,29 @@ 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});
|
Int pos = GetMax(caret);
|
||||||
SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase;
|
String16 medium = GetString(buffer, {pos, INT64_MAX});
|
||||||
if (SearchWordBoundary) {
|
|
||||||
flag |= SeekFlag_WordBoundary;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
Caret result = caret;
|
||||||
Int index = 0;
|
Int index = 0;
|
||||||
if (Seek(medium, needle, &index, flag | SeekFlag_MatchFindLast)) {
|
if (Seek(medium, needle, &index, flag | SeekFlag_MatchFindLast)) {
|
||||||
@@ -189,26 +204,20 @@ Caret FindPrev(Buffer *buffer, String16 needle, Caret caret) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Caret FindNext(Buffer *buffer, String16 needle, Caret caret) {
|
Caret FindPrev(Buffer *buffer, String16 needle, Caret caret) {
|
||||||
Int pos = GetMax(caret);
|
|
||||||
String16 medium = GetString(buffer, {pos, INT64_MAX});
|
|
||||||
SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase;
|
SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase;
|
||||||
if (SearchWordBoundary) {
|
if (SearchWordBoundary) {
|
||||||
flag |= SeekFlag_WordBoundary;
|
flag |= SeekFlag_WordBoundary;
|
||||||
}
|
}
|
||||||
|
return BaseFindPrev(buffer, needle, caret, flag);
|
||||||
|
}
|
||||||
|
|
||||||
Caret result = caret;
|
Caret FindNext(Buffer *buffer, String16 needle, Caret caret) {
|
||||||
Int index = 0;
|
SeekFlag flag = SearchCaseSensitive ? SeekFlag_None : SeekFlag_IgnoreCase;
|
||||||
if (Seek(medium, needle, &index, flag)) {
|
if (SearchWordBoundary) {
|
||||||
result = MakeCaret(pos + index + needle.len, pos + index);
|
flag |= SeekFlag_WordBoundary;
|
||||||
} else {
|
|
||||||
medium = GetString(buffer);
|
|
||||||
if (Seek(medium, needle, &index, flag)) {
|
|
||||||
result = MakeCaret(index + needle.len, index);
|
|
||||||
}
|
}
|
||||||
}
|
return BaseFindNext(buffer, needle, caret, flag);
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FindAllEx(Array<Caret> *n, Buffer *buffer, String16 needle) {
|
void FindAllEx(Array<Caret> *n, Buffer *buffer, String16 needle) {
|
||||||
|
|||||||
Reference in New Issue
Block a user