diff --git a/src/text_editor/buffer_helpers.cpp b/src/text_editor/buffer_helpers.cpp index f16aace..8e9d1e8 100644 --- a/src/text_editor/buffer_helpers.cpp +++ b/src/text_editor/buffer_helpers.cpp @@ -440,21 +440,50 @@ Range EncloseLoadWord(Buffer *buffer, Int pos) { return result; } -Range EncloseExecWord(Buffer *buffer, Int pos) { - Range result = {GetExecWordStart(buffer, pos), GetExecWordEnd(buffer, pos)}; - return result; +Int SkipSpaces(Buffer *buffer, Int seek) { + for (; seek < buffer->len; seek += 1) { + wchar_t c = GetChar(buffer, seek); + if (c != L' ') break; + } + return seek; } -Range TrimButtonChars(Buffer *buffer, Range range) { - bool left0 = range.min < range.max && range.min + 1 < range.max; - bool left1 = GetChar(buffer, range.min) == L'|' && GetChar(buffer, range.min + 1) == L'>'; - if (left0 && left1) range.min += 2; +Int FindScopeEnd(Buffer *buffer, Int seek, Int max_seek, wchar_t open, wchar_t close) { + wchar_t right = GetChar(buffer, seek); + if (right == open) { + int scope = 1; + Int i = seek + 1; + for (; i < seek + max_seek && i < buffer->len; i += 1) { + wchar_t c = GetChar(buffer, i); - bool right0 = range.max - 2 >= range.min && range.max - 1 >= range.min; - bool right1 = GetChar(buffer, range.max - 2) == L'<' && GetChar(buffer, range.max - 1) == L'|'; - if (right0 && right1) range.max -= 2; + if (open == close && c == '\\') { + i += 1; + } else if (open == close && c == open) { + scope -= 1; + } else if (c == open) { + scope += 1; + } else if (c == close) { + scope -= 1; + } - return range; + if (c == L'\n' || scope == 0) break; + } + + if (scope == 0) seek = i; + } + return seek; +} + +Range EncloseExecWord(Buffer *buffer, Int pos) { + Range result = {GetWordStart(buffer, pos), GetWordEnd(buffer, pos)}; + + Int seek = SkipSpaces(buffer, result.max); + Int scope_end = FindScopeEnd(buffer, seek, 1024, L'(', L')'); + if (seek == scope_end) scope_end = FindScopeEnd(buffer, seek, 1024, L'{', L'}'); + if (seek == scope_end) scope_end = FindScopeEnd(buffer, seek, 1024, L'\'', L'\''); + if (seek == scope_end) scope_end = FindScopeEnd(buffer, seek, 1024, L'\"', L'\"'); + if (seek != scope_end) result.max = scope_end + 1; + return result; } Range EncloseLine(Buffer *buffer, Int pos) { diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 8e21e75..8ea0b53 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -270,7 +270,6 @@ bool GlobalCommand(Event event) { if (InBounds(view->carets[0].range, p)) { enclose = view->carets[0].range; } - enclose = TrimButtonChars(buffer, enclose); String16 string = GetString(*buffer, enclose); Command_EvalLua(view, string); } diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index e3d97be..136dd67 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -900,7 +900,6 @@ void WindowCommand(Event event, Window *window, View *view) { Range range = caret.range; if (GetSize(caret.range) == 0) { range = EncloseExecWord(buffer, GetFront(caret)); - range = TrimButtonChars(buffer, range); } String16 string = GetString(*buffer, range); diff --git a/src/text_editor/todo.txt b/src/text_editor/todo.txt index 8dd9ee7..a68422c 100644 --- a/src/text_editor/todo.txt +++ b/src/text_editor/todo.txt @@ -1,3 +1,4 @@ +- Exec word should try to match lua function calls (first match word, then expand selection right) - Remove pointers and use ViewIDs (enable array debug while doing this) - try using git grep for search for now, combine with fuzzy search buffer - need to rewrite the path matching in lua