From d68217c61f9c5d7bf79d3efa440a93f2761a3975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 7 Feb 2017 08:54:23 +0100 Subject: vis: improve text object handling Fix `gN` and delimited inner variants when given a count. --- vis-core.h | 2 ++ vis-text-objects.c | 4 ++-- vis.c | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/vis-core.h b/vis-core.h index 2ad6ea7..6147967 100644 --- a/vis-core.h +++ b/vis-core.h @@ -83,6 +83,8 @@ typedef struct { TEXTOBJECT_DELIMITED_INNER = 1 << 0, /* single byte delimited, inner variant */ TEXTOBJECT_DELIMITED_OUTER = 1 << 1, /* single byte delimited, outer variant */ TEXTOBJECT_NON_CONTIGUOUS = 1 << 2, /* multiple applications yield a split range */ + TEXTOBJECT_EXTEND_FORWARD = 1 << 3, /* multiple applications extend towards the end of file (default) */ + TEXTOBJECT_EXTEND_BACKWARD = 1 << 4, /* multiple applications extend towards the begin of file */ } type; void *data; } TextObject; diff --git a/vis-text-objects.c b/vis-text-objects.c index e4b053b..86c9feb 100644 --- a/vis-text-objects.c +++ b/vis-text-objects.c @@ -194,11 +194,11 @@ const TextObject vis_textobjects[] = { }, [VIS_TEXTOBJECT_SEARCH_FORWARD] = { .vis = search_forward, - .type = TEXTOBJECT_NON_CONTIGUOUS, + .type = TEXTOBJECT_NON_CONTIGUOUS|TEXTOBJECT_EXTEND_FORWARD, }, [VIS_TEXTOBJECT_SEARCH_BACKWARD] = { .vis = search_backward, - .type = TEXTOBJECT_NON_CONTIGUOUS, + .type = TEXTOBJECT_NON_CONTIGUOUS|TEXTOBJECT_EXTEND_BACKWARD, }, }; diff --git a/vis.c b/vis.c index 9a1dbaa..3e64031 100644 --- a/vis.c +++ b/vis.c @@ -776,13 +776,22 @@ void vis_do(Vis *vis) { r.end++; } - if (vis->mode->visual) + if (vis->mode->visual || (i > 0 && !(a->textobj->type & TEXTOBJECT_NON_CONTIGUOUS))) c.range = text_range_union(&c.range, &r); else c.range = r; - if (i < count - 1) - pos = c.range.end + 1; + if (i < count - 1) { + if (a->textobj->type & TEXTOBJECT_EXTEND_BACKWARD) { + pos = c.range.start; + if ((a->textobj->type & TEXTOBJECT_DELIMITED_INNER) && pos > 0) + pos--; + } else { + pos = c.range.end; + if (a->textobj->type & TEXTOBJECT_DELIMITED_INNER) + pos++; + } + } } } else if (vis->mode->visual) { c.range = view_cursors_selection_get(cursor); -- cgit v1.2.3