aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-07-03 23:48:10 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-07-04 00:06:14 +0200
commit54ca598fcccff8844bfbe494cd3b325b2fea487f (patch)
tree458bfebbc159dcc47ac7a0640753fb993b08d84a
parent7f3d570cc23cf80163514013af2fc224eeff80c3 (diff)
downloadvis-54ca598fcccff8844bfbe494cd3b325b2fea487f.tar.gz
vis-54ca598fcccff8844bfbe494cd3b325b2fea487f.tar.xz
vis: process aliased key sequences individually
While the complete alias is added to the input queue, the called key bindings should only see the keys they have asked for. Previously a mapping such as: :map! normal gv \"^Sv did not work as expected because the key binding for the register did reject an invalid multi letter register name. Might also influence #581
-rw-r--r--vis.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/vis.c b/vis.c
index e89fdf2..969a74d 100644
--- a/vis.c
+++ b/vis.c
@@ -1185,12 +1185,22 @@ static void vis_keys_process(Vis *vis, size_t pos) {
strcpy(vis->key_prev, vis->key_current);
strncpy(vis->key_current, start, len);
vis->key_current[len] = '\0';
- end = (char*)binding->action->func(vis, binding_end, &binding->action->arg);
+ char *params_end = binding_end;
+ while (params_end) {
+ tmp = *params_end;
+ *params_end = '\0';
+ end = (char*)binding->action->func(vis, binding_end, &binding->action->arg);
+ *params_end = tmp;
+ if (end) {
+ start = cur = end;
+ break;
+ }
+ params_end = (char*)vis_keys_next(vis, params_end);
+ }
if (!end) {
end = start;
break;
}
- start = cur = end;
} else if (binding->alias) {
buffer_remove(buf, start - buf->data, binding_end - start);
buffer_insert0(buf, start - buf->data, binding->alias);