From 321cf83fba85c70d0bdc89a07e8af4148127f23c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Mon, 26 Oct 2015 19:57:54 +0100 Subject: vis: introduce pseudo operators for put In principle put is not really an operator, however it still should be repeatable and respect count. --- vis.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'vis.c') diff --git a/vis.c b/vis.c index 8265182..5b96062 100644 --- a/vis.c +++ b/vis.c @@ -569,7 +569,7 @@ static Operator ops[] = { [OP_DELETE] = { op_delete }, [OP_CHANGE] = { op_change }, [OP_YANK] = { op_yank }, - [OP_PUT] = { op_put }, + [OP_PUT_AFTER] = { op_put }, [OP_SHIFT_RIGHT] = { op_shift_right }, [OP_SHIFT_LEFT] = { op_shift_left }, [OP_CASE_SWAP] = { op_case_change }, @@ -1046,15 +1046,15 @@ static size_t op_yank(Vis *vis, Text *txt, OperatorContext *c) { static size_t op_put(Vis *vis, Text *txt, OperatorContext *c) { size_t pos = c->pos; switch (c->arg->i) { - case PUT_AFTER: - case PUT_AFTER_END: + case OP_PUT_AFTER: + case OP_PUT_AFTER_END: if (c->reg->linewise) pos = text_line_next(txt, pos); else pos = text_char_next(txt, pos); break; - case PUT_BEFORE: - case PUT_BEFORE_END: + case OP_PUT_BEFORE: + case OP_PUT_BEFORE_END: if (c->reg->linewise) pos = text_line_begin(txt, pos); break; @@ -1067,14 +1067,14 @@ static size_t op_put(Vis *vis, Text *txt, OperatorContext *c) { if (c->reg->linewise) { switch (c->arg->i) { - case PUT_BEFORE_END: - case PUT_AFTER_END: + case OP_PUT_BEFORE_END: + case OP_PUT_AFTER_END: pos = text_line_start(txt, pos); break; - case PUT_AFTER: + case OP_PUT_AFTER: pos = text_line_start(txt, text_line_next(txt, c->pos)); break; - case PUT_BEFORE: + case OP_PUT_BEFORE: pos = text_line_start(txt, c->pos); break; } @@ -2813,6 +2813,13 @@ bool vis_operator(Vis *vis, enum VisOperator id) { vis->action.arg.i = id; id = OP_CURSOR_SOL; break; + case OP_PUT_AFTER: + case OP_PUT_AFTER_END: + case OP_PUT_BEFORE: + case OP_PUT_BEFORE_END: + vis->action.arg.i = id; + id = OP_PUT_AFTER; + break; default: break; } @@ -2835,6 +2842,11 @@ bool vis_operator(Vis *vis, enum VisOperator id) { } else { vis->action.op = op; } + + /* put is not a real operator, does not need a range to operate on */ + if (id == OP_PUT_AFTER) + vis_motion(vis, MOVE_NOP); + return true; } -- cgit v1.2.3