#if PLUGIN_CONFIG BufferID GlobalConfigBufferID; void CMD_OpenConfig() { Buffer *buffer = GetBuffer(GlobalConfigBufferID); Open(buffer->name); } RegisterCommand(CMD_OpenConfig, "", "Open the global config file"); void CMD_OpenConfigOptions() { BSet main = GetBSet(PrimaryWindowID); JumpTempBuffer(&main); NextActiveWindowID = main.window->id; For (Variables) { RawAppendf(main.buffer, "\n:Set %-50S ", it.name); switch(it.type) { case VariableType_Color: RawAppendf(main.buffer, "%x", it.color->value); break; case VariableType_String: RawAppendf(main.buffer, "'%S'", *it.string); break; case VariableType_Int: RawAppendf(main.buffer, "%lld", (long long)*it.i); break; case VariableType_Float: RawAppendf(main.buffer, "%f", *it.f); break; default: InvalidCodepath(); } } For (GlobalCommands) { RawAppendf(main.buffer, "\n:Set %-50S '%S'", it.name, it.binding); } } RegisterCommand(CMD_OpenConfigOptions, "", "List available variables and associated documentation inside the command window"); void EvalCommandsLineByLine(BSet set) { WindowID save_last = PrimaryWindowID; WindowID save_active = ActiveWindowID; WindowID save_next = NextActiveWindowID; Caret save_caret = set.view->carets[0]; ActiveWindowID = set.window->id; PrimaryWindowID = set.window->id; NextActiveWindowID = set.window->id; for (Int i = 0; i < set.buffer->line_starts.len; i += 1) { Range range = GetLineRangeWithoutNL(set.buffer, i); String16 string = GetString(set.buffer, range); string = Trim(string); if (string.len == 0) { continue; } if (StartsWith(string, u"//")) { continue; } Open(string); } set.view->carets[0] = save_caret; PrimaryWindowID = save_last; ActiveWindowID = save_active; NextActiveWindowID = save_next; } void CMD_EvalCommandsLineByLine() { BSet set = GetBSet(PrimaryWindowID); EvalCommandsLineByLine(set); } RegisterCommand(CMD_EvalCommandsLineByLine, "", "Goes line by line over a buffer and evaluates every line as a command, ignores empty or lines starting with '//'"); BufferID LoadConfig(String config_path) { ReportConsolef("Loading config %S...", config_path); Window *window = GetWindow(NullWindowID); ViewID active_view_before = window->active_view; View *view = WindowOpenBufferView(window, config_path); Buffer *buffer = GetBuffer(view->active_buffer); EvalCommandsLineByLine({window, view, buffer}); if (window->active_view == view->id) { window->active_view = active_view_before; } return buffer->id; } #define ExpectP(x, ...) \ if (!(x)) { \ ReportErrorf("Failed to parse command " __VA_ARGS__); \ return; \ } void Set(String string) { String name = SkipIdent(&string); ExpectP(name.len != 0, "expected a variable name, instead got '%S'", string); Variable *var = GetVariable(name); if (var) { SkipWhitespace(&string); if (var->type == VariableType_String) { char c = At(string, 0); ExpectP(c == u'"' || c == u'\'', "Expected string to follow the command name, instead got %S", string); string = Skip(string, 1); String quote = SkipUntil(&string, {&c, 1}); ExpectP(At(string, 0) == c, ":Set %S , unclosed quote", name); ReportConsolef(":Set %S %c%S%c", name, c, quote, c); *var->string = Intern(&GlobalInternTable, quote); } else if (var->type == VariableType_Int) { ExpectP(IsDigit(At(string, 0)), "Expected an integer to follow the command name, instead got: %S", string); Int number = SkipInt(&string); ReportConsolef(":Set %S %lld", name, number); *var->i = number; } else if (var->type == VariableType_Float) { ExpectP(IsDigit(At(string, 0)), "Expected float to follow the command name, instead got: %S", string); Float number = SkipFloat(&string); ReportConsolef(":Set %S %f", name, number); *var->f = number; } else if (var->type == VariableType_Color) { ExpectP(IsHexDigit(At(string, 0)), "Expected hex integer to follow the command name, instead got: %S", string); String begin = {string.data, 0}; while (IsHexDigit(At(string, 0))) { string = Skip(string, 1); begin.len += 1; } ReportConsolef(":Set %S %S", name, begin); var->color->value = (uint32_t)strtoll(begin.data, NULL, 16); } ElseInvalidCodepath(); if (name == "FontSize" || name == "PathToFont") { ReloadFont(PathToFont, (U32)FontSize); } #if PLUGIN_PROJECT_MANAGEMENT if (name == "ProjectFolder") { SetProjectFolder(*var->string); } #endif return; } Command *cmd = NULL; For (GlobalCommands) { if (it.name == name) { cmd = ⁢ break; } } if (cmd) { SkipWhitespace(&string); char c = At(string, 0); ExpectP(c == u'"' || c == u'\'', "Expected string to follow the command name, instead got %S", string); string = Skip(string, 1); String quote = SkipUntil(&string, {&c, 1}); ExpectP(At(string, 0) == c, "Failed to parse command, unclose quote"); quote = Intern(&GlobalInternTable, quote); ReportConsolef(":Set %S %c%S%c", name, c, quote, c); Trigger *trigger = ParseKeyCached(quote); if (trigger) { cmd->binding = quote; cmd->trigger = trigger; CheckKeybindingColission(); } return; } ReportErrorf("Failed to :Set, no such variable found: %S", name); } #endif