aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-08-23 16:38:43 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-08-24 11:10:00 +0200
commit9091346d44f5b1e6f61249feede28846d22351f0 (patch)
treed61d9b774a805d1a651482f47a16d8d5d1d9940b
parente2d51321f7284d11d9344e22117db31372fbe7a0 (diff)
downloadvis-9091346d44f5b1e6f61249feede28846d22351f0.tar.gz
vis-9091346d44f5b1e6f61249feede28846d22351f0.tar.xz
vis: improve dot (repeat) command implmentation
Do not override implicit operator macro in command mode. Fix #334
-rw-r--r--vis-core.h2
-rw-r--r--vis-modes.c16
-rw-r--r--vis-motions.c2
-rw-r--r--vis-operators.c7
-rw-r--r--vis-text-objects.c2
-rw-r--r--vis.c8
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;