aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-11-16 23:42:26 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-11-16 23:42:26 +0100
commita599a60c543d38c6b803702d2fc991e3d7ab0b6c (patch)
tree3cdecf6786b16c9ebccf606ca5585f9ffa3b9cb6
parent4707fed2a21f4836b0eba28135040c3a456c9da9 (diff)
downloadvis-a599a60c543d38c6b803702d2fc991e3d7ab0b6c.tar.gz
vis-a599a60c543d38c6b803702d2fc991e3d7ab0b6c.tar.xz
vis: treat vis_keys_feed input like a macro replay
We need to push keys individually to the input queue such that the state machine can advance and record keys into the operator macro if necessary. Previously feeding the following input: isome text<Escape>. would not work as expected because the complete key stream was pushed to the input queue at the same time during which the operator macro was not yet active. Thus the dot command at the end would have nothing to repeat.
-rw-r--r--vis-core.h1
-rw-r--r--vis.c9
2 files changed, 9 insertions, 1 deletions
diff --git a/vis-core.h b/vis-core.h
index 6d5d022..6c1c577 100644
--- a/vis-core.h
+++ b/vis-core.h
@@ -89,6 +89,7 @@ typedef struct {
/* a macro is just a sequence of symbolic keys as received from ui->getkey */
typedef Buffer Macro;
+#define macro_init buffer_init
#define macro_release buffer_release
#define macro_reset buffer_truncate
#define macro_append buffer_append0
diff --git a/vis.c b/vis.c
index e3ad87e..ed94f7d 100644
--- a/vis.c
+++ b/vis.c
@@ -930,7 +930,14 @@ static void vis_keys_process(Vis *vis, size_t pos) {
}
void vis_keys_feed(Vis *vis, const char *input) {
- vis_keys_push(vis, input, buffer_length0(vis->keys), false);
+ if (!input)
+ return;
+ Macro macro;
+ macro_init(&macro);
+ if (!macro_append(&macro, input))
+ return;
+ macro_replay(vis, &macro);
+ macro_release(&macro);
}
static void vis_keys_push(Vis *vis, const char *input, size_t pos, bool record) {