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 <david.kelly@liberica.ch>
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/editors/vi.c b/editors/vi.c
index dfef420..8af1ef7 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -3001,11 +3001,14 @@
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 @@
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 @@
} 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;