aboutsummaryrefslogtreecommitdiff
path: root/vis-motions.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2020-12-28 15:17:36 +0100
committerMarc André Tanner <mat@brain-dump.org>2020-12-28 15:17:36 +0100
commitadf65e1dca8d3c0381133be8446eebddf412d772 (patch)
treed15dd7a68c597ca9be6ca92ea363578e501391cc /vis-motions.c
parent0b082239bc60f0a6a3cb743b38a63684652ae649 (diff)
downloadvis-adf65e1dca8d3c0381133be8446eebddf412d772.tar.gz
vis-adf65e1dca8d3c0381133be8446eebddf412d772.tar.xz
vis: implement multiline to/till motions
These are currently not mapped by default but can be enabled by mappings using their virtual key names.
Diffstat (limited to 'vis-motions.c')
-rw-r--r--vis-motions.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/vis-motions.c b/vis-motions.c
index 9658f9f..6178f5a 100644
--- a/vis-motions.c
+++ b/vis-motions.c
@@ -112,6 +112,32 @@ static size_t longword_next(Vis *vis, Text *txt, size_t pos) {
VIS_MOVE_LONGWORD_END_NEXT, isspace);
}
+static size_t to_right(Vis *vis, Text *txt, size_t pos) {
+ char c;
+ size_t hit = text_find_next(txt, pos+1, vis->search_char);
+ if (!text_byte_get(txt, hit, &c) || c != vis->search_char[0])
+ return pos;
+ return hit;
+}
+
+static size_t till_right(Vis *vis, Text *txt, size_t pos) {
+ size_t hit = to_right(vis, txt, pos+1);
+ if (hit != pos)
+ return text_char_prev(txt, hit);
+ return pos;
+}
+
+static size_t to_left(Vis *vis, Text *txt, size_t pos) {
+ return text_find_prev(txt, pos, vis->search_char);
+}
+
+static size_t till_left(Vis *vis, Text *txt, size_t pos) {
+ size_t hit = to_left(vis, txt, pos-1);
+ if (hit != pos-1)
+ return text_char_next(txt, hit);
+ return pos;
+}
+
static size_t to_line_right(Vis *vis, Text *txt, size_t pos) {
char c;
if (pos == text_line_end(txt, pos))
@@ -294,8 +320,12 @@ bool vis_motion(Vis *vis, enum VisMotion motion, ...) {
}
break;
}
+ case VIS_MOVE_TO_RIGHT:
+ case VIS_MOVE_TO_LEFT:
case VIS_MOVE_TO_LINE_RIGHT:
case VIS_MOVE_TO_LINE_LEFT:
+ case VIS_MOVE_TILL_RIGHT:
+ case VIS_MOVE_TILL_LEFT:
case VIS_MOVE_TILL_LINE_RIGHT:
case VIS_MOVE_TILL_LINE_LEFT:
{
@@ -314,12 +344,24 @@ bool vis_motion(Vis *vis, enum VisMotion motion, ...) {
break;
case VIS_MOVE_TOTILL_REVERSE:
switch (vis->last_totill) {
+ case VIS_MOVE_TO_RIGHT:
+ motion = VIS_MOVE_TO_LEFT;
+ break;
+ case VIS_MOVE_TO_LEFT:
+ motion = VIS_MOVE_TO_RIGHT;
+ break;
case VIS_MOVE_TO_LINE_RIGHT:
motion = VIS_MOVE_TO_LINE_LEFT;
break;
case VIS_MOVE_TO_LINE_LEFT:
motion = VIS_MOVE_TO_LINE_RIGHT;
break;
+ case VIS_MOVE_TILL_RIGHT:
+ motion = VIS_MOVE_TILL_LEFT;
+ break;
+ case VIS_MOVE_TILL_LEFT:
+ motion = VIS_MOVE_TILL_RIGHT;
+ break;
case VIS_MOVE_TILL_LINE_RIGHT:
motion = VIS_MOVE_TILL_LINE_LEFT;
break;
@@ -515,6 +557,14 @@ const Movement vis_motions[] = {
.txt = lastline,
.type = LINEWISE|LINEWISE_INCLUSIVE|JUMP|IDEMPOTENT,
},
+ [VIS_MOVE_TO_LEFT] = {
+ .vis = to_left,
+ .type = COUNT_EXACT,
+ },
+ [VIS_MOVE_TO_RIGHT] = {
+ .vis = to_right,
+ .type = INCLUSIVE|COUNT_EXACT,
+ },
[VIS_MOVE_TO_LINE_LEFT] = {
.vis = to_line_left,
.type = COUNT_EXACT,
@@ -523,6 +573,14 @@ const Movement vis_motions[] = {
.vis = to_line_right,
.type = INCLUSIVE|COUNT_EXACT,
},
+ [VIS_MOVE_TILL_LEFT] = {
+ .vis = till_left,
+ .type = COUNT_EXACT,
+ },
+ [VIS_MOVE_TILL_RIGHT] = {
+ .vis = till_right,
+ .type = INCLUSIVE|COUNT_EXACT,
+ },
[VIS_MOVE_TILL_LINE_LEFT] = {
.vis = till_line_left,
.type = COUNT_EXACT,