diff --git a/src/text_editor/buffer_multi_cursor.cpp b/src/text_editor/buffer_multi_cursor.cpp index 05604a7..1e8b7c2 100644 --- a/src/text_editor/buffer_multi_cursor.cpp +++ b/src/text_editor/buffer_multi_cursor.cpp @@ -1,3 +1,4 @@ +// mouse_selection_anchor is special case for mouse handling ! void MergeCarets(Buffer &buffer, Array *_carets, Range *mouse_selection_anchor = NULL) { ProfileFunction(); Array &carets = *_carets; diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 8207f0c..93ba605 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -217,6 +217,30 @@ void ReloadFont(Int font_size) { FontCharSpacing = GetCharSpacing(MainFont, FontSize, FontSpacing); } +Caret FindInBuffer(Buffer *buffer, String16 needle, Caret caret, bool find_next = false) { + Int pos = caret.range.min; + String16 medium = GetString(*buffer, {pos, INT64_MAX}); + + Caret result = {}; + Int index = 0; + if (Seek(medium, needle, &index)) { + result = MakeCaret(pos + index + needle.len, pos + index); + } else { + medium = GetString(*buffer); + if (Seek(medium, needle, &index)) { + result = MakeCaret(index + needle.len, index); + } + } + + if (find_next && AreEqual(result, caret)) { + caret.range.min = Clamp(*buffer, caret.range.min + 1); + caret.range.max = Clamp(*buffer, caret.range.max + 1); + result = FindInBuffer(buffer, needle, caret, false); + } + + return result; +} + void HandleGlobalCommands() { if (CtrlPress(KEY_P)) { Window *command_window = GetWindow(CommandWindowID); diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index e7785b6..4bd1826 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -264,18 +264,10 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) { } if (CtrlPress(KEY_D)) { - Range range = view.carets[0].range; - String16 string = GetString(*buffer, range); - String16 string_buffer = GetString(*buffer, {range.max, INT64_MAX}); - Int index = 0; - if (Seek(string_buffer, string, &index)) { - Insert(&view.carets, MakeCaret(range.max + index, range.max + index + string.len), 0); - } else { - String16 string_buffer = GetString(*buffer); - if (Seek(string_buffer, string, &index)) { - Insert(&view.carets, MakeCaret(index, index + string.len), 0); - } - } + String16 string = GetString(*buffer, view.carets[0].range); + Caret caret = FindInBuffer(buffer, string, view.carets[0], true); + Insert(&view.carets, caret, 0); + MergeCarets(*buffer, &view.carets); } if (CtrlShiftPress(KEY_Z)) { @@ -357,44 +349,22 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) { if (Press(KEY_F3)) { Buffer *search_buffer = GetBuffer("*search*"); String16 search_string = GetString(*search_buffer); + view.carets[0] = FindInBuffer(buffer, search_string, view.carets[0], true); + view.carets.len = 1; + } - Caret caret = view.carets[0]; - Int pos = caret.range.min + 1; - - String16 medium = GetString(*buffer, {pos, INT64_MAX}); - Int index = 0; - if (Seek(medium, search_string, &index)) { - view.carets[0] = MakeCaret(pos + index + search_string.len, pos + index); - } else { - medium = GetString(*buffer); - if (Seek(medium, search_string, &index)) { - view.carets[0] = MakeCaret(index + search_string.len, index); - } + if (window->id.id == SearchWindowID.id) { + Window *seek_window = GetWindow(GetLastActiveWindow()); + View *seek_view = GetView(seek_window->active_view); + Buffer *seek_buffer = GetBuffer(seek_view->buffer_id); + String16 needle = GetString(*buffer); + if (search) { + seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0]); + seek_view->carets.len = 1; } - } - - if (Press(KEY_ENTER)) { - search = true; - } - - if (window->id.id == SearchWindowID.id && search) { - Window *seek_window = GetWindow(GetLastActiveWindow()); - View *seek_view = GetView(seek_window->active_view); - Buffer *seek_buffer = GetBuffer(seek_view->buffer_id); - Caret caret = seek_view->carets[0]; - Int pos = caret.range.min; - - // @todo: copy paste - String16 needle = GetString(*buffer); - String16 medium = GetString(*seek_buffer, {pos, INT64_MAX}); - Int index = 0; - if (Seek(medium, needle, &index)) { - seek_view->carets[0] = MakeCaret(pos + index + needle.len, pos + index); - } else { - medium = GetString(*seek_buffer); - if (Seek(medium, needle, &index)) { - seek_view->carets[0] = MakeCaret(index + needle.len, index); - } + if (Press(KEY_ENTER)) { + seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0], true); + seek_view->carets.len = 1; } }