From 19546eea4d4b5689066775ccc75eca9dcd355d79 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 9 Aug 2024 10:11:19 +0200 Subject: [PATCH] Improve ctrl movement, fix delete indent bug --- src/text_editor/buffer_helpers.cpp | 12 +++++++----- src/text_editor/commands_window.cpp | 4 ++-- src/text_editor/todo.txt | 4 +--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/text_editor/buffer_helpers.cpp b/src/text_editor/buffer_helpers.cpp index 8e9d1e8..b280cf4 100644 --- a/src/text_editor/buffer_helpers.cpp +++ b/src/text_editor/buffer_helpers.cpp @@ -333,26 +333,28 @@ Int GetNextWordEnd(Buffer *buffer, Int pos) { // too early and we cannot establish the proper range // semantics - proper max is one past last index if (!(i < buffer->len)) break; - if ((prev && prev != buffer->str[i]) || IsWord(buffer->str[i])) { + if (prev == L'\n' || (prev && prev != buffer->str[i]) || IsWord(buffer->str[i])) { break; } prev = buffer->str[i]; } - Int result = GetWordEnd(buffer, pos); + Int result = prev == L'\n' ? pos : GetWordEnd(buffer, pos); return result; } Int GetPrevWordStart(Buffer *buffer, Int pos) { pos = Clamp(pos, (Int)0, buffer->len); wchar_t prev = 0; - for (Int i = pos - 1; i >= 0; i -= 1) { - if ((prev && prev != buffer->str[i]) || IsWord(buffer->str[i])) { + Int i = pos - 1; + for (; i >= 0; i -= 1) { + if (prev == L'\n' || (prev && prev != buffer->str[i]) || IsWord(buffer->str[i])) { break; } pos = i; prev = buffer->str[i]; } - Int result = GetWordStart(buffer, pos); + bool new_line = prev == L'\n'; + Int result = new_line ? pos : GetWordStart(buffer, pos); return result; } diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index 23cbce5..9e81636 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -415,13 +415,13 @@ void Command_Delete(View *view, int direction, bool ctrl = false) { // Delete indent in multiple of IndentSize Range indent_range = GetIndentRangeAtPos(buffer, it.range.min); - if (it.range.min > indent_range.min && it.range.max <= indent_range.max) { + 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 % (StyleIndentSize)); if (to_delete == 0) to_delete = StyleIndentSize; to_delete = Clamp(to_delete, (Int)1, StyleIndentSize); for (Int i = 0; i < to_delete; i += 1) { - it = MoveCaret(buffer, it, direction, ctrl, SHIFT_PRESSED); + it = MoveCaret(buffer, it, direction, false, SHIFT_PRESSED); } } else { diff --git a/src/text_editor/todo.txt b/src/text_editor/todo.txt index af7e9d2..76a5359 100644 --- a/src/text_editor/todo.txt +++ b/src/text_editor/todo.txt @@ -1,13 +1,11 @@ - Remove pointers and use ViewIDs (enable array debug while doing this) - try using git grep for search for now, combine with fuzzy search buffer - lua maybe try heuristic matching paths from left? -- win32: change all stack buffers to arena - search as a command to execute which is going to be in the title bar - search backwards -- braces enclose should be performed even if we put the mouse out of bounds! - some split selection commands -- assign commands or lua functions to F1-F12 keys +- assign commands or lua functions to F1-F8 keys - word complete - Search all buffers in 10X style, incrementally searched results popping up on every key press (maybe we need coroutine library in C so this is easier?)