diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-07-03 23:48:10 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-07-04 00:06:14 +0200 |
| commit | 54ca598fcccff8844bfbe494cd3b325b2fea487f (patch) | |
| tree | 458bfebbc159dcc47ac7a0640753fb993b08d84a | |
| parent | 7f3d570cc23cf80163514013af2fc224eeff80c3 (diff) | |
| download | vis-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.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -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); |
