Config files

This commit is contained in:
Krzosa Karol
2025-12-31 13:47:15 +01:00
parent 6c0a4d0633
commit a40797abb2
13 changed files with 120 additions and 48 deletions

View File

@@ -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?

View File

@@ -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;

View File

@@ -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;

View File

@@ -895,7 +895,7 @@ API void RedoEdit(Buffer *buffer, Array<Caret> *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<Caret> *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);
}
}

View File

@@ -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 <expected float>", 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 <expected integer>", 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);
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);
}
}

View File

@@ -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);

View File

@@ -473,7 +473,7 @@ Array<Event> GetEventsForFrame(Allocator allocator) {
}
SDL_Event event;
if (WaitForEvents) {
if (WaitForEventsState) {
SDL_WaitEvent(&event);
Event ev = TranslateSDLEvent(&event);
AddEvent(&result, ev);

View File

@@ -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");

View File

@@ -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

View File

@@ -136,7 +136,7 @@ struct Register_Function {
};
#define RegisterFunction(functions, name) Register_Function RF__##name(functions, #name, name)
struct Register_Command { Register_Command(Array<CommandData> *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<CommandData> *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;

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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);
}