aboutsummaryrefslogtreecommitdiff
path: root/vis.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-04-30 16:45:49 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-05-01 12:37:19 +0200
commit1724f24a0c8795e461f7acf8ca94ecae145da96b (patch)
treef62e953270886eba21800ba6a9349096142763c3 /vis.c
parentc8d1e2296688a77d7b0024cc572164dae694cd87 (diff)
downloadvis-1724f24a0c8795e461f7acf8ca94ecae145da96b.tar.gz
vis-1724f24a0c8795e461f7acf8ca94ecae145da96b.tar.xz
vis: cleanup input handling, improve macro replay
Diffstat (limited to 'vis.c')
-rw-r--r--vis.c71
1 files changed, 37 insertions, 34 deletions
diff --git a/vis.c b/vis.c
index 1397263..aaf446b 100644
--- a/vis.c
+++ b/vis.c
@@ -34,6 +34,7 @@
static Macro *macro_get(Vis *vis, enum VisRegister);
static void macro_replay(Vis *vis, const Macro *macro);
+static void vis_keys_process(Vis *vis);
/** window / file handling */
@@ -358,6 +359,8 @@ Vis *vis_new(Ui *ui, VisEvent *event) {
array_init(&vis->motions);
array_init(&vis->textobjects);
action_reset(&vis->action);
+ buffer_init(&vis->input_queue);
+ vis->keys = &vis->input_queue;
if (!(vis->command_file = file_new_internal(vis, NULL)))
goto err;
if (!(vis->search_file = file_new_internal(vis, NULL)))
@@ -693,7 +696,13 @@ const char *vis_keys_next(Vis *vis, const char *keys) {
return termkey_strpkey(termkey, keys, &key, TERMKEY_FORMAT_VIM);
}
-static const char *vis_keys_raw(Vis *vis, Buffer *buf, const char *input) {
+void vis_keys_input(Vis *vis, const char *input) {
+ vis_keys_push(vis, input);
+ vis_keys_process(vis);
+}
+
+static void vis_keys_process(Vis *vis) {
+ Buffer *buf = vis->keys;
char *keys = buf->data, *start = keys, *cur = keys, *end;
bool prefix = false;
KeyBinding *binding = NULL;
@@ -722,7 +731,6 @@ static const char *vis_keys_raw(Vis *vis, Buffer *buf, const char *input) {
}
*end = tmp;
- vis->keys = buf;
if (binding) { /* exact match */
if (binding->action) {
@@ -757,43 +765,21 @@ static const char *vis_keys_raw(Vis *vis, Buffer *buf, const char *input) {
}
}
- vis->keys = NULL;
buffer_put0(buf, start);
- return input + (start - keys);
+ return;
err:
- vis->keys = NULL;
buffer_truncate(buf);
- return input + strlen(input);
-}
-
-bool vis_keys_inject(Vis *vis, const char *pos, const char *input) {
- Buffer *buf = vis->keys;
- if (!buf)
- return false;
- if (pos < buf->data || pos > buf->data + buf->len)
- return false;
- size_t off = pos - buf->data;
- buffer_insert0(buf, off, input);
- if (vis->macro_operator)
- macro_append(vis->macro_operator, input);
- return true;
}
-const char *vis_keys_push(Vis *vis, const char *input) {
+void vis_keys_push(Vis *vis, const char *input) {
if (!input)
- return NULL;
-
+ return;
if (vis->recording)
macro_append(vis->recording, input);
if (vis->macro_operator)
macro_append(vis->macro_operator, input);
-
- if (!buffer_append0(&vis->input_queue, input)) {
- buffer_truncate(&vis->input_queue);
- return NULL;
- }
-
- return vis_keys_raw(vis, &vis->input_queue, input);
+ if (!buffer_append0(vis->keys, input))
+ buffer_truncate(vis->keys);
}
static const char *getkey(Vis *vis) {
@@ -941,7 +927,7 @@ int vis_run(Vis *vis, int argc, char *argv[]) {
const char *key;
while ((key = getkey(vis)))
- vis_keys_push(vis, key);
+ vis_keys_input(vis, key);
if (vis->mode->idle)
timeout = &idle;
@@ -997,12 +983,29 @@ bool vis_macro_recording(Vis *vis) {
}
static void macro_replay(Vis *vis, const Macro *macro) {
- Buffer buf;
+ Buffer buf, *input_queue = vis->keys;
buffer_init(&buf);
- buffer_put(&buf, macro->data, macro->len);
- buffer_append(&buf, "\0", 1);
- vis_keys_raw(vis, &buf, macro->data);
+ vis->keys = &buf;
+ for (char *key = macro->data, *next; key; key = next) {
+ char tmp;
+ next = (char*)vis_keys_next(vis, key);
+ if (next) {
+ tmp = *next;
+ *next = '\0';
+ }
+
+ if (vis->macro_operator)
+ macro_append(vis->macro_operator, key);
+ if (!buffer_append0(&buf, key))
+ buffer_truncate(&buf);
+ vis_keys_process(vis);
+
+ if (next)
+ *next = tmp;
+ }
+
buffer_release(&buf);
+ vis->keys = input_queue;
}
bool vis_macro_replay(Vis *vis, enum VisRegister id) {