aboutsummaryrefslogtreecommitdiff
path: root/vis-operators.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-11-09 12:56:25 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-11-09 12:56:25 +0100
commitb05cd28c904994188be55e7bcecf98ef0077b6ba (patch)
tree3edd0bb028a38754c5d873369a10b82d5b252956 /vis-operators.c
parent51bf6abad037a333ad3b8f760150de4d834bb900 (diff)
downloadvis-b05cd28c904994188be55e7bcecf98ef0077b6ba.tar.gz
vis-b05cd28c904994188be55e7bcecf98ef0077b6ba.tar.xz
vis: add replace operator VIS_OP_REPLACE
Delete the given range and insert the same number of replacement characters.
Diffstat (limited to 'vis-operators.c')
-rw-r--r--vis-operators.c21
1 files changed, 21 insertions, 0 deletions
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 },
};