From 7b93e317c13053e40e76cc5c36404f92d05dd41c Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Sun, 28 Apr 2019 09:10:16 +0100 Subject: [PATCH] vi: enable 'dG' command. Closes 11801 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 Signed-off-by: Ron Yorston Signed-off-by: Denys Vlasenko --- 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.25.1