vi: make put commands more like vi

Make the put commands 'p' and 'P' behave more like vi:

- allow a repetition count to be specified;

- when the text being inserted doesn't include a newline the cursor
  should be positioned at the end of the inserted text.

function                                             old     new   delta
do_cmd                                              4765    4842     +77
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 77/0)               Total: 77 bytes

v2: Don't break build when FEATURE_VI_UNDO is disabled.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2021-04-10 11:17:38 +01:00 committed by Denys Vlasenko
parent a54450248b
commit 951c6ded3a

View File

@ -3429,11 +3429,12 @@ static void do_cmd(int c)
break; break;
} }
// are we putting whole lines or strings // are we putting whole lines or strings
cnt = 0;
if (regtype[YDreg] == WHOLE) { if (regtype[YDreg] == WHOLE) {
if (c == 'P') { if (c == 'P') {
dot_begin(); // putting lines- Put above dot_begin(); // putting lines- Put above
} }
if (c == 'p') { else /* if ( c == 'p') */ {
// are we putting after very last line? // are we putting after very last line?
if (end_line(dot) == (end - 1)) { if (end_line(dot) == (end - 1)) {
dot = end; // force dot to end of text[] dot = end; // force dot to end of text[]
@ -3444,8 +3445,18 @@ static void do_cmd(int c)
} else { } else {
if (c == 'p') if (c == 'p')
dot_right(); // move to right, can move to NL dot_right(); // move to right, can move to NL
// how far to move cursor if register doesn't have a NL
if (strchr(p, '\n') == NULL)
cnt = (cmdcnt ?: 1) * strlen(p) - 1;
} }
string_insert(dot, p, ALLOW_UNDO); // insert the string do {
// dot is adjusted if text[] is reallocated so we don't have to
string_insert(dot, p, allow_undo); // insert the string
# if ENABLE_FEATURE_VI_UNDO
allow_undo = ALLOW_UNDO_CHAIN;
# endif
} while (--cmdcnt > 0);
dot += cnt;
end_cmd_q(); // stop adding to q end_cmd_q(); // stop adding to q
break; break;
case 'U': // U- Undo; replace current line with original version case 'U': // U- Undo; replace current line with original version