diff options
| -rw-r--r-- | vis-core.h | 2 | ||||
| -rw-r--r-- | vis-text-objects.c | 4 | ||||
| -rw-r--r-- | vis.c | 15 |
3 files changed, 16 insertions, 5 deletions
@@ -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, }, }; @@ -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); |
