diff options
Diffstat (limited to 'editors')
-rw-r--r-- | editors/vi.c | 11 |
1 files 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; |