vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit 1b638f8371f15a2503875959409037cf494667bb
parent 25c4b2feef1d822ed30ab5a4e18a462754a82578
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Tue, 11 Jul 2017 23:31:15 +0200

vis: handle further input after mark and register specifiers

This fixes #531 in a more robust way. The key handling functions
should be able to handle additional input passed to them as is
for example the case when processing the `gv` mapping.

Diffstat:
Mmain.c | 25+++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/main.c b/main.c @@ -1276,8 +1276,9 @@ static const char *macro_record(Vis *vis, const char *keys, const Arg *arg) { if (!vis_macro_record_stop(vis)) { if (!keys[0]) return NULL; - if (keys[1]) - return vis_keys_next(vis, keys); + const char *next = vis_keys_next(vis, keys); + if (next - keys > 1) + return next; enum VisRegister reg = vis_register_from(vis, keys[0]); vis_macro_record(vis, reg); keys++; @@ -1289,8 +1290,9 @@ static const char *macro_record(Vis *vis, const char *keys, const Arg *arg) { static const char *macro_replay(Vis *vis, const char *keys, const Arg *arg) { if (!keys[0]) return NULL; - if (keys[1]) - return vis_keys_next(vis, keys); + const char *next = vis_keys_next(vis, keys); + if (next - keys > 1) + return next; enum VisRegister reg = vis_register_from(vis, keys[0]); vis_macro_replay(vis, reg); return keys+1; @@ -1985,8 +1987,9 @@ static const char *selection_end(Vis *vis, const char *keys, const Arg *arg) { static const char *reg(Vis *vis, const char *keys, const Arg *arg) { if (!keys[0]) return NULL; - if (keys[1]) - return vis_keys_next(vis, keys); + const char *next = vis_keys_next(vis, keys); + if (next - keys > 1) + return next; enum VisRegister reg = vis_register_from(vis, keys[0]); vis_register(vis, reg); return keys+1; @@ -1995,8 +1998,9 @@ static const char *reg(Vis *vis, const char *keys, const Arg *arg) { static const char *mark(Vis *vis, const char *keys, const Arg *arg) { if (!keys[0]) return NULL; - if (keys[1]) - return vis_keys_next(vis, keys); + const char *next = vis_keys_next(vis, keys); + if (next - keys > 1) + return next; enum VisMark mark = vis_mark_from(vis, keys[0]); vis_mark(vis, mark); return keys+1; @@ -2061,8 +2065,9 @@ static const char *delete(Vis *vis, const char *keys, const Arg *arg) { static const char *insert_register(Vis *vis, const char *keys, const Arg *arg) { if (!keys[0]) return NULL; - if (keys[1]) - return vis_keys_next(vis, keys); + const char *next = vis_keys_next(vis, keys); + if (next - keys > 1) + return next; enum VisRegister reg = vis_register_from(vis, keys[0]); if (reg != VIS_REG_INVALID) { vis_register(vis, reg);