From 9ae73e5c042a7bf6508496c20e4347d6523e5fc2 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Sat, 27 Dec 2025 11:29:40 +0100 Subject: [PATCH] Find all: alt-enter, alt-f3 --- src/backup/todo.txt | 5 ++- src/text_editor/commands.cpp | 16 ++++------ src/text_editor/view.cpp | 18 +++++++++++ src/text_editor/window_command.cpp | 10 +++++- src/text_editor/window_search.cpp | 50 +++++++++++++++++++++++++++++- 5 files changed, 86 insertions(+), 13 deletions(-) diff --git a/src/backup/todo.txt b/src/backup/todo.txt index 03abd55..e898ace 100644 --- a/src/backup/todo.txt +++ b/src/backup/todo.txt @@ -1,6 +1,10 @@ - What precise workflow do I need for me to be viable to use this? - From a user (novice) point of view, how does it look like? +- Search + - alt + w: word search + - alt + c: case sensitive + - Open with seek string (open at pattern) filename:32 filename:/^Window$/ - build console window - Show what process/coroutines are running and allow to kill (active process buffer?) @@ -21,7 +25,6 @@ backlog FEATURE Search whole words, case sensitive etc. FEATURE Select all searched occurences FEATURE commands for scrolling: center, cursor_at_bottom_of_screen, cursor_at_top -FEATURE Kill buffer command (it should be marked for deletion and deleted at the end of frame!) FEATURE Some decl/function indexing in fuzzy format ISSUE? Fix jump scroll, the query ends up the last line on screen, kind of wacky FEATURE dump text editor state to file, restore state diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 535bae5..62fa763 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -892,10 +892,9 @@ void Command_MakeFontSmaller() { void Command_Open() { BSet active = GetBSet(ActiveWindowID); if (active.window->id == CommandWindowID) { - CommandWindowOpen(active); - } else { - Open(FetchLoadWord(active.view)); + return; } + Open(FetchLoadWord(active.view)); } RegisterCommand(Command_Open, "ctrl-q"); void Command_KillSelectedLines() { @@ -1115,14 +1114,11 @@ void Command_InsertNewLineDown() { } RegisterCommand(Command_InsertNewLineDown, "ctrl-enter"); void Command_NewLine() { - BSet active = GetBSet(ActiveWindowID); - if (active.window->id == CommandWindowID) { - CommandWindowOpen(active); - } else if (active.window->id == SearchWindowID) { - SearchWindowFindNext(true); - } else { - IdentedNewLine(active.view); + if (ActiveWindowID == CommandWindowID || ActiveWindowID == SearchWindowID) { + return; } + BSet active = GetBSet(ActiveWindowID); + IdentedNewLine(active.view); } RegisterCommand(Command_NewLine, "enter"); void Command_CreateCaretOnNextFind() { diff --git a/src/text_editor/view.cpp b/src/text_editor/view.cpp index df31c48..a6e05de 100644 --- a/src/text_editor/view.cpp +++ b/src/text_editor/view.cpp @@ -159,6 +159,24 @@ Caret FindNext(Buffer *buffer, String16 needle, Caret caret) { return result; } +Array FindAll(Allocator allocator, Buffer *buffer, String16 needle) { + Array result = {allocator}; + String16 string = GetString(buffer); + String16 start = string; + for (;;) { + Int index = 0; + if (Seek(string, needle, &index)) { + Int back = index + (Int)(string.data - start.data); + Int front = back + needle.len; + Add(&result, MakeCaret(front, back)); + string = Skip(string, index + needle.len); + } else { + break; + } + } + return result; +} + void SelectRange(View *view, Caret caret) { view->carets.len = 1; view->carets[0] = caret; diff --git a/src/text_editor/window_command.cpp b/src/text_editor/window_command.cpp index 53cd732..cef9541 100644 --- a/src/text_editor/window_command.cpp +++ b/src/text_editor/window_command.cpp @@ -184,7 +184,7 @@ void EvalCommand(String16 command) { EvalCommand(ToString(scratch, command)); } -void CommandWindowOpen(BSet active) { +void OpenCommand(BSet active) { ProfileFunction(); Range range = active.view->carets[0].range; String16 string = FetchLoadWord(active.view); @@ -208,3 +208,11 @@ void CommandWindowOpen(BSet active) { Open(string); } } + +void Command_OpenCommand() { + if (ActiveWindowID != CommandWindowID) { + return; + } + BSet active = GetBSet(ActiveWindowID); + OpenCommand(active); +} RegisterCommand(Command_OpenCommand, "ctrl-q | enter"); \ No newline at end of file diff --git a/src/text_editor/window_search.cpp b/src/text_editor/window_search.cpp index ecad3a4..f1e2ae3 100644 --- a/src/text_editor/window_search.cpp +++ b/src/text_editor/window_search.cpp @@ -57,13 +57,61 @@ void SearchWindowFindNext(bool forward = true) { main.window->search_bar_anchor = main.view->carets[0]; } +void Command_SearchNextInSearch() { + if (ActiveWindowID != SearchWindowID) { + return; + } + SearchWindowFindNext(true); +} RegisterCommand(Command_SearchNextInSearch, "enter"); + +void Command_SearchPrevInSearch() { + if (ActiveWindowID != SearchWindowID) { + return; + } + SearchWindowFindNext(false); +} RegisterCommand(Command_SearchPrevInSearch, "shift-enter"); + void Command_SearchNext() { SearchWindowFindNext(true); } RegisterCommand(Command_SearchNext, "f3"); void Command_SearchPrev() { SearchWindowFindNext(false); -} RegisterCommand(Command_SearchPrev, "shift-f3 | shift-enter"); +} RegisterCommand(Command_SearchPrev, "shift-f3"); + +void SearchAll() { + Scratch scratch; + BSet main = GetBSet(LastActiveLayoutWindowID); + BSet set = GetBSet(SearchWindowID); + String16 needle = GetString(set.buffer, GetRange(set.buffer)); + Array all = FindAll(scratch, main.buffer, needle); + if (all.len > 0) { + main.view->carets.len = 0; + For (all) { + Add(&main.view->carets, it); + } + MergeCarets(main.buffer, &main.view->carets); + } +} + +void Command_SearchAll() { + SearchAll(); + BSet set = GetBSet(SearchWindowID); + set.window->visible = false; + ActiveWindowID = LastActiveLayoutWindowID; +} RegisterCommand(Command_SearchAll, "alt-f3"); + + +void Command_SearchAllInSearch() { + if (ActiveWindowID != SearchWindowID) { + return; + } + SearchAll(); + BSet set = GetBSet(SearchWindowID); + set.window->visible = false; + ActiveWindowID = LastActiveLayoutWindowID; +} RegisterCommand(Command_SearchAllInSearch, "alt-enter"); + void SearchWindowUpdate() { BSet active = GetBSet(ActiveWindowID);