From edb2379bce44fba445e3693b794174b9edd04fce Mon Sep 17 00:00:00 2001 From: krzosa Date: Mon, 22 Dec 2025 21:24:35 +0100 Subject: [PATCH] Invert command window --- src/text_editor/buffer.cpp | 50 +------------ src/text_editor/commands.cpp | 5 +- src/text_editor/globals.cpp | 2 +- src/text_editor/profiler.h | 12 +-- src/text_editor/text_editor.cpp | 3 +- src/text_editor/view.cpp | 19 ----- src/text_editor/window_command.cpp | 116 ++++++++++++++++++++++------- 7 files changed, 102 insertions(+), 105 deletions(-) diff --git a/src/text_editor/buffer.cpp b/src/text_editor/buffer.cpp index 28a12ea..697075a 100644 --- a/src/text_editor/buffer.cpp +++ b/src/text_editor/buffer.cpp @@ -553,55 +553,6 @@ API Range GetIndentRangeAtPos(Buffer *buffer, Int pos) { return {range.min, range.min + indent}; } -const Int FuzzyCloserWordBegin = 5; -const Int FuzzyConsecutiveMultiplier = 3; -API Int FuzzyRate(String16 string, String16 with) { - if (with.len == 0) return 0; - Int points = 0; - Int consecutive = 0; - Int with_i = 0; - for (Int i = 0; i < string.len; i++) { - if (string.data[i] == with[with_i]) { - Int closer_begin = ClampBottom((Int)0, FuzzyCloserWordBegin - i); - points += closer_begin; - consecutive++; - with_i += 1; - } else { - points += consecutive * FuzzyConsecutiveMultiplier; - consecutive = 0; - with_i = 0; - } - - if (with_i >= with.len) with_i = 0; - } - points += consecutive * FuzzyConsecutiveMultiplier; - return points; -} - -API Array FuzzySearchLines(Allocator allocator, Buffer *buffer, Int line_min, Int line_max, String16 needle) { - if (line_min < 0 || line_min >= buffer->line_starts.len) return {}; - if (line_max < 0 || line_min > buffer->line_starts.len) return {}; - Array ratings = {allocator}; - for (Int i = line_min; i < line_max; i += 1) { - String16 s = GetLineStringWithoutNL(buffer, i); - Int rating = FuzzyRate(s, needle); - Add(&ratings, {i, rating}); - } - - // bubble sort - for (Int i = 0; i < ratings.len - 1; i++) { - for (Int j = 0; j < ratings.len - 1; j++) { - if (ratings[j].rating < ratings[j + 1].rating) { - FuzzyPair temp = ratings[j]; - ratings[j] = ratings[j + 1]; - ratings[j + 1] = temp; - } - } - } - - return ratings; -} - API Int FindRangeByPos(Array *ranges, Int pos) { // binary search Int low = 0; @@ -1538,6 +1489,7 @@ String16 ToUnixString16(Allocator allocator, String string_) { } Buffer *BufferOpenFile(String path) { + ProfileFunction(); Allocator sys_allocator = GetSystemAllocator(); Scratch scratch; diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index b8664ad..ac514e9 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -648,6 +648,7 @@ void Command_SetWorkDir() { String CodeEndings[] = { ".c", ".cpp", ".h", ".hpp", ".py", ".lua", ".cxx", ".hxx", }; void OpenCodeRecursive(String dir) { + ProfileFunction(); Scratch scratch; for (FileIter it = IterateFiles(scratch, dir); IsValid(it); Advance(&it)) { if (it.filename == ".git") { @@ -818,7 +819,7 @@ void Command_MakeFontSmaller() { void Command_Open() { BSet active = GetBSet(ActiveWindowID); - if (active.window->id == CommandBarWindowID) { + if (active.window->id == CommandWindowID) { CommandWindowOpen(active); } else { Open(FetchLoadWord(active.view)); @@ -1043,7 +1044,7 @@ void Command_InsertNewLineDown() { void Command_NewLine() { BSet active = GetBSet(ActiveWindowID); - if (active.window->id == CommandBarWindowID) { + if (active.window->id == CommandWindowID) { CommandWindowOpen(active); } else { IdentedNewLine(active.view); diff --git a/src/text_editor/globals.cpp b/src/text_editor/globals.cpp index 1827dc1..33c425e 100644 --- a/src/text_editor/globals.cpp +++ b/src/text_editor/globals.cpp @@ -25,7 +25,7 @@ WindowID DebugWindowID; ViewID DebugViewID; BufferID DebugBufferID; -WindowID CommandBarWindowID; +WindowID CommandWindowID; WindowID StatusBarWindowID; WindowID SearchBarWindowID; ViewID SearchViewID; diff --git a/src/text_editor/profiler.h b/src/text_editor/profiler.h index a0f7a93..f039f8f 100644 --- a/src/text_editor/profiler.h +++ b/src/text_editor/profiler.h @@ -396,12 +396,12 @@ void EndProfileScope() { (uint64_t)GetTimeMicros() // timestamp in microseconds -- end of your timing block ); } - #define ProfileScopeD(name) ProfileScopeEx PROFILE_SCOPE_VAR_##name((name).data, (name).len) - #define ProfileScope(name) ProfileScopeEx PROFILE_SCOPE_VAR_##name(#name, sizeof(#name) - 1) - #define ProfileFunction() ProfileScopeEx PROFILE_SCOPE_FUNCTION(__FUNCTION__, sizeof(__FUNCTION__) - 1) -struct ProfileScopeEx { - ProfileScopeEx(const char *name, int len) { _BeginProfileScope(name, len); } - ~ProfileScopeEx() { EndProfileScope(); } + #define ProfileScopeEx(name) ProfileScopeClass PROFILE_SCOPE_VAR_((name).data, (int)(name).len) + #define ProfileScope(name) ProfileScopeClass PROFILE_SCOPE_VAR_##name(#name, sizeof(#name) - 1) + #define ProfileFunction() ProfileScopeClass PROFILE_SCOPE_FUNCTION(__FUNCTION__, sizeof(__FUNCTION__) - 1) +struct ProfileScopeClass { + ProfileScopeClass(const char *name, int len) { _BeginProfileScope(name, len); } + ~ProfileScopeClass() { EndProfileScope(); } }; #else #define ProfileScope(name) diff --git a/src/text_editor/text_editor.cpp b/src/text_editor/text_editor.cpp index 99660e5..c2c020f 100644 --- a/src/text_editor/text_editor.cpp +++ b/src/text_editor/text_editor.cpp @@ -392,7 +392,7 @@ void OnCommand(Event event) { For (CommandFunctions) { if (it.trigger && MatchEvent(it.trigger, &event)) { - ProfileScopeEx(it.name.data, (int)it.name.len); + ProfileScopeEx(it.name); it.function(); LastExecutedCommand = it.function; } @@ -500,6 +500,7 @@ void GarbageCollect() { } void Update(Event event) { + ProfileFunction(); LayoutWindows(event.xwindow, event.ywindow); Scratch scratch; diff --git a/src/text_editor/view.cpp b/src/text_editor/view.cpp index a9802ea..df31c48 100644 --- a/src/text_editor/view.cpp +++ b/src/text_editor/view.cpp @@ -182,25 +182,6 @@ void Find(View *seek_view, String16 needle, bool forward = true) { IF_DEBUG(AssertRanges(seek_view->carets)); } -void FuzzySortView(View *view, String16 needle) { - Buffer *buffer = GetBuffer(view->active_buffer); - - Scratch scratch; - Array ratings = FuzzySearchLines(scratch, buffer, 0, buffer->line_starts.len, needle); - - Buffer *temp_buffer = CreateTempBuffer(scratch, buffer->cap); - For(ratings) { - String16 s = GetLineStringWithoutNL(buffer, it.index); - if (s.len == 0) continue; - RawReplaceText(temp_buffer, GetBufferEndAsRange(temp_buffer), s); - RawReplaceText(temp_buffer, GetBufferEndAsRange(temp_buffer), u"\n"); - } - - SelectEntireBuffer(view); - Replace(view, GetString(temp_buffer)); - SelectRange(view, MakeRange(0)); -} - void SelectAll(View *view, String16 needle) { Buffer *buffer = GetBuffer(view->active_buffer); String16 string_buffer = GetString(buffer); diff --git a/src/text_editor/window_command.cpp b/src/text_editor/window_command.cpp index 6dbb64b..d3e19bc 100644 --- a/src/text_editor/window_command.cpp +++ b/src/text_editor/window_command.cpp @@ -1,6 +1,6 @@ void CommandWindowInit() { Window *window = CreateWind(); - CommandBarWindowID = window->id; + CommandWindowID = window->id; Buffer *buffer = CreateBuffer(SysAllocator, "command_bar"); buffer->special = true; View *view = CreateView(buffer->id); @@ -18,34 +18,91 @@ void CommandWindowInit() { } void CommandWindowLayout(Rect2I *rect, Int wx, Int wy) { - Window *n = GetWindow(CommandBarWindowID); + Window *n = GetWindow(CommandWindowID); Rect2I copy_rect = *rect; if (!n->visible) { rect = ©_rect; } Int barsize = Clamp((Int)n->font->line_spacing*10, (Int)0, (Int)wx - 100); - n->document_rect = n->total_rect = CutBottom(rect, barsize); + n->document_rect = n->total_rect = CutTop(rect, barsize); +} + + +const Int FuzzyCloserWordBegin = 5; +const Int FuzzyConsecutiveMultiplier = 3; +Int FuzzyRate(String16 string, String16 with) { + ProfileFunction(); + if (with.len == 0) return 0; + Int points = 0; + Int consecutive = 0; + Int with_i = 0; + for (Int i = 0; i < string.len; i++) { + if (string.data[i] == with[with_i]) { + Int closer_begin = ClampBottom((Int)0, FuzzyCloserWordBegin - i); + points += closer_begin; + consecutive++; + with_i += 1; + } else { + points += consecutive * FuzzyConsecutiveMultiplier; + consecutive = 0; + with_i = 0; + } + + if (with_i >= with.len) with_i = 0; + } + points += consecutive * FuzzyConsecutiveMultiplier; + return points; +} + +Array FuzzySearchLines(Allocator allocator, Buffer *buffer, Int line_min, Int line_max, String16 needle) { + ProfileFunction(); + if (line_min < 0 || line_min >= buffer->line_starts.len) return {}; + if (line_max < 0 || line_min > buffer->line_starts.len) return {}; + Array ratings = {allocator}; + for (Int i = line_min; i < line_max; i += 1) { + String16 s = GetLineStringWithoutNL(buffer, i); + Int idx = 0; + if (Seek(s, u" || ", &idx)) { + s.len = idx; + } + s = Trim(s); + Int rating = FuzzyRate(s, needle); + Add(&ratings, {i, rating}); + } + + // bubble sort + for (Int i = 0; i < ratings.len - 1; i++) { + for (Int j = 0; j < ratings.len - 1; j++) { + if (ratings[j].rating > ratings[j + 1].rating) { + FuzzyPair temp = ratings[j]; + ratings[j] = ratings[j + 1]; + ratings[j + 1] = temp; + } + } + } + + return ratings; } void CommandWindowUpdate() { ProfileFunction(); BSet active = GetBSet(ActiveWindowID); - if (active.window->id == CommandBarWindowID) { + if (active.window->id == CommandWindowID) { if (!ProcessIsActive(active.view->id)) { Scratch scratch; - String16 last_line_string = GetLineStringWithoutNL(active.buffer, active.buffer->line_starts.len - 1); - if (active.view->prev_search_line != last_line_string) { - active.view->prev_search_line = last_line_string; - Array ratings = FuzzySearchLines(scratch, active.buffer, 0, active.buffer->line_starts.len - 1, last_line_string); + String16 line_string = GetLineStringWithoutNL(active.buffer, 0); + if (active.view->prev_search_line != line_string) { + active.view->prev_search_line = line_string; + Array ratings = FuzzySearchLines(scratch, active.buffer, 1, active.buffer->line_starts.len, line_string); Buffer *temp_buffer = CreateTempBuffer(scratch, active.buffer->cap); + RawAppend(temp_buffer, line_string); For(IterateInReverse(&ratings)) { String16 s = GetLineStringWithoutNL(active.buffer, it.index); if (s.len == 0) continue; - RawReplaceText(temp_buffer, GetBufferEndAsRange(temp_buffer), s); - RawReplaceText(temp_buffer, GetBufferEndAsRange(temp_buffer), u"\n"); + RawAppend(temp_buffer, u"\n"); + RawAppend(temp_buffer, s); } - RawReplaceText(temp_buffer, GetBufferEndAsRange(temp_buffer), last_line_string); Caret caret = active.view->carets[0]; SaveCaretHistoryBeforeBeginEdit(active.buffer, active.view->carets); @@ -58,65 +115,69 @@ void CommandWindowUpdate() { } void Command_ShowCommands() { - if (ActiveWindowID == CommandBarWindowID && LastExecutedCommand == Command_ShowCommands) { + if (ActiveWindowID == CommandWindowID && LastExecutedCommand == Command_ShowCommands) { ActiveWindowID = LastActiveLayoutWindowID; return; } + ProfileFunction(); - BSet command_bar = GetBSet(CommandBarWindowID); + BSet command_bar = GetBSet(CommandWindowID); command_bar.window->visible = true; command_bar.window->eval_command = true; ActiveWindowID = command_bar.window->id; ResetBuffer(command_bar.buffer); For(CommandFunctions) { - RawAppendf(command_bar.buffer, "%S\n", it.name); + RawAppendf(command_bar.buffer, "\n%S", it.name); } command_bar.view->update_scroll = true; - SelectRange(command_bar.view, GetBufferEndAsRange(command_bar.buffer)); + SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer)); } RegisterCommand(Command_ShowCommands, "ctrl-shift-p"); void Command_ShowDebugBufferList() { - if (ActiveWindowID == CommandBarWindowID && LastExecutedCommand == Command_ShowDebugBufferList) { + if (ActiveWindowID == CommandWindowID && LastExecutedCommand == Command_ShowDebugBufferList) { ActiveWindowID = LastActiveLayoutWindowID; return; } + ProfileFunction(); - BSet command_bar = GetBSet(CommandBarWindowID); + BSet command_bar = GetBSet(CommandWindowID); command_bar.window->visible = true; command_bar.window->eval_command = false; ActiveWindowID = command_bar.window->id; ResetBuffer(command_bar.buffer); - For(Buffers) { - RawAppendf(command_bar.buffer, "%-80S || %S\n", SkipToLastSlash(it->name), it->name); + For (Buffers) { + RawAppendf(command_bar.buffer, "\n%-80S || %S", SkipToLastSlash(it->name), it->name); } command_bar.view->update_scroll = true; - SelectRange(command_bar.view, GetBufferEndAsRange(command_bar.buffer)); + SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer)); } RegisterCommand(Command_ShowDebugBufferList, ""); void Command_ShowBufferList() { - if (ActiveWindowID == CommandBarWindowID && LastExecutedCommand == Command_ShowBufferList) { + if (ActiveWindowID == CommandWindowID && LastExecutedCommand == Command_ShowBufferList) { ActiveWindowID = LastActiveLayoutWindowID; return; } + ProfileFunction(); - BSet command_bar = GetBSet(CommandBarWindowID); + BSet command_bar = GetBSet(CommandWindowID); command_bar.window->visible = true; command_bar.window->eval_command = false; ActiveWindowID = command_bar.window->id; ResetBuffer(command_bar.buffer); - For(Buffers) { + For (Buffers) { if (it->special) { continue; } - RawAppendf(command_bar.buffer, "%-80S || %S\n", SkipToLastSlash(it->name), it->name); + RawAppendf(command_bar.buffer, "\n%-80S || %S", SkipToLastSlash(it->name), it->name); } command_bar.view->update_scroll = true; - SelectRange(command_bar.view, GetBufferEndAsRange(command_bar.buffer)); + SelectRange(command_bar.view, GetBufferBeginAsRange(command_bar.buffer)); } RegisterCommand(Command_ShowBufferList, "ctrl-p"); void EvalCommand(String command) { For (CommandFunctions) { if (it.name == command) { + ProfileScopeEx(it.name); it.function(); break; } @@ -129,12 +190,13 @@ void EvalCommand(String16 command) { } void CommandWindowOpen(BSet active) { + ProfileFunction(); Range range = active.view->carets[0].range; String16 string = FetchLoadWord(active.view); if (GetSize(range) == 0) { Int line = PosToLine(active.buffer, range.min); - if ((active.buffer->line_starts.len - 1) == line) { - line = ClampBottom(0ll, line - 1ll); + if (line == 0) { + line = ClampTop(1ll, active.buffer->line_starts.len - 1ll); } string = GetLineStringWithoutNL(active.buffer, line);