Applied both, thanks!
On Sun, Apr 28, 2019 at 10:10 AM Ron Yorston <[email protected]> wrote: > > The 'G' command was omitted from the list of commands that change or > delete whole lines. Add it in the appropriate places so the 'dG', > 'cG' and 'yG' commands work, including in cases where an explicit > line number has been supplied. > > function old new delta > find_range 534 596 +62 > .rodata 175166 175167 +1 > ------------------------------------------------------------------------------ > (add/remove: 0/0 grow/shrink: 2/0 up/down: 63/0) Total: 63 bytes > > Reported-by: David Kelly <[email protected]> > Signed-off-by: Ron Yorston <[email protected]> > --- > editors/vi.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > diff --git a/editors/vi.c b/editors/vi.c > index dfef42019..8af1ef76b 100644 > --- a/editors/vi.c > +++ b/editors/vi.c > @@ -3001,11 +3001,14 @@ static void do_cmd(int c); > static int find_range(char **start, char **stop, char c) > { > char *save_dot, *p, *q, *t; > - int cnt, multiline = 0; > + int cnt, multiline = 0, forward; > > save_dot = dot; > p = q = dot; > > + // will a 'G' command move forwards or backwards? > + forward = cmdcnt == 0 || cmdcnt > count_lines(text, dot); > + > if (strchr("cdy><", c)) { > // these cmds operate on whole lines > p = q = begin_line(p); > @@ -3029,13 +3032,13 @@ static int find_range(char **start, char **stop, char > c) > if (dot > text && *dot == '\n') > dot--; // stay off NL > q = dot; > - } else if (strchr("H-k{", c)) { > + } else if (strchr("H-k{", c) || (c == 'G' && !forward)) { > // these operate on multi-lines backwards > q = end_line(dot); // find NL > do_cmd(c); // execute movement cmd > dot_begin(); > p = dot; > - } else if (strchr("L+j}\r\n", c)) { > + } else if (strchr("L+j}\r\n", c) || (c == 'G' && forward)) { > // these operate on multi-lines forwards > p = begin_line(dot); > do_cmd(c); // execute movement cmd > @@ -3781,7 +3784,7 @@ static void do_cmd(int c) > } else if (strchr("^0bBeEft%$ lh\b\177", c1)) { > // partial line copy text into a register and delete > dot = yank_delete(p, q, ml, yf, ALLOW_UNDO); // > delete word > - } else if (strchr("cdykjHL+-{}\r\n", c1)) { > + } else if (strchr("cdykjGHL+-{}\r\n", c1)) { > // whole line copy text into a register and delete > dot = yank_delete(p, q, ml, yf, ALLOW_UNDO); // > delete lines > whole = 1; > -- > 2.20.1 > > _______________________________________________ > busybox mailing list > [email protected] > http://lists.busybox.net/mailman/listinfo/busybox _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
