Config files
This commit is contained in:
@@ -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?
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user