From b05cd28c904994188be55e7bcecf98ef0077b6ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Wed, 9 Nov 2016 12:56:25 +0100 Subject: vis: add replace operator VIS_OP_REPLACE Delete the given range and insert the same number of replacement characters. --- vis-operators.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'vis-operators.c') diff --git a/vis-operators.c b/vis-operators.c index 5784115..6b7d32d 100644 --- a/vis-operators.c +++ b/vis-operators.c @@ -218,6 +218,18 @@ static size_t op_modeswitch(Vis *vis, Text *txt, OperatorContext *c) { return c->newpos != EPOS ? c->newpos : c->pos; } +static size_t op_replace(Vis *vis, Text *txt, OperatorContext *c) { + size_t count = 0; + Iterator it = text_iterator_get(txt, c->range.start); + while (it. pos < c->range.end && text_iterator_char_next(&it, NULL)) + count++; + op_delete(vis, txt, c); + size_t pos = c->range.start; + for (size_t len = strlen(c->arg->s); count > 0; pos += len, count--) + text_insert(txt, pos, c->arg->s, len); + return pos; +} + static size_t op_filter(Vis *vis, Text *txt, OperatorContext *c) { return text_size(txt) + 1; /* do not change cursor position, would destroy selection */ } @@ -258,6 +270,14 @@ bool vis_operator(Vis *vis, enum VisOperator id, ...) { case VIS_OP_SHIFT_RIGHT: vis_motion_type(vis, VIS_MOTIONTYPE_LINEWISE); break; + case VIS_OP_REPLACE: + { + Macro *macro = &vis->registers[VIS_MACRO_OPERATOR].buf; + macro_reset(macro); + macro_append(macro, va_arg(ap, char*)); + vis->action.arg.s = macro->data; + break; + } default: break; } @@ -304,6 +324,7 @@ const Operator vis_operators[] = { [VIS_OP_CASE_SWAP] = { op_case_change }, [VIS_OP_JOIN] = { op_join }, [VIS_OP_MODESWITCH] = { op_modeswitch }, + [VIS_OP_REPLACE] = { op_replace }, [VIS_OP_CURSOR_SOL] = { op_cursor }, [VIS_OP_FILTER] = { op_filter }, }; -- cgit v1.2.3