Fix ApplyRules misfires on weird paths, gotos don't include gc buffers

This commit is contained in:
Krzosa Karol
2024-08-15 07:27:05 +02:00
parent eeb6caa58d
commit a3e87b2508
7 changed files with 45 additions and 20 deletions

View File

@@ -279,6 +279,8 @@ function SkipPath(s)
if not slash_eaten then break end
end
if #cells == 0 then return s end
local skip_size = input_s:len() - s:len()
local path = input_s:sub(1, skip_size)
return s, path, drive, cells
@@ -297,6 +299,8 @@ end
function MatchWindowsPath(_s)
local s, file_path, drive = SkipPath(_s)
if not file_path then return nil end
if not drive then
local d = GetActiveMainWindowBufferDir()
file_path = d..'/'..file_path

View File

@@ -17,20 +17,31 @@ void ToggleFullscreen() {
void CheckpointBeforeGoto(Window *window, View *view) {
Buffer *buffer = GetBuffer(view->active_buffer);
Add(&window->goto_history, {buffer->id, view->carets[0]});
window->goto_redo.len = 0;
if (buffer->gc == false) {
Add(&window->goto_history, {buffer->id, view->carets[0]});
window->goto_redo.len = 0;
}
}
void CheckpointBeforeGoto(Window *window) {
CheckpointBeforeGoto(window, GetView(window->active_view));
}
GotoCrumb GetCrumb(Array<GotoCrumb> *cr) {
for (; cr->len;) {
GotoCrumb c = Pop(cr);
Buffer *buffer = GetBufferStrict(c.buffer_id);
if (buffer) return c;
}
return {};
}
void GotoBackward(Window *window) {
BSet set = GetBSet(window);
if (window->goto_history.len <= 0) return;
Add(&window->goto_redo, {set.buffer->id, set.view->carets[0]});
GotoCrumb c = Pop(&window->goto_history);
GotoCrumb c = GetCrumb(&window->goto_history);
Buffer *buffer = GetBuffer(c.buffer_id);
View *view = WindowOpenBufferView(window, buffer->name);
view->carets[0] = c.caret;
@@ -42,7 +53,7 @@ void GotoForward(Window *window) {
if (window->goto_redo.len <= 0) return;
Add(&window->goto_history, {set.buffer->id, set.view->carets[0]});
GotoCrumb c = Pop(&window->goto_redo);
GotoCrumb c = GetCrumb(&window->goto_redo);
Buffer *buffer = GetBuffer(c.buffer_id);
View *view = WindowOpenBufferView(window, buffer->name);
view->carets[0] = c.caret;
@@ -604,6 +615,7 @@ void SaveBuffer(View *view) {
if (success) {
buffer->file_mod_time = GetFileModTime(buffer->name);
buffer->dirty = false;
buffer->gc = false;
} else {
ReportWarningf("Failed to save file with name: %.*s", FmtString(buffer->name));
}

View File

@@ -469,7 +469,6 @@ void GlobalCommand(Event event) {
if (GetSize(caret.range) == 0) range = EncloseLoadWord(active.buffer, GetFront(caret));
String16 string = GetString(active.buffer, range);
active.window->active_goto_list = active.view->id;
Open(string);
}

View File

@@ -169,6 +169,8 @@ function SkipPath(s)
if not slash_eaten then break end
end
if #cells == 0 then return s end
local skip_size = input_s:len() - s:len()
local path = input_s:sub(1, skip_size)
return s, path, drive, cells
@@ -187,6 +189,8 @@ end
function MatchWindowsPath(_s)
local s, file_path, drive = SkipPath(_s)
if not file_path then return nil end
if not drive then
local d = GetActiveMainWindowBufferDir()
file_path = d..'/'..file_path

View File

@@ -42,6 +42,8 @@ void Open(String path) {
return;
}
BSet main = GetActiveMainSet();
main.window->active_goto_list = main.view->id;
if (FieldString(LuaState, "kind") == "text") {
String file_path = FieldString(LuaState, "file_path");
String line_string = FieldString(LuaState, "line");
@@ -49,7 +51,6 @@ void Open(String path) {
String col_string = FieldString(LuaState, "col");
Int col = strtoll(col_string.data, NULL, 10);
BSet main = GetActiveMainSet();
CheckpointBeforeGoto(main.window);
View *view = WindowOpenBufferView(main.window, file_path);
Buffer *buffer = GetBuffer(view->active_buffer);

View File

@@ -1,10 +1,10 @@
WindowID WindowIDs = {0};
BufferID BufferIDs = {0};
ViewID ViewIDs = {0};
WindowID WindowIDs;
BufferID BufferIDs;
ViewID ViewIDs;
Array<BufferID> Buffers = {};
Array<ViewID> Views = {};
Array<WindowID> Windows = {};
Array<BufferID> Buffers;
Array<ViewID> Views;
Array<WindowID> Windows;
BufferID NullBufferID; // +buffer
ViewID NullViewID;
@@ -58,6 +58,11 @@ inline Buffer *GetBuffer(BufferID id) {
return Buffers[0].o;
}
inline Buffer *GetBufferStrict(BufferID id) {
For(Buffers) if (it == id) return it.o;
return NULL;
}
inline Buffer *GetBuffer(String name) {
For(Buffers) if (it.o->name == name) return it.o;
return Buffers[0].o;
@@ -124,9 +129,11 @@ Window *CreateWindow(bool insert_into_windows = true) {
}
View *CreateView(BufferID active_buffer) {
View *view = AllocType(Perm, View);
view->id = AllocViewID(view);
view->active_buffer = active_buffer;
Allocator al = GetSystemAllocator();
View *view = AllocType(al, View);
view->id = AllocViewID(view);
view->active_buffer = active_buffer;
view->carets.allocator = al;
Add(&view->carets, {0, 0});
Add(&Views, view->id);
return view;
@@ -410,6 +417,7 @@ Window *BufferIsCrumb(BufferID buffer_id) {
}
void GarbageCollect() {
Allocator sys_allocator = GetSystemAllocator();
IterRemove(Views) {
IterRemovePrepare(Views);
View *view = it.o;
@@ -424,9 +432,9 @@ void GarbageCollect() {
if (gc && !ref) {
Dealloc(&view->carets);
remove_item = true;
// @todo: add view to free list
IKnowWhatImDoing_Appendf(GCInfoBuffer, "view %.*s\n", FmtString(buffer->name));
Dealloc(sys_allocator, &view);
}
}
@@ -442,9 +450,9 @@ void GarbageCollect() {
DeallocHistoryArray(&buffer->redo_stack);
Dealloc(buffer->line_starts.allocator, &buffer->data);
remove_item = true;
// @todo: add buffer to free list
IKnowWhatImDoing_Appendf(GCInfoBuffer, "buffer %.*s\n", FmtString(buffer->name));
Dealloc(sys_allocator, &buffer);
} else if (buffer->file_mod_time) {
int64_t new_file_mod_time = GetFileModTime(buffer->name);
if (buffer->file_mod_time != new_file_mod_time) {

View File

@@ -1,14 +1,11 @@
- garbage collect the buffers, views - store them in free list on destroy
- adding items to directory should create files on save - it should ask the user (syntax: dir/ | file)
- ask user if he really wants to quit even though he has an unsaved buffer - popup window
- add plumb rules for some web stuff
- test the code editor: try writing in it, try browsing in it, create test tooling
- Execute enclosure which is going to execute on every keypress, modification
- Find matches using grep, change things in that buffer then apply those changes to all items
- group history entries so the you can rollback through multiple ones at once and not waste time on skipping whitespace trimming or deleting every character
- Fuzzy search buffer which uses titlebar as query!
- Check if file exists in ApplyRules otherwise return null
- Gotos, jumping between views should preserve cursors, maybe just scroll
- ReportWarning should be signaled visibly but you should be able to do things! no focus switching