From a40797abb2a73fad9fe72ee26cabd78418f1748c Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Wed, 31 Dec 2025 13:47:15 +0100 Subject: [PATCH] Config files --- src/backup/todo.txt | 1 + src/basic/basic_string16.cpp | 5 ++ src/test/tests.cpp | 2 +- src/text_editor/buffer.cpp | 4 +- src/text_editor/commands.cpp | 74 +++++++++++++++++++++++++----- src/text_editor/draw.cpp | 6 +-- src/text_editor/event.cpp | 2 +- src/text_editor/globals.cpp | 23 +++++----- src/text_editor/text_editor.cpp | 25 ++++++++-- src/text_editor/text_editor.h | 2 +- src/text_editor/view.cpp | 10 ++-- src/text_editor/window.cpp | 12 ++--- src/text_editor/window_command.cpp | 2 +- 13 files changed, 120 insertions(+), 48 deletions(-) diff --git a/src/backup/todo.txt b/src/backup/todo.txt index bb85d5a..7e6c5d8 100644 --- a/src/backup/todo.txt +++ b/src/backup/todo.txt @@ -5,6 +5,7 @@ - RegisterCommand should_appear_in_listing variable - Maybe one list for all variables including the commands etc? - make variables nicer named +- Problem generating configs don't know which quotation marks would be good .... Use session 3: - Maybe status view, commit changes (like to buffer name or line) on enter? diff --git a/src/basic/basic_string16.cpp b/src/basic/basic_string16.cpp index 7761867..db1d294 100644 --- a/src/basic/basic_string16.cpp +++ b/src/basic/basic_string16.cpp @@ -38,6 +38,11 @@ API bool IsDigit(char16_t a) { return result; } +API bool IsHexDigit(char16_t a) { + bool result = a >= u'0' && a <= u'9' || a == 'a' || a == 'b' || a == 'c' || a == 'd' || a == 'e' || a == 'f'; + return result; +} + API bool IsAlphanumeric(char16_t a) { bool result = IsDigit(a) || IsAlphabetic(a); return result; diff --git a/src/test/tests.cpp b/src/test/tests.cpp index 213f015..3c59e4b 100644 --- a/src/test/tests.cpp +++ b/src/test/tests.cpp @@ -150,7 +150,7 @@ void Test(mco_coro *co) { } void InitTests() { - ConfigWaitForEvents = false; + WaitForEvents = false; TestDir = Format(TestArena, "%S/test_env", GetExeDir(TestArena)); CoData *data = CoAdd(Test); data->dont_wait_until_resolved = true; diff --git a/src/text_editor/buffer.cpp b/src/text_editor/buffer.cpp index 8e34980..0f36919 100644 --- a/src/text_editor/buffer.cpp +++ b/src/text_editor/buffer.cpp @@ -895,7 +895,7 @@ API void RedoEdit(Buffer *buffer, Array *carets) { if (buffer->redo_stack.len > 0) { HistoryEntry *next = GetLast(buffer->redo_stack); - if (next->time - entry.time <= ConfigUndoMergeTimeWindow) { + if (next->time - entry.time <= UndoMergeTimeWindow) { RedoEdit(buffer, carets); } } @@ -921,7 +921,7 @@ API void UndoEdit(Buffer *buffer, Array *carets) { if (buffer->undo_stack.len > 0) { HistoryEntry *next = GetLast(buffer->undo_stack); - if (entry.time - next->time <= ConfigUndoMergeTimeWindow) { + if (entry.time - next->time <= UndoMergeTimeWindow) { UndoEdit(buffer, carets); } } diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index c2b0f8d..ec7e553 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -486,7 +486,7 @@ ResolvedOpen ResolveOpen(Allocator alo, String path, String meta) { // Web { if (StartsWith(path, "https://") || StartsWith(path, "http://")) { - result.path = Format(alo, "%S %S", ConfigInternetBrowser, path); + result.path = Format(alo, "%S %S", InternetBrowser, path); result.kind = OpenKind_BackgroundExec; return result; } @@ -953,14 +953,14 @@ void CMD_Undo() { } RegisterCommand(CMD_Undo, "ctrl-z"); void CMD_MakeFontLarger() { - ConfigFontSize += 1; - ReloadFont(ConfigFont, (U32)ConfigFontSize); + FontSize += 1; + ReloadFont(Font, (U32)FontSize); } RegisterCommand(CMD_MakeFontLarger, "ctrl-equals"); void CMD_MakeFontSmaller() { - if (ConfigFontSize > 4) { - ConfigFontSize -= 1; - ReloadFont(ConfigFont, (U32)ConfigFontSize); + if (FontSize > 4) { + FontSize -= 1; + ReloadFont(Font, (U32)FontSize); } } RegisterCommand(CMD_MakeFontSmaller, "ctrl-minus"); @@ -1313,6 +1313,20 @@ void Set(String16 string) { ReportErrorf("Failed to parse :Set %S ", name8); return; } + } else if (var->type == VariableType_Color) { + if (IsHexDigit(At(string, 0))) { + String16 begin = {string.data, 0}; + while (IsHexDigit(At(string, 0))) { + string = Skip(string, 1); + begin.len += 1; + } + String p = ToString(scratch, begin); + ReportConsolef(":Set %S %S", name8, p); + var->color->value = (uint32_t)strtoll(p.data, NULL, 16); + } else { + ReportErrorf("Failed to parse :Set %S ", name8); + return; + } } ElseInvalidCodepath(); return; } @@ -1366,14 +1380,50 @@ void CMD_Set() { Set(string); } RegisterCommand(CMD_Set, ""); -void EvalCommandsLineByLine(Buffer *buffer) { - for (Int i = 0; i < buffer->line_starts.len; i += 1) { - String16 istr = GetLineString(buffer, i); - EvalCommand(istr); +void EvalCommandsLineByLine(BSet set) { + WindowID save_last = LastActiveLayoutWindowID; + WindowID save_active = ActiveWindowID; + WindowID save_next = NextActiveWindowID; + ActiveWindowID = set.window->id; + LastActiveLayoutWindowID = set.window->id; + NextActiveWindowID = set.window->id; + for (Int i = 0; i < set.buffer->line_starts.len; i += 1) { + Int pos = GetLineRangeWithoutNL(set.buffer, i).min; + SelectRange(set.view, MakeRange(pos)); + Range range = EncloseLoadWord(set.buffer, pos); + String16 string = GetString(set.buffer, range); + string = Trim(string); + if (string.len == 0) { + continue; + } + if (StartsWith(string, u"//")) { + continue; + } + Open(string); } + LastActiveLayoutWindowID = save_last; + ActiveWindowID = save_active; + NextActiveWindowID = save_next; } void CMD_EvalCommandsLineByLine() { BSet set = GetBSet(LastActiveLayoutWindowID); - EvalCommandsLineByLine(set.buffer); -} RegisterCommand(CMD_EvalCommandsLineByLine, ""); \ No newline at end of file + EvalCommandsLineByLine(set); +} RegisterCommand(CMD_EvalCommandsLineByLine, ""); + +void GenerateConfig(Buffer *buffer) { + For (Variables) { + if (it.type == VariableType_String) { + RawAppendf(buffer, "// :Set %S '%S'\n", it.name, *it.string); + } else if (it.type == VariableType_Int) { + RawAppendf(buffer, "// :Set %S '%lld'\n", it.name, (long long)*it.i); + } else if (it.type == VariableType_Float) { + RawAppendf(buffer, "// :Set %S '%f'\n", it.name, *it.f); + } else if (it.type == VariableType_Color) { + RawAppendf(buffer, "// :Set %S %x\n", it.name, it.color->value); + } ElseInvalidCodepath(); + } + For (CommandFunctions) { + RawAppendf(buffer, "// :Set %S '%S'\n", it.name, it.binding); + } +} \ No newline at end of file diff --git a/src/text_editor/draw.cpp b/src/text_editor/draw.cpp index 2e46e33..87f0858 100644 --- a/src/text_editor/draw.cpp +++ b/src/text_editor/draw.cpp @@ -130,7 +130,7 @@ void DrawWindow(Window *window, Event &event) { Rect2I combined_document_line_number = window->document_rect; - if (window->draw_line_numbers) { + if (DrawLineNumbers && window->draw_line_numbers) { combined_document_line_number.min.x = window->line_numbers_rect.min.x; } SetScissor(combined_document_line_number); @@ -242,7 +242,7 @@ void DrawWindow(Window *window, Event &event) { } // Draw line numbers - if (window->draw_line_numbers) { + if (DrawLineNumbers && window->draw_line_numbers) { ProfileScope(DrawLineNumbers); Scratch scratch; SetScissor(window->line_numbers_rect); @@ -269,7 +269,7 @@ void DrawWindow(Window *window, Event &event) { } // Draw scrollbar - if (window->draw_scrollbar) { + if (DrawScrollbar && window->draw_scrollbar) { ProfileScope(DrawScrollbar); SetScissor(window->scrollbar_rect); DrawRect(window->scrollbar_rect, ColorScrollbarBackground); diff --git a/src/text_editor/event.cpp b/src/text_editor/event.cpp index 04f2023..180c6d5 100644 --- a/src/text_editor/event.cpp +++ b/src/text_editor/event.cpp @@ -473,7 +473,7 @@ Array GetEventsForFrame(Allocator allocator) { } SDL_Event event; - if (WaitForEvents) { + if (WaitForEventsState) { SDL_WaitEvent(&event); Event ev = TranslateSDLEvent(&event); AddEvent(&result, ev); diff --git a/src/text_editor/globals.cpp b/src/text_editor/globals.cpp index e90ab41..47dca80 100644 --- a/src/text_editor/globals.cpp +++ b/src/text_editor/globals.cpp @@ -4,7 +4,7 @@ int FullScreenSizeX, FullScreenSizeY; int FullScreenPositionX, FullScreenPositionY; bool Testing = false; bool AppIsRunning = true; -bool WaitForEvents = true; +bool WaitForEventsState = true; bool RunGCThisFrame; bool SearchCaseSensitive = false; bool SearchWordBoundary = false; @@ -153,14 +153,13 @@ RegisterVariable(Color, ColorTitleBarLineHighlight, GruvboxLight0Soft); RegisterVariable(Color, ColorTitleBarOutline, GruvboxLight3); RegisterVariable(Color, ColorResizerBackground, GruvboxLight0Hard); RegisterVariable(Color, ColorResizerOutline, GruvboxLight3); -RegisterVariable(Int, ConfigWaitForEvents, 1); -RegisterVariable(Int, ConfigDrawLineNumbers, 1); -RegisterVariable(Int, ConfigDrawScrollbar, 1); -RegisterVariable(Int, ConfigIndentSize, 4); -RegisterVariable(Int, ConfigFontSize, 15); -RegisterVariable(Int, ConfigFontFilter, 0); -RegisterVariable(String, ConfigFont, "/home/krz/text_editor/package/CascadiaMono.ttf"); -RegisterVariable(String, ConfigVCVarsall, "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat"); -RegisterVariable(Float, ConfigUndoMergeTimeWindow, 0.3); -RegisterVariable(Float, ConfigJumpHistoryMergeTimeWindow, 0.3); -RegisterVariable(String, ConfigInternetBrowser, "firefox"); +RegisterVariable(Int, WaitForEvents, 1); +RegisterVariable(Int, DrawLineNumbers, 1); +RegisterVariable(Int, DrawScrollbar, 1); +RegisterVariable(Int, IndentSize, 4); +RegisterVariable(Int, FontSize, 15); +RegisterVariable(String, Font, ""); +RegisterVariable(String, VCVarsall, "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat"); +RegisterVariable(Float, UndoMergeTimeWindow, 0.3); +RegisterVariable(Float, JumpHistoryMergeTimeWindow, 0.3); +RegisterVariable(String, InternetBrowser, "firefox"); diff --git a/src/text_editor/text_editor.cpp b/src/text_editor/text_editor.cpp index ce83e41..bb44cb4 100644 --- a/src/text_editor/text_editor.cpp +++ b/src/text_editor/text_editor.cpp @@ -648,7 +648,7 @@ void Windows_SetupVCVarsall(mco_coro *co) { Scratch scratch; String working_dir = WorkDir; String buffer_name = GetUniqueBufferName(working_dir, "vcvarsall-"); - String cmd = Format(scratch, "\"%S\" && set", ConfigVCVarsall); + String cmd = Format(scratch, "\"%S\" && set", VCVarsall); view = ExecHidden(buffer_name, cmd, working_dir); } for (;;) { @@ -701,9 +701,9 @@ void MainLoop() { } } - WaitForEvents = ConfigWaitForEvents; + WaitForEventsState = WaitForEvents; if (IsDocumentSelectionValid() || IsScrollbarSelectionValid() || ActiveProcesses.len || dont_wait_until_resolved) { - WaitForEvents = false; + WaitForEventsState = false; } // This shouldn't matter to the state of the program, only appearance for @@ -846,7 +846,7 @@ int main(int argc, char **argv) InitBuffers(); InitRender(); - ReloadFont(ConfigFont, (U32)ConfigFontSize); + ReloadFont(Font, (U32)FontSize); InitWindows(); InitOS(ReportWarningf); @@ -873,6 +873,23 @@ int main(int argc, char **argv) } } + { + Scratch scratch; + String exe_dir = GetExeDir(scratch); + String config_path = Format(scratch, "%S/config.te", exe_dir); + Window *window = GetWindow(NullWindowID); + View *view = WindowOpenBufferView(window, config_path); + Buffer *buffer = GetBuffer(view->active_buffer); + bool file_exists = buffer->file_mod_time != 0; + if (!file_exists) { + GenerateConfig(buffer); + } else { + EvalCommandsLineByLine({window, view, buffer}); + } + buffer->dirty = false; + } + + ReportConsolef("WorkDir = %S", WorkDir); if (Testing) InitTests(); #if OS_WINDOWS diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index 33aa834..1741f2c 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -136,7 +136,7 @@ struct Register_Function { }; #define RegisterFunction(functions, name) Register_Function RF__##name(functions, #name, name) -struct Register_Command { Register_Command(Array *fucs, Function *function, String name, String binding) { if (StartsWith(name, "CMD_")) name = Skip(name, 8); Add(fucs, {name, binding, function}); } }; +struct Register_Command { Register_Command(Array *fucs, Function *function, String name, String binding) { if (StartsWith(name, "CMD_")) name = Skip(name, sizeof("CMD_") - 1); Add(fucs, {name, binding, function}); } }; #define RegisterCommand(name, binding) Register_Command RC__##name(&CommandFunctions, name, #name, binding) const int DIR_RIGHT = 0; diff --git a/src/text_editor/view.cpp b/src/text_editor/view.cpp index d7e9394..918e7cb 100644 --- a/src/text_editor/view.cpp +++ b/src/text_editor/view.cpp @@ -443,9 +443,9 @@ void Delete(View *view, int direction, bool ctrl = false) { Range indent_range = GetIndentRangeAtPos(buffer, it.range.min); if (ctrl == false && it.range.min > indent_range.min && it.range.max <= indent_range.max) { Int offset = it.range.min - indent_range.min; - Int to_delete = (offset % (ConfigIndentSize)); - if (to_delete == 0) to_delete = ConfigIndentSize; - to_delete = Clamp(to_delete, (Int)1, ConfigIndentSize); + Int to_delete = (offset % (IndentSize)); + if (to_delete == 0) to_delete = IndentSize; + to_delete = Clamp(to_delete, (Int)1, IndentSize); for (Int i = 0; i < to_delete; i += 1) { it = MoveCaret(buffer, it, direction, false, SHIFT_PRESS); } @@ -512,12 +512,12 @@ void IndentSelectedLines(View *view, bool shift = false) { Range pos_range_of_line = GetLineRange(buffer, i); if (!shift) { - String16 whitespace_string = {u" ", ConfigIndentSize}; + String16 whitespace_string = {u" ", IndentSize}; AddEdit(&edits, {pos_range_of_line.min, pos_range_of_line.min}, whitespace_string); } else { String16 string = GetString(buffer, pos_range_of_line); Int whitespace_len = 0; - for (Int i = 0; i < ConfigIndentSize && i < string.len && string.data[i] == ' '; i += 1) { + for (Int i = 0; i < IndentSize && i < string.len && string.data[i] == ' '; i += 1) { whitespace_len += 1; } diff --git a/src/text_editor/window.cpp b/src/text_editor/window.cpp index 0fcfa73..a6e8fe0 100644 --- a/src/text_editor/window.cpp +++ b/src/text_editor/window.cpp @@ -8,8 +8,8 @@ Window *CreateWind() { w->font = &PrimaryFont; w->visible = true; w->layout = true; - w->draw_scrollbar = ConfigDrawScrollbar; - w->draw_line_numbers = ConfigDrawLineNumbers; + w->draw_scrollbar = true; + w->draw_line_numbers = true; w->draw_line_highlight = true; w->jump_history = true; w->id = AllocWindowID(w); @@ -126,8 +126,8 @@ void InitWindows() { void CalcNiceties(Window *n) { float scrollbar_size = (10.f * DPIScale); float line_numbers_size = (float)n->font->char_spacing * 10.f; - if (n->draw_scrollbar) n->scrollbar_rect = CutRight(&n->document_rect, (Int)scrollbar_size); - if (n->draw_line_numbers) n->line_numbers_rect = CutLeft(&n->document_rect, (Int)line_numbers_size); + if (DrawScrollbar && n->draw_scrollbar) n->scrollbar_rect = CutRight(&n->document_rect, (Int)scrollbar_size); + if (DrawLineNumbers && n->draw_line_numbers) n->line_numbers_rect = CutLeft(&n->document_rect, (Int)line_numbers_size); } double WindowCalcEvenResizerValue(Int screen_size_x, Int *out_count = NULL) { @@ -278,7 +278,7 @@ void JumpBack(Window *window) { if (window->goto_history.len) { GotoCrumb *next = GetLast(window->goto_history); - if (c.view_id == next->view_id && c.time - next->time <= ConfigJumpHistoryMergeTimeWindow) { + if (c.view_id == next->view_id && c.time - next->time <= JumpHistoryMergeTimeWindow) { JumpBack(window); } } @@ -298,7 +298,7 @@ void JumpForward(Window *window) { if (window->goto_redo.len) { GotoCrumb *next = GetLast(window->goto_redo); - if (c.view_id == next->view_id && next->time - c.time <= ConfigJumpHistoryMergeTimeWindow) { + if (c.view_id == next->view_id && next->time - c.time <= JumpHistoryMergeTimeWindow) { JumpForward(window); } } diff --git a/src/text_editor/window_command.cpp b/src/text_editor/window_command.cpp index a890b98..ecd9b57 100644 --- a/src/text_editor/window_command.cpp +++ b/src/text_editor/window_command.cpp @@ -121,7 +121,7 @@ void CMD_ShowBufferList() { ResetBuffer(command_bar.buffer); For (Buffers) { if (it->special || it->temp) { - continue; + if (it->id != NullBufferID) continue; } RawAppendf(command_bar.buffer, "\n%S", it->name); }