From edafe05b5b83ed855118b483ded243de17a7a9b5 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Wed, 31 Dec 2025 12:45:28 +0100 Subject: [PATCH] EvalCommandsLineByLine --- src/basic/basic_string16.cpp | 10 ++++++++ src/text_editor/commands.cpp | 46 +++++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/basic/basic_string16.cpp b/src/basic/basic_string16.cpp index a796bdc..7761867 100644 --- a/src/basic/basic_string16.cpp +++ b/src/basic/basic_string16.cpp @@ -474,6 +474,16 @@ String16 SkipIdent(String16 *string) { return begin; } +bool MatchIdent(String16 *string, String16 expect) { + String16 copy = *string; + String16 ident = SkipIdent(©); + if (ident == expect) { + *string = copy; + return true; + } + return false; +} + API bool Chop(String16 *string, String16 ending) { if (EndsWith(*string, ending)) { *string = Chop(*string, ending.len); diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 7c50e16..cf5666a 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -1245,15 +1245,20 @@ void Command_ClearCarets() { } } RegisterCommand(Command_ClearCarets, "escape"); -void Command_Set() { +void Set(String16 string) { Scratch scratch; - BSet set = GetBSet(ActiveWindowID); - Range range = set.view->carets[0].range; - if (GetSize(range) == 0) { - range = EncloseLoadWord(set.buffer, range.min); + + SkipWhitespace(&string); + if (At(string, 0) != u':') { + ReportErrorf("Expected :Set"); + return; + } + string = Skip(string, 1); + + if (!MatchIdent(&string, u"Set")) { + ReportErrorf("Expected :Set"); + return; } - Int line_end = GetLineEnd(set.buffer, range.min); - String16 string = GetString(set.buffer, {range.max, line_end}); SkipWhitespace(&string); String16 name = SkipIdent(&string); @@ -1346,6 +1351,29 @@ void Command_Set() { return; } - ReportErrorf("Failed to :Set, no such variable found: %S", name8); -} RegisterCommand(Command_Set, ""); \ No newline at end of file +} + +void Command_Set() { + BSet set = GetBSet(ActiveWindowID); + Range range = set.view->carets[0].range; + if (GetSize(range) == 0) { + range = EncloseLoadWord(set.buffer, range.min); + } + Int line_end = GetLineEnd(set.buffer, range.min); + + String16 string = GetString(set.buffer, {range.min, line_end}); + Set(string); +} RegisterCommand(Command_Set, ""); + +void EvalCommandsLineByLine(Buffer *buffer) { + for (Int i = 0; i < buffer->line_starts.len; i += 1) { + String16 istr = GetLineString(buffer, i); + EvalCommand(istr); + } +} + +void Command_EvalCommandsLineByLine() { + BSet set = GetBSet(LastActiveLayoutWindowID); + EvalCommandsLineByLine(set.buffer); +} RegisterCommand(Command_EvalCommandsLineByLine, ""); \ No newline at end of file