From 9091346d44f5b1e6f61249feede28846d22351f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 23 Aug 2016 16:38:43 +0200 Subject: vis: improve dot (repeat) command implmentation Do not override implicit operator macro in command mode. Fix #334 --- vis-core.h | 2 +- vis-modes.c | 16 ++++++++++++---- vis-motions.c | 2 +- vis-operators.c | 7 +------ vis-text-objects.c | 2 +- vis.c | 8 +++++--- 6 files changed, 21 insertions(+), 16 deletions(-) diff --git a/vis-core.h b/vis-core.h index 1c6c446..16fea28 100644 --- a/vis-core.h +++ b/vis-core.h @@ -190,7 +190,7 @@ extern const TextObject vis_textobjects[VIS_TEXTOBJECT_INVALID]; void macro_operator_stop(Vis *vis); void macro_operator_record(Vis *vis); -void action_do(Vis *vis, Action *a); +void vis_do(Vis *vis); void action_reset(Action*); void mode_set(Vis *vis, Mode *new_mode); diff --git a/vis-modes.c b/vis-modes.c index eb4bfb0..fa69d24 100644 --- a/vis-modes.c +++ b/vis-modes.c @@ -114,11 +114,15 @@ static void vis_mode_visual_leave(Vis *vis, Mode *new) { } static void vis_mode_insert_enter(Vis *vis, Mode *old) { + if (vis->win->parent) + return; + if (!vis->action.op) { + action_reset(&vis->action_prev); + vis->action_prev.op = &vis_operators[VIS_OP_INSERT]; + } if (!vis->macro_operator) { macro_operator_record(vis); - action_reset(&vis->action_prev); vis->action_prev.macro = vis->macro_operator; - vis->action_prev.op = &vis_operators[VIS_OP_INSERT]; } } @@ -138,11 +142,15 @@ static void vis_mode_insert_input(Vis *vis, const char *str, size_t len) { } static void vis_mode_replace_enter(Vis *vis, Mode *old) { + if (vis->win->parent) + return; + if (!vis->action.op) { + action_reset(&vis->action_prev); + vis->action_prev.op = &vis_operators[VIS_OP_REPLACE]; + } if (!vis->macro_operator) { macro_operator_record(vis); - action_reset(&vis->action_prev); vis->action_prev.macro = vis->macro_operator; - vis->action_prev.op = &vis_operators[VIS_OP_REPLACE]; } } diff --git a/vis-motions.c b/vis-motions.c index 933142c..83bcb5a 100644 --- a/vis-motions.c +++ b/vis-motions.c @@ -322,7 +322,7 @@ bool vis_motion(Vis *vis, enum VisMotion motion, ...) { goto err; va_end(ap); - action_do(vis, &vis->action); + vis_do(vis); return true; err: va_end(ap); diff --git a/vis-operators.c b/vis-operators.c index efc0dff..3954920 100644 --- a/vis-operators.c +++ b/vis-operators.c @@ -18,7 +18,6 @@ static size_t op_delete(Vis *vis, Text *txt, OperatorContext *c) { static size_t op_change(Vis *vis, Text *txt, OperatorContext *c) { op_delete(vis, txt, c); - macro_operator_record(vis); return c->range.start; } @@ -213,18 +212,14 @@ static size_t op_join(Vis *vis, Text *txt, OperatorContext *c) { } static size_t op_insert(Vis *vis, Text *txt, OperatorContext *c) { - macro_operator_record(vis); return c->newpos != EPOS ? c->newpos : c->pos; } static size_t op_replace(Vis *vis, Text *txt, OperatorContext *c) { - macro_operator_record(vis); return c->newpos != EPOS ? c->newpos : c->pos; } static size_t op_filter(Vis *vis, Text *txt, OperatorContext *c) { - if (!c->arg->s) - macro_operator_record(vis); return text_size(txt) + 1; /* do not change cursor position, would destroy selection */ } @@ -266,7 +261,7 @@ bool vis_operator(Vis *vis, enum VisOperator id, ...) { const Operator *op = &vis_operators[id]; if (vis->mode->visual) { vis->action.op = op; - action_do(vis, &vis->action); + vis_do(vis); goto out; } diff --git a/vis-text-objects.c b/vis-text-objects.c index 1140d86..b3ed463 100644 --- a/vis-text-objects.c +++ b/vis-text-objects.c @@ -26,7 +26,7 @@ bool vis_textobject(Vis *vis, enum VisTextObject id) { vis->action.textobj = array_get_ptr(&vis->textobjects, id - LENGTH(vis_textobjects)); if (!vis->action.textobj) return false; - action_do(vis, &vis->action); + vis_do(vis); return true; } diff --git a/vis.c b/vis.c index f6b28f1..ed14875 100644 --- a/vis.c +++ b/vis.c @@ -544,16 +544,17 @@ static void window_jumplist_invalidate(Win *win) { ringbuf_invalidate(win->jumplist); } -void action_do(Vis *vis, Action *a) { +void vis_do(Vis *vis) { Win *win = vis->win; Text *txt = win->file->text; View *view = win->view; + Action *a = &vis->action; if (a->op == &vis_operators[VIS_OP_FILTER] && !vis->mode->visual) vis_mode_switch(vis, VIS_MODE_VISUAL_LINE); int count = MAX(a->count, 1); - bool repeatable = a->op && !vis->macro_operator; + bool repeatable = a->op && !vis->macro_operator && !vis->win->parent; bool multiple_cursors = view_cursors_multiple(view); bool linewise = !(a->type & CHARWISE) && ( a->type & LINEWISE || (a->movement && a->movement->type & LINEWISE) || @@ -1113,7 +1114,8 @@ void vis_repeat(Vis *vis) { /* for some operators count should be applied only to the macro not the motion */ if (vis->action_prev.op == &vis_operators[VIS_OP_INSERT] || vis->action_prev.op == &vis_operators[VIS_OP_REPLACE]) vis->action_prev.count = 1; - action_do(vis, &vis->action_prev); + vis->action = vis->action_prev; + vis_do(vis); vis->action_prev.count = count; if (macro) { Mode *mode = vis->mode; -- cgit v1.2.3