diff options
| -rw-r--r-- | vis-core.h | 1 | ||||
| -rw-r--r-- | vis-motions.c | 6 | ||||
| -rw-r--r-- | vis.c | 10 |
3 files changed, 14 insertions, 3 deletions
@@ -69,6 +69,7 @@ typedef struct { /* Motion implementation, takes a cursor postion and returns a LINEWISE_INCLUSIVE = 1 << 3, /* inclusive, but only if motion is linewise? */ IDEMPOTENT = 1 << 4, /* does the returned postion remain the same if called multiple times? */ JUMP = 1 << 5, /* should the resulting position of the motion be recorded in the jump list? */ + COUNT_EXACT = 1 << 6, /* fail (keep initial position) if count can not be satisfied exactly */ } type; void *data; } Movement; diff --git a/vis-motions.c b/vis-motions.c index 0a44555..9b4a8ab 100644 --- a/vis-motions.c +++ b/vis-motions.c @@ -502,17 +502,19 @@ const Movement vis_motions[] = { }, [VIS_MOVE_LEFT_TO] = { .vis = to_left, + .type = COUNT_EXACT, }, [VIS_MOVE_RIGHT_TO] = { .vis = to, - .type = INCLUSIVE, + .type = INCLUSIVE|COUNT_EXACT, }, [VIS_MOVE_LEFT_TILL] = { .vis = till_left, + .type = COUNT_EXACT, }, [VIS_MOVE_RIGHT_TILL] = { .vis = till, - .type = INCLUSIVE, + .type = INCLUSIVE|COUNT_EXACT, }, [VIS_MOVE_MARK] = { .file = mark_goto, @@ -710,6 +710,7 @@ void vis_do(Vis *vis) { .arg = &a->arg, }; + bool err = false; if (a->movement) { size_t start = pos; for (int i = 0; i < count; i++) { @@ -728,8 +729,15 @@ void vis_do(Vis *vis) { pos = a->movement->win(vis, win, pos); else if (a->movement->user) pos = a->movement->user(vis, win, a->movement->data, pos); - if (pos == EPOS || a->movement->type & IDEMPOTENT || pos == pos_prev) + if (pos == EPOS || a->movement->type & IDEMPOTENT || pos == pos_prev) { + err = a->movement->type & COUNT_EXACT; break; + } + } + + if (err) { + repeatable = false; + continue; // break? } if (pos == EPOS) { |
