[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: [PATCH 2/2] vi: enable 'dG' command. Closes 11801
From:       Denys Vlasenko <vda.linux () googlemail ! com>
Date:       2019-04-28 15:45:14
Message-ID: CAK1hOcNSp+XkQnczjEQ+HpYUDfj8ObbtpW1VFgYUt2DtP_=AEw () mail ! gmail ! com
[Download RAW message or body]

Applied both, thanks!

On Sun, Apr 28, 2019 at 10:10 AM Ron Yorston <rmy@pobox.com> 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 <david.kelly@liberica.ch>
> Signed-off-by: Ron Yorston <rmy@pobox.com>
> ---
>  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
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic