diff options
Diffstat (limited to 'text-objects.c')
| -rw-r--r-- | text-objects.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/text-objects.c b/text-objects.c index b0351cc..010f1df 100644 --- a/text-objects.c +++ b/text-objects.c @@ -176,23 +176,34 @@ Filerange text_object_paragraph(Text *txt, size_t pos) { return r; } -Filerange text_object_function(Text *txt, size_t pos) { - size_t a = text_function_start_prev(txt, pos); - size_t b = text_function_end_next(txt, pos); - if (text_function_end_next(txt, a) == b) { - Filerange r = text_range_new(a, b+1); - return text_range_linewise(txt, &r); +static Filerange object_function(Text *txt, size_t pos) { + size_t start_prev = text_function_start_prev(txt, pos); + size_t end_next = text_function_end_next(txt, pos); + size_t start = text_function_start_next(txt, start_prev); + size_t end = text_function_end_prev(txt, end_next); + if (start == pos) + start_prev = pos; + if (end == pos) + end_next = pos; + if (text_function_end_next(txt, start_prev) == end_next && + text_function_start_prev(txt, end_next) == start_prev) { + return text_range_new(start_prev, end_next); } return text_range_empty(); } +Filerange text_object_function(Text *txt, size_t pos) { + Filerange r = object_function(txt, pos); + if (!text_range_valid(&r)) + return r; + return text_range_linewise(txt, &r); +} + Filerange text_object_function_inner(Text *txt, size_t pos) { - Filerange r = text_object_function(txt, pos); + Filerange r = object_function(txt, pos); if (!text_range_valid(&r)) return r; - size_t b = text_function_end_next(txt, pos); - size_t a = text_bracket_match(txt, b); - return text_range_new(a+1, b-1); + return text_range_new(text_bracket_match(txt, r.end)+1, r.end); } static Filerange text_object_bracket(Text *txt, size_t pos, char type) { |
