From 3ea63f3951dd8e1c624966d6966ea8ca0e359b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 11 Apr 2015 10:39:46 +0200 Subject: Eliminate global state for repetition of last modification --- config.def.h | 8 ++++---- editor.c | 1 + editor.h | 1 + vis.c | 20 ++++++++++---------- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/config.def.h b/config.def.h index aa079d7..4e7b5da 100644 --- a/config.def.h +++ b/config.def.h @@ -572,8 +572,8 @@ static void vis_mode_insert_input(const char *str, size_t len) { static size_t oldpos = EPOS; size_t pos = window_cursor_get(vis->win->win); if (pos != oldpos) - buffer_truncate(&buffer_repeat); - buffer_append(&buffer_repeat, str, len); + buffer_truncate(&vis->buffer_repeat); + buffer_append(&vis->buffer_repeat, str, len); oldpos = pos + len; action_reset(&action_prev); action_prev.op = &ops[OP_REPEAT_INSERT]; @@ -594,8 +594,8 @@ static void vis_mode_replace_input(const char *str, size_t len) { static size_t oldpos = EPOS; size_t pos = window_cursor_get(vis->win->win); if (pos != oldpos) - buffer_truncate(&buffer_repeat); - buffer_append(&buffer_repeat, str, len); + buffer_truncate(&vis->buffer_repeat); + buffer_append(&vis->buffer_repeat, str, len); oldpos = pos + len; action_reset(&action_prev); action_prev.op = &ops[OP_REPEAT_REPLACE]; diff --git a/editor.c b/editor.c index 244c568..7b0c7b2 100644 --- a/editor.c +++ b/editor.c @@ -411,6 +411,7 @@ void editor_free(Editor *ed) { ed->ui->free(ed->ui); map_free(ed->cmds); map_free(ed->options); + buffer_free(&ed->buffer_repeat); free(ed); } diff --git a/editor.h b/editor.h index 771f8f8..81d2c73 100644 --- a/editor.h +++ b/editor.h @@ -123,6 +123,7 @@ struct Editor { bool autoindent; /* whether indentation should be copied from previous line on newline */ Map *cmds; /* ":"-commands, used for unique prefix queries */ Map *options; /* ":set"-options */ + Buffer buffer_repeat; /* holds data to repeat last insertion/replacement */ }; Editor *editor_new(Ui*); diff --git a/vis.c b/vis.c index e4c618a..fe42677 100644 --- a/vis.c +++ b/vis.c @@ -157,7 +157,6 @@ static Mode *mode_prev; /* previsouly active user mode */ static Mode *mode_before_prompt; /* user mode which was active before entering prompt */ static Action action; /* current action which is in progress */ static Action action_prev; /* last operator action used by the repeat '.' key */ -static Buffer buffer_repeat;/* repeat last modification i.e. insertion/replacement */ /** operators */ static void op_change(OperatorContext *c); @@ -686,19 +685,20 @@ static void op_join(OperatorContext *c) { } static void op_repeat_insert(OperatorContext *c) { - if (!buffer_repeat.len) + size_t len = vis->buffer_repeat.len; + if (!len) return; - editor_insert(vis, c->pos, buffer_repeat.data, buffer_repeat.len); - window_cursor_to(vis->win->win, c->pos + buffer_repeat.len); + editor_insert(vis, c->pos, vis->buffer_repeat.data, len); + window_cursor_to(vis->win->win, c->pos + len); } static void op_repeat_replace(OperatorContext *c) { - if (!buffer_repeat.len) + size_t chars = 0, len = vis->buffer_repeat.len; + if (!len) return; - - size_t chars = 0; - for (size_t i = 0; i < buffer_repeat.len; i++) { - if (ISUTF8(buffer_repeat.data[i])) + const char *data = vis->buffer_repeat.data; + for (size_t i = 0; i < len; i++) { + if (ISUTF8(data[i])) chars++; } @@ -878,7 +878,7 @@ static void replace(const Arg *arg) { size_t pos = window_cursor_get(vis->win->win); action_reset(&action_prev); action_prev.op = &ops[OP_REPEAT_REPLACE]; - buffer_put(&buffer_repeat, k.str, strlen(k.str)); + buffer_put(&vis->buffer_repeat, k.str, strlen(k.str)); editor_delete_key(vis); editor_insert_key(vis, k.str, strlen(k.str)); text_snapshot(vis->win->text->data); -- cgit v1.2.3