aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.def.h8
-rw-r--r--editor.c1
-rw-r--r--editor.h1
-rw-r--r--vis.c20
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);