aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-02-07 08:54:23 +0100
committerMarc André Tanner <mat@brain-dump.org>2017-02-07 11:31:34 +0100
commitd68217c61f9c5d7bf79d3efa440a93f2761a3975 (patch)
treed32637eb0c4aa05d0218b27d5ebf1c17b079f77f
parentb01ac103aa61b5a0383ed085bf6997d8e5f70bbc (diff)
downloadvis-d68217c61f9c5d7bf79d3efa440a93f2761a3975.tar.gz
vis-d68217c61f9c5d7bf79d3efa440a93f2761a3975.tar.xz
vis: improve text object handling
Fix `gN` and delimited inner variants when given a count.
-rw-r--r--vis-core.h2
-rw-r--r--vis-text-objects.c4
-rw-r--r--vis.c15
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);